当前位置: 首页 > news >正文

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

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

【免费下载链接】BlobRunnerQuickly debug shellcode extracted during malware analysis项目地址: https://gitcode.com/gh_mirrors/bl/BlobRunner

BlobRunner 是一款专为恶意软件分析设计的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)负责"搬家":

  1. fopen+fread把整个 shellcode 文件读进缓冲区
  2. 调用VirtualAlloc(NULL, fileLen, 0x3000, 0x40)分配内存
    • 0x3000= MEM_RESERVE | MEM_COMMIT(预留并提交)
    • 0x40= PAGE_EXECUTE_READWRITE,即RWX——可读、可写、可执行
  3. 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 起点(基址 + offset)
  • 0x4:CREATE_SUSPENDED 标志——线程创建后处于挂起状态,尚未执行
  • 返回线程标识与句柄,供后续恢复

这样做一举三得:

  1. 天然的断点位置:线程入口已停在 shellcode 第一条指令上,调试器只需在线程恢复前下断点,即可在精确位置接管
  2. 独立线程栈:系统为新线程分配默认栈空间,shellcode 的push/call不会污染主线程栈
  3. 恢复控制权在调试器手里ResumeThread(blobrunner.c)执行之前,一切都静止

这一改动在 changelog.txt 的 0.0.2 版本记录中也有明确体现:"Added support for x64 debugging by using CreateThread and ResumeThread"。

实操:跑通一次 BlobRunner x64 shellcode 调试

  1. 用调试器(如 x64dbg)打开blobrunner64.exe,命令行参数传入 shellcode 文件
  2. 程序执行到getchar()暂停,提示"Navigate to the Thread Entry and set a breakpoint"
  3. 切到该线程视图,在线程入口设置断点
  4. 按任意键 → 线程被ResumeThread恢复 → 命中断点,开始单步调试 shellcode

--jit 参数:用一次 AccessViolation 触发 JIT 调试器

不想常驻调试器?加上--jit(blobrunner.c):

VirtualProtect(shell_entry, 1, PAGE_READWRITE, &oldp);

只把第一个字节的执行权限去掉。线程恢复后一执行就抛出0xC0000005(AccessViolation),Windows 会立刻拉起你预先配置的 JIT 调试器;接管后把执行权限补回来(如setpagerights <region>, ExecuteReadWrite)即可继续。

⚠️ 注意:--jit会强制启用--nopause,请确保 JIT 调试器已配置好,否则程序会直接崩溃退出。

BlobRunner x64 构建:最快编译步骤

  1. 获取源码:
git clone https://gitcode.com/gh_mirrors/bl/BlobRunner
  1. 打开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),仅供参考

http://www.cnnetsun.cn/news/4226788.html

相关文章:

  • 记录C++ 11
  • 57-基于深度学习的农作物虫害检测识别系统(yolo26、yolo12、yolo11、yolov8、yolov5+UI界面+Python项目源码+模型+标注好的数据集)2027毕业版
  • OpenCV ncnn 人脸识别(一)
  • 如何部署AI模型到边缘端:keras_cv_attention_models TFLite转换完整指南(含3大常见坑)
  • 如何在org-trello中选择正确的同步方向?卡片级与缓冲区级同步完整指南
  • SAP UI5 里有没有 RxJS exhaustMap,答案不在某个 Operator,而在异步任务的并发控制方式
  • 从 clone 到登录:三十分钟用 Docker 部署 AzerothCore 魔兽世界私有服
  • C# Winform - SQL Server 2012 数据库放服务器,通过TCP连接访问
  • 如何用Dagger 2在Kotlin Android应用中实现依赖注入:基于PhotoAffix的完整教程
  • fb_graph认证全解析:Cookie解析与Signed Request的HMAC-SHA256验证原理指南
  • 为什么 Ornith-1.5-397B 效果忽好忽坏?temperature、top_p、top_k 采样参数调优完整指南
  • 5分钟上手psr/clock:从composer安装到第一个now()调用的快速教程
  • IntelliJ IDEA + phpStudy + ApiPost断点调试
  • 部署 FN-DSA 前:你必须了解的风险与权衡
  • 2026实测!梦琪科技拨号VPS排行,这3款性价比封神
  • 多模态模型也能当纯文本 LLM:InternVL3-2B-hf 无图文本生成快速入门
  • 公司电脑权限怎么管理?从账号、文件到软件,一套权限管理思路讲清楚
  • Status 拆解:19 天百万用户的 AI 社交模拟器如何炼成
  • Video2X AI 视频放大与补帧完整入门指南:从 480p 到 4K 成片
  • 华为MetaERP # EBS → Fusion BC 预算模块【业务规则对齐实施指南】定位:迁移蓝图「业务规则映射章节」标准内容,承接主数据映射、余额迁移、预算校验逻辑迁移。> > 核心结
  • PDF补丁丁:一个免费的PDF工具箱,搞定书签、合并、提图等8类编辑任务
  • 如何在React Native中使用react-timer-hook?移动App倒计时与秒表组件跨平台实战教程
  • 自己设计一道数独:LibreSudoku自定义出题功能完整流程演示
  • 基于SpringBoot的网购优选服务系统设计网站(源码+lw+部署文档+讲解等)
  • 反向工程nest-router源码:forRoutes背后的MODULE_PATH元数据魔法
  • 基于SpringBoot的甜品店在线点餐及预约系统毕业设计项目源码文档
  • 创维SK-L1002灵犀屏深度优化指南:免刷机安装第三方桌面,秒变流畅安卓机顶盒|手机一键操作|纯技术教程
  • ip-location-zh 完全指南:PHP 如何 3 分钟搞定无需数据库的 IP 地理位置查询?
  • MinIO 停止维护怎么办?Docker 迁移 RustFS 实战:数据零丢失
  • LX Music 桌面版:免费音乐聚合播放器完整指南