RESX 开源:Windows 二进制逆向六件套,动态 API 去混淆、调用图还原、驱动 IOCTL 审计

导语:Windows 逆向的老规矩是开 IDA 一格格啃,RESX 想把它改成”读协议”:藏起来的动态 API 给你还原,驱动里的 IOCTL 码表给你列成表,连句柄 ACL 都替你试一遍。

RESX 项目卡片(图源:KitPloit)

一、先说清楚这是什么

RESX 是 Rust 写的 Windows 二进制逆向与静态分析工具箱,作者 Ryftenius,MIT 协议,仓库今年 3 月才建,最新 v2.2.1 版是 11 月 16 日刚发的。星标数目前只有 12 个,但更新的密度相当能打。

它最不一样的地方写在文档第一句:RESX 只读文件字节和可选的符号数据,从不加载、更不会执行被分析的镜像。对付来源不明的样本,这是刚需——分析机不是提款机。

二、六块硬功夫

API 调用图加参数还原。 resx calls 递归展开 API 调用树,加 --args 能把参数名和值直接打出来:VirtualAlloc 的 flProtect = PAGE_NOACCESS、BCryptOpenAlgorithmProvider 的 pszAlgId = L"SHA256",一眼就知道这程序在干嘛。前提是配置一次 Windows SDK 的头文件目录:resx config --headers 。

动态 API 去混淆。 这是最值钱的一块。PEB loader list 遍历、手工导出表解析、API hashing(ror13-add、djb2、sdbm、FNV、CRC-32、Jenkins 全都认)、栈上拼字符串、XOR 与滚动 XOR 解码——平时要磨半小时的活,它直接给你 API 名字、隐藏手法和调用点。resx behavior 还会给手法分级:普通 loader 解析算低危,栈字符串中等,API hashing 和 PEB 遍历直接标高危。

从用户态钻到内核。 resx locate VirtualAlloc 能一路跟到 ntoskrnl 里的 MiAllocateVirtualMemory;dump ntdll 的 NtAllocateVirtualMemory 还会标出 syscall 服务号。内核这条线,红队蓝队都省事。

RESX 的 VS Code 二进制查看器 Overview 视图(图源:RESX 官方仓库)

驱动 IOCTL 与设备安全。 resx driver / resx ioctl 静态还原驱动分发表、IOCTL 码、读写方法位、输入输出长度校验,以及失败路径返回的 NTSTATUS。配上 --device-security 还能读设备对象的 SDDL/DACL,并用非提权 token 试探能不能把句柄打开。

启动流与线程回调重建。 从入口点、TLS 回调、CreateThread 回调一路还原到 worker 线程到底在干什么——找到 CreateThread 只是起点,这个工具负责把回调背后的代码也摊开给你看。

版本对比与样本狩猎。 diff 比两个 DLL 的规范化函数与控制流结构,index 建一份语料库索引,hunt 拿新样本去库里找同源兄弟。

外加:VS Code 二进制查看器扩展(12 个标签页)、C ABI 的 DLL/FFI 集成、YARA 兼容扫描、全量 JSON 输出。

RESX 反汇编视图,可直接跳转到内核符号(图源:RESX 官方仓库)

三、紫队视角:这工具改变了什么

红队这边,脱壳和动态解析从手活变成了流水线。自己写的样本自己也能脱干净,交付节奏直接翻倍。

蓝队这边才是真的爽。蓝队最怕的不是恶毒的 EXE,而是机器上装了个自己从没见过、说不清干什么的 .sys。RESX 的 ioctl 能把藏起来的 IOCTL 码表、长度校验、失败码全列出来,device-security 还能告出普通用户的句柄到底开不开得了——这是 EDR 视野之外的”驱动白”。

紫队的落点在于:IOCTL 码、输入长度、返回状态码,本质上是攻防双方共享的一门协议语言。红队拿它写利用,蓝队拿它写检测规则。RESX 的 contracts 命令就是这个思路的机器化——把”API 参数和它的生产者关系”固化成一份可机读的契约表,双方对账用同一份数据,不用再靠截图和口头对齐。

ntdll syscall stub 还原,服务号与内核实现一一对应(图源:RESX 官方仓库)

但有句实话必须放在这儿:--device-security 是真的去打开设备句柄,会触发驱动的 create/close 路径,不是纯被动读取;静态分析也只能证明”代码具备什么能力”,不代表它真的发生过。

四、下载与上手

官方 v2.2.1 的发布页直接给了预编译包和 VS Code 扩展,都带 SHA-256 校验文件:

文件大小SHA-256(前 16 位)
resx-2.2.1-publish.zip9.6 MBb5124c0f1a4e911b
resx-vscode-2.2.1.vsix3.2 MB194a4cc8f4cf6fea
源码 main.zip—见仓库

下载地址:

  • 工具包:https://github.com/Ryftenius/RESX/releases/download/v2.2.1/resx-2.2.1-publish.zip
  • 校验文件:https://github.com/Ryftenius/RESX/releases/download/v2.2.1/resx-2.2.1-publish.zip.sha256
  • VS Code 扩展:https://github.com/Ryftenius/RESX/releases/download/v2.2.1/resx-vscode-2.2.1.vsix
  • 源码包:https://github.com/Ryftenius/RESX/archive/refs/heads/main.zip
  • 仓库主页:https://github.com/Ryftenius/RESX

publish.zip 解压后是 cli/resx.exe(7.3 MB)、cli/resx.dll 和 vscode/resx-vscode-2.2.1.vsix 三件套,exe 的 SHA-256 是 f5160d99793817d8。

上手三步:解压后跑 resx.exe help 看命令;想要参数名,先 resx config --headers "C:Program Files (x86)Windows Kits10Include",再 resx calls xxx.exe entry --depth 4 --only winapi --args;分析驱动就 resx ioctl driver.sys --verbose --json。

环境上,预编译包是 Windows x64 直接可跑;想自己编译需要 Rust 1.98.1,仓库的 rust-toolchain.toml 已经锁死了版本和 x86_64-pc-windows-msvc 目标。签名方面,v2.2.1 的发布说明写明二进制带 Authenticode 签名(CN=RYFTENIUS),摘要采用 SHA-256 加 RFC 3161 时间戳;VS Code 扩展侧还有 trust.json 校验,默认只跑自带那份分析器,想换可执行文件得手动开 resx.allowCustomExecutable。

五、写在最后

作者手上还有另一个工具 SKUGGA(轻量进程插桩框架),推荐的打法是静态动态对账:RESX 先静态定位,SKUGGA 再跑一遍看参数和调用栈,两边对上号才算数。

RESX 目前还是早期项目——12 个星标,文档在快速迭代,README 里也很坦诚地列了边界:SDK 头文件预处理和浮点参数还原不支持;静态名字匹配不能证明加载的就是这个驱动;相似度分数只代表”先看这个”,不代表是同一个二进制。这种态度放在安全工具里反而是加分的。

最后照例提醒一句:工具本身是 MIT 开源的静态分析器,不含任何恶意功能,但逆向和驱动分析天然是双用途能力,请只在授权环境里使用。

版权声明:本文由华盟网原创发布,保留所有权利。文中截图来自 RESX 项目仓库及 KitPloit 项目卡片,配图由华盟网整理并授权使用。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容