ARTICLE DETAIL

资讯详情

深耕网站视觉设计与运营推广的一线实战洞察。

P-Code模拟执行实战:用Ghidra MCP毫秒级暴力破解API哈希的原理与用法

P-Code模拟执行实战:用Ghidra MCP毫秒级暴力破解API哈希的原理与用法 P-Code模拟执行实战用Ghidra MCP毫秒级暴力破解API哈希的原理与用法【免费下载链接】ghidra-mcpGhidra MCP Server — 200 MCP tools for AI-powered reverse engineering. GUI plugin headless server, lazy tool loading, convention enforcement, batch operations, Ghidra Server integration, and Docker deployment.项目地址: https://gitcode.com/gh_mirrors/ghi/ghidra-mcpGhidra MCP Server是一个面向 AI 驱动的逆向工程开源项目提供 253 个 MCP 工具覆盖反编译、重命名、类型标注、批量操作等完整工作流。其中最杀手级的能力之一就是基于 GhidraP-Code 模拟执行的动态分析不启动进程、不依赖调试器直接在 P-Code 层面隔离运行目标函数几毫秒内就能把 ROR13、CRC32、djb2 等API 哈希从候选列表中暴力破解出来。一、什么是 P-Code 模拟执行为什么它能毫秒级破解 API 哈希传统上破解哈希化的 API 名称只有两条路方案痛点写脚本在本地重放哈希算法需要先看懂算法源码还要自己写枚举脚本上调试器断点单步环境依赖重、速度慢PE 还要处理 ASLR而 Ghidra 内部的EmulatorHelper提供了一个第三条路把函数翻译成 P-Code与架构无关的中间表示后在沙箱中逐步执行。这意味着✅ 无需真实进程无需系统调用纯计算函数跑得飞快✅ 内存是隔离 overlay绝不会碰坏你的 Ghidra 工程数据✅ 输入完全可控想传什么寄存器值、什么字符串都是你说了算✅ 对 AI Agent 友好——一次 MCP 调用即可完成整个暴力匹配循环简单说你把哈希函数关进笼子里往里面喂候选 API 名字笼子会吐出来每个名字对应的哈希值自动和目标值比对。该能力自v5.4.0起随 P-Code 模拟执行域一起落地实现在 EmulationService.java并附有离线验证测试 EmulationServiceValidationTest.java。二、两个核心工具emulate_function与emulate_hash_batchGhidra MCP 暴露了emulation工具组下的两个端点完整参数定义见 endpoints.json1.emulate_function—— 单函数受控执行给一个函数地址 初始寄存器/内存跑完返回最终寄存器状态。适合理解哈希函数、CRC/校验和、位打包等纯计算代码。关键参数作用address被模拟函数入口地址registers初始寄存器如{ECX: 0x7FFE0000}字符串指针memory预填内存区支持string/hex/ base64 三种形式max_steps步数上限默认 10000硬顶 100000防止死循环挂死read_memory_after模拟结束后从模拟器内存读回结果比如函数就地改写了字符串运行环境是全自动搭好的栈顶设在0x7FFF0000栈上预写0xDEADBEEF返回哨兵——函数一旦执行到RET就干净停止返回hit_return: true。2.emulate_hash_batch—— 批量暴力破解 API 哈希 ⚡这才是本文的主角。一次调用即可把整个候选列表喂给哈希函数循环模拟自动比对目标哈希emulate_hash_batch( hash_function_address 0x6FAB1234, string_register ECX, result_register EAX, target_hash 0x7C0DFCAA, candidates [CreateProcessW, VirtualAlloc, LoadLibraryA, ...] ) → { tested: 42, matches: [{api_name: CreateProcessW, computed_hash: 0x7C0DFCAA}], resolved: true, best_match: CreateProcessW }工程细节决定了它的可靠性和速度每个候选字符串写入0x7FFE0000的独立沙箱 scratch 区64KB互不污染单候选模拟通常只需几十到几百步 P-Code整个列表跑完通常在毫秒~百毫秒级候选列表上限10,000 个足以覆盖整个 Win32 API 全集wide_stringtrue支持 UTF-16LE 宽字符专门对付CreateProcessW这类 Unicode API 的哈希碰撞安全不只返回第一个匹配matches数组会列出所有产生相同哈希的名字避免误判三、实战三步破解一个哈希化的 API 调用下面是一条完整工作流源自官方工具指南 TOOL_USAGE_GUIDE.md 的 Dynamic Analysis 章节第 1 步定位哈希函数用search_byte_patterns、detect_crypto_constants或search_functions找到计算哈希的函数。常见特征循环右移/异或指令序列ROR13 标志性的ROR EDI, 13XOR、以字符串为入参且返回 32 位值。第 2 步确认输入/输出寄存器decompile_function(hash_func_addr)看调用约定get_function_variables(hash_func)确认哪个寄存器装字符串指针、哪个寄存器出结果拿不准时用analyze_dataflow(address, variable, directionforward)沿 P-Code 数据流追踪——从字符串参数正向追踪还能顺便找到所有调用点帮你反推候选 API 列表应该来自哪个 DLL第 3 步一键暴力匹配按疑似来源 DLLkernel32、ntdll、user32……准备候选列表调用emulate_hash_batch把调用点上的目标哈希填进target_hash。拿到best_match后用batch_set_comments把解析结果写回 Ghidra注释即文档。 官方在真实样本D2Common.dll上验证过一个两指令的叶子函数MOV EAX, [ECX4]; RET可以完整往返模拟emulate_hash_batch也能从 3 个候选中精确隔离出唯一匹配项。四、进阶提示与常见坑宽字符 API 别忘wide_stringtrueWindows 下*W系列 API 按 UTF-16LE 编码哈希用默认 ASCII 模式一个都匹配不上。多个匹配时看全matches32 位哈希必然存在碰撞best_match只是迭代顺序的第一个务必人工确认。hit_return: false的含义函数没执行到RET就达到步数上限——可能是死循环也可能函数路径依赖了模拟环境没有的外部状态此时应调大max_steps或检查调用约定假设。懒加载下先加载工具组默认桥接只加载listing,function,program三个组emulation组需要 Agent 用load_tool_group(emulation)按需加载这是项目 253 个工具不撑爆上下文的关键设计。模拟 ≠ 动态调试模拟适合纯计算路径涉及系统调用、真实内存布局的函数请搭配项目的调试器工具族debugger_*做最终确认——官方推荐工作流就是模拟出结果 → 断点验证进程真的调用了该 API。五、相关源码与资料索引 资料路径模拟执行核心实现EmulationService.java工具用法指南含两工具完整参数TOOL_USAGE_GUIDE.md离线验证测试EmulationServiceValidationTest.java端点契约定义endpoints.jsonv5.4.0 版本发布记录CHANGELOG.md快速上手与安装README.md小结Ghidra MCP 的 P-Code 模拟执行把读算法 → 写脚本 → 跑枚举三件事压缩成了一次emulate_hash_batch调用。对于被哈希遮蔽的 API 解析场景它把过去需要数十分钟甚至数小时的静态动态分析缩短到了毫秒级——这正是AI 驱动逆向工程最落地的样板之一。【免费下载链接】ghidra-mcpGhidra MCP Server — 200 MCP tools for AI-powered reverse engineering. GUI plugin headless server, lazy tool loading, convention enforcement, batch operations, Ghidra Server integration, and Docker deployment.项目地址: https://gitcode.com/gh_mirrors/ghi/ghidra-mcp创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表