0xd00 随笔小记

Back

使用 C 和 WinINet 编写分段式 Shellcode 加载器Blur image

一体式载荷(stageless payload)#

我之前文章中编写的例子都是属于一体式载荷。载荷的所有功能代码(例如完整的Meterpreter或Cobalt Strike Beacon)被打包在一个单独的文件或Shellcode中一次性发送给目标。相对来说体积更大,因为包含了完整的功能,很容易被静态查杀。

分段式载荷(staged payload)#

将载荷拆为两部分。

第一阶段(stage 0/stager):通常体积很小很精简,唯一的功能就是从远端加载二阶段载荷。

第二阶段(stage 1):包含实际功能的的代码片段。

第一阶段的载荷因为体积小,也不包含恶意API,相对较容易绕过静态查杀。因为体积小也更容易适用于多种内存受限的场合,如缓冲区溢出。

实现分段式载荷#

准备工作#

# 生成一个64位的计算器Shellcode,并保存为原始二进制文件
msfvenom -p windows/x64/exec CMD=calc.exe -a x64 -f raw -o calc.bin EXITFUNC=thread
# 在存放calc.bin的目录下执行
python -m http.server 8000
shell

理解实现原理#

关键API#

  • InternetOpenW - 初始化 WinINet 库,获取一个会话句柄,这是所有网络操作的起点。
  • InternetOpenUrlW - 打开指定的 URL,并返回一个可以用于读取远程资源的句柄。
  • HttpQueryInfoW - 查询 HTTP 响应头信息。我们将用它来获取载荷的实际大小(Content-Length),以精确地分配内存。
  • InternetReadFile - 从 InternetOpenUrlW 返回的句柄中读取数据,也就是下载我们的 Payload。
  • InternetCloseHandle - 任务完成后,释放所有打开的 WinINet 句柄。

动手实现#

执行效果如下

image-20250725152146715

使用 C 和 WinINet 编写分段式 Shellcode 加载器
https://blog.0xd00.com/blog/windows-staged-payload-loader
Author 0xd00
Published at 2025年7月25日
Comment seems to stuck. Try to refresh?✨