尧图建网站 尧图建网站 YAOTU WEB BUILD 免费咨询
ARTICLE DETAIL

资讯详情

深耕网站建设与建站编程的一线实战洞察。

BlobRunner x64实现深度剖析:内联汇编为何失效,挂起线程如何救场

BlobRunner x64实现深度剖析:内联汇编为何失效,挂起线程如何救场 BlobRunner x64实现深度剖析内联汇编为何失效挂起线程如何救场【免费下载链接】BlobRunnerQuickly debug shellcode extracted during malware analysis项目地址: https://gitcode.com/gh_mirrors/bl/BlobRunnerBlobRunner 是一款专为恶意软件分析设计的shellcode 调试工具把提取出的 shellcode 载入一块可执行内存再跳进去单步调试。x86 版本只需一行内联汇编完成跳转但x64 编译器不支持内联汇编——BlobRunner 改用挂起线程suspended thread方案巧妙救场。下面结合源码 blobrunner.c 拆解它的实现思路。BlobRunner 是什么shellcode 快速调试上手在恶意软件分析中你经常需要从内存 dump 或样本里提取一段 shellcode再搞清楚它到底做了什么。手动把字节数组塞进调试器脚本很繁琐而 BlobRunner 把这件事压缩成一条命令BlobRunner.exe shellcode.bin它的工作流只有三步读取文件 → 分配内存并复制数据 → 跳入内存起点。常用参数见 README.md--offset 0x0100跳入指定偏移而不是起点--nopause跳转前不暂停危险请先下好断点--jit触发系统配置的 JIT 调试器第一步为 shellcode 准备一块 RWX 内存process_file()blobrunner.c负责搬家fopenfread把整个 shellcode 文件读进缓冲区调用VirtualAlloc(NULL, fileLen, 0x3000, 0x40)分配内存0x3000 MEM_RESERVE | MEM_COMMIT预留并提交0x40 PAGE_EXECUTE_READWRITE即RWX——可读、可写、可执行CopyMemory把数据拷入新地址返回基址 关键点内存一开始就带执行权限shellcode 落进去就能跑无需二次修改权限。x86 老方案一行内联汇编直接跳32 位实现非常朴素execute()末尾就一句blobrunner.c__asm jmp shell_entry;shell_entry就是基址 offset。主线程直接跳进 shellcode调试器只需在跳转前下断点或借助getchar()暂停即可接管。简单、直接、零依赖——但这条路在 x64 上走不通。为什么 x64 下内联汇编会失效微软 C/C 编译器MSVC的x64 工具链不支持__asm内联汇编该特性只保留在 32 位x86目标上。原因是 x64 ABI 的寄存器分配与栈模型更复杂内联汇编被从 64 位模式中移除汇编只能写在独立的.asm文件里配合 MASM 编译。于是同样的跳进 shellcode需求在 x64 版本必须换一种写法。救场方案CreateThread 挂起线程x64 分支blobrunner.c的思路不自己跳而是让系统新开一个线程去执行 shellcode并且创建时先把它挂起。thread_handle CreateThread(NULL, 0, shell_entry, NULL, 0x4, thread_id);逐参数拆解shell_entry新线程入口点即 shellcode 起点基址 offset0x4CREATE_SUSPENDED 标志——线程创建后处于挂起状态尚未执行返回线程标识与句柄供后续恢复这样做一举三得天然的断点位置线程入口已停在 shellcode 第一条指令上调试器只需在线程恢复前下断点即可在精确位置接管独立线程栈系统为新线程分配默认栈空间shellcode 的push/call不会污染主线程栈恢复控制权在调试器手里ResumeThreadblobrunner.c执行之前一切都静止这一改动在 changelog.txt 的 0.0.2 版本记录中也有明确体现Added support for x64 debugging by using CreateThread and ResumeThread。实操跑通一次 BlobRunner x64 shellcode 调试用调试器如 x64dbg打开blobrunner64.exe命令行参数传入 shellcode 文件程序执行到getchar()暂停提示Navigate to the Thread Entry and set a breakpoint切到该线程视图在线程入口设置断点按任意键 → 线程被ResumeThread恢复 → 命中断点开始单步调试 shellcode--jit 参数用一次 AccessViolation 触发 JIT 调试器不想常驻调试器加上--jitblobrunner.cVirtualProtect(shell_entry, 1, PAGE_READWRITE, oldp);只把第一个字节的执行权限去掉。线程恢复后一执行就抛出0xC0000005AccessViolationWindows 会立刻拉起你预先配置的 JIT 调试器接管后把执行权限补回来如setpagerights region, ExecuteReadWrite即可继续。⚠️ 注意--jit会强制启用--nopause请确保 JIT 调试器已配置好否则程序会直接崩溃退出。BlobRunner x64 构建最快编译步骤获取源码git clone https://gitcode.com/gh_mirrors/bl/BlobRunner打开x64 Native Tools Command Prompt进入项目目录cl /Feblobrunner64.exe /Foblobrunner64.out blobrunner.c产物blobrunner64.exe即可用于 x64 shellcode 调试完整构建说明见 README.md。小结对比项x86 版本x64 版本跳转方式__asm jmp内联汇编CreateThread 挂起线程暂停机制跳转前断点 / getchar线程创建即挂起ResumeThread 前接管栈环境主线程栈独立线程栈一句话总结内联汇编在 x64 失效是编译器层面的限制而挂起线程把跳转前暂停变成了线程尚未起跑调试窗口因此自然出现。【免费下载链接】BlobRunnerQuickly debug shellcode extracted during malware analysis项目地址: https://gitcode.com/gh_mirrors/bl/BlobRunner创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表