拓冰建站拓冰建站
首页 / 资讯中心 / 正文

Pwndbg 反编译器集成实战指南:让 GDB/LLDB 直接读懂 IDA、Binary Ninja、Ghidra 与 angr 的伪代码

Pwndbg 反编译器集成实战指南让 GDB/LLDB 直接读懂 IDA、Binary Ninja、Ghidra 与 angr 的伪代码【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbgPwndbg 提供了与 IDA、Binary Ninja、Ghidra 和 angr-management 四款主流反编译器的深度集成在 GDB 与 LLDB 两种调试器下均可使用。读完本文你将掌握如何一键安装反编译器插件、建立调试器与反编译器之间的连接、在 Pwndbg 中直接查看当前函数伪代码decomp/上下文窗口并将反编译器解析出的函数符号与局部变量同步进调试器实现汇编级单步 伪代码级阅读的混合逆向工作流。集成原理decomp2dbg 插件 XML-RPCPwndbg 的反编译器集成建立在开源项目 decomp2dbgdecompiler-to-debugger之上职责划分非常清晰反编译器侧逻辑全部由 decomp2dbg 的插件完成插件内嵌在 IDA、Binary Ninja、Ghidra、angr-management 中负责从反编译器提取伪代码、符号、函数局部变量等信息并对外提供 XML-RPC 服务调试器侧逻辑全部由 Pwndbg 完成Pwndbg 作为 XML-RPC 客户端连接插件服务将拿到的数据转换成调试器能理解的形式。对应实现位于 pwndbg/dintegration/init.py其模块头注释明确说明其遵循 decomp2dbg 官方server_template.py定义的 API 与插件通信。一个值得注意的实现细节是XML-RPC 无法传输 64 位整数上限为 32 位因此 Pwndbg 在传输地址时会先做 rebase重定位把反编译器报告的文件偏移映射到进程地址空间中的真实地址后再下发这也是di sync、di list中所有地址均显示为真实内存地址的原因。由于反编译器侧必须以插件形式运行你需要具备相应反编译器的插件支持能力IDA 与 Binary Ninja 的免费版本不支持插件因此本功能要求你持有这两款产品的授权LicenseGhidra 与 angr-management 则无此限制。环境前提已安装 PwndbgGDB 或 LLDB 环境均可安装了 IDA / Binary Ninja / Ghidra / angr-management 中任意一款Pwndbg 需要能解析到对应版本的decomp2dbgPython 包。Pwndbg 会在内部记录其要求的 decomp2dbg 版本号当前为3.14.0定义在 pwndbg/commands/decompiler_integration.py连接与安装前都会做版本校验。第一步安装反编译器插件di install在 Pwndbg 内部执行以下命令即可完成对应反编译器插件的安装di install ida|binja|ghidra|angr例如安装 IDA 插件di install ida。更详细的说明见di install --help。安装机制与注意事项请勿手动安装 decomp2dbgPwndbg 需要将 decomp2dbg 固定到它验证过的版本并负责建立符号链接。如果你此前已经装过 decomp2dbgdi install会干净地覆盖它安装完成后你依然可以在 Pwndbg 之外独立使用 decomp2dbg。以符号链接symlink方式安装从源码看install_generic_plugin()pwndbg/commands/decompiler_integration.py会把 decomp2dbg 包内的插件目录/文件与反编译器插件目录之间建立符号链接这意味着当 decomp2dbg Python 包更新时反编译器插件会被自动更新。但反过来说如果你移动了 Pwndbg 的安装目录符号链接会失效需要重新执行di install。各反编译器插件的默认安装位置由三个配置项控制均可通过set命令修改配置项默认安装路径说明decompiler-ida-plugin-path~/.idapro/pluginsIDA 插件目录decompiler-binja-plugin-path~/.binaryninja/pluginsBinary Ninja 插件目录decompiler-angr-plugin-path~/.local/share/angr-management/pluginsangr-management 插件目录若想自定义安装位置可执行set decompiler-ida-plugin-path /new/path等命令建议同时写入~/.gdbinit以便持久生效。Ghidra 的特殊安装流程Ghidra 插件用 Java 编写decomp2dbg 的 Python 包内不附带编译好的插件因此di install ghidra会从 decomp2dbg 的 GitHub Release 下载预编译的d2d-ghidra-plugin.zip下载 URL 按当前要求版本拼接见 install_ghidra_plugin()随后还需要手动完成以下步骤打开 Ghidra在 Project Management 窗口点击File Install Extensions 右上角安装该扩展重启 Ghidra在工程中通过File Configure启用 decomp2dbg decompiler server之后照常用CtrlShiftD启动服务。需要特别留意由于 Ghidra 插件不在 Python 包内、没有符号链接机制它不会被自动更新。Pwndbg 会把要求的版本号写入缓存目录d2d/ghidra_plugin_version下次di connect时如果检测到版本不一致会提示你重新执行di install ghidra。第二步启动反编译器服务并建立连接打开你的反编译器按下CtrlShiftD并点击OK即可启动 decomp2dbg 插件的 XML-RPC 服务器Ghidra 需要先完成上文的手动启用步骤回到 Pwndbg执行di connectdi connect会连接decompiler-host与decompiler-port指定的服务端点默认localhost:3662。如果此时调试进程已存活Pwndbg 会顺带自动执行一次di sync如果进程尚未启动则需在启动调试进程后手动执行di sync把反编译器中的符号信息同步进调试器。连接远程反编译器decompiler-host默认localhost与decompiler-port默认3662是两个独立配置项因此你也可以连接运行在其他机器上的反编译器把decompiler-host设为目标机器地址即可。从源码看远程连接时 Pwndbg 会额外提醒对方机器上插件的版本必须与当前要求的 decomp2dbg 版本一致di connect的输出中会明确打印要求的版本号若远程机器是 Windows则不支持通过di install安装插件需要在那边独立安装对应版本的 decomp2dbg。命令速查decompiler-integration别名 di在 Pwndbg 内执行decompiler-integration --help可查看全部相关命令config decompiler可查看全部相关配置。完整命令定义与参数解析位于 pwndbg/commands/decompiler_integration.py自动生成的命令行文档见 docs/commands/integrations/decompiler-integration.md。命令别名功能说明di connectc连接到反编译器进程存活时自动附带同步di disconnectd断开与反编译器的连接di syncs从反编译器同步数据符号 当前函数局部变量di jump [addr]j让反编译器光标跳转到指定地址默认 PC要求进程存活di install ida\|binja\|ghidra\|angr-安装/更新对应反编译器插件di decomp-等价于直接使用decomp命令di list [-a]l列出当前栈帧的函数局部变量-a/--all列出当前线程所有栈帧的变量di setbase addr-手动指定反编译二进制在地址空间中的基址di setpath path-手动指定反编译二进制在内存中的加载路径di sync符号与局部变量分两条链路同步di sync内部实际做两件事见 sync()符号同步update_symbols同步函数与全局变量。同步的符号会应用到调试器之后你可以直接使用print decompile_func_name这样的形式访问反编译器命名/解析出的函数。注意LLDB 目前不支持符号同步会打印 LLDB does not support syncing symbols若提示找不到二进制BINARY_NOT_LOADED可参考di setpath --help或di setbase --help手动指定函数局部变量同步update_function_variables同步当前函数的局部变量与参数。这些变量会被注册为便利变量convenience variables之后可用print $decompiled_var_name直接读取GDB 下局部变量支持基本类型因此通常可以直接print *$decompiled_var_name得到正确结果LLDB 中它们始终是void*。若当前没有栈帧会提示 No variables synced for the current function (no stack frame found)。符号同步可能开销较大所以默认不自动执行局部变量同步则默认自动执行见下文配置节。di list按栈帧查看反编译器解析出的变量di list会展示当前栈帧中反编译器解析出的寄存器变量与栈变量包括名称、类型、寄存器/地址、相对sp与栈帧顶部的偏移等信息di list --all则沿当前线程的调用栈逐帧列出实现见 list_all_frames()。需要注意函数序言prologue栈指针调整之前阶段该输出可能不准确这里的帧通常指保存返回地址的位置。di setbase / di setpath手动修正二进制定位正常情况下Pwndbg 会用反编译器报告的二进制文件路径与进程所有内存映射vmmap逐一比对自动找到二进制基址见 DecompilerConnection._find_binary_addr() 附近实现。但当文件名不一致、或二进制未出现在内存映射中时调试内核模块kernel module时尤其常见自动检测会失效此时di setbase addr手动指定二进制在地址空间中的基址设为-1或重启 Pwndbg恢复自动检测di setpath path手动指定二进制在内存中的加载路径即vmmap//proc/pid/maps中显示的那个路径设为恢复自动检测。两者互斥设置其中一个会自动清除另一个且设置后若已连接会立即重连以应用变更。功能特性总览官方文档列举了以下已支持的特性干净的插件安装固定版本、自动维护符号链接各反编译器之间一致的体验统一的命令面反编译器上下文窗口在 Pwndbg 上下文中直接展示当前函数的反编译伪代码伪代码的语法高亮支持共享库shared libraries的反编译与同步将反编译器的符号函数与全局变量应用到调试器可用print decompile_func_name将函数局部变量与参数注册为便利变量可用print $decompiled_var_nameGDB 下支持基本类型解引用print *$varLLDB 下始终为void*di list --all展示当前回溯backtrace中所有函数的局部变量在汇编指令注解instruction annotations中展示符号与函数局部变量在 telescope栈/内存望远镜输出中展示符号与函数局部变量可选的反编译器自动同步。decomp 命令与上下文窗口decomp命令用于利用当前集成反编译某地址附近的代码见 decomp()decomp [addr] [lines]addr要反编译的地址默认取 PClines展示的反编译行数默认 14与context-code-lines的默认值一致。如果未连接decomp会先尝试自动连接并同步soft_connection_check。上下文context输出中的 DECOMP 区块即由此命令的数据源decompile_pretty()见 pwndbg/dintegration/init.py驱动该函数返回伪代码全文、请求地址所在行的行号及函数名由 Pwndbg 负责高亮与排版最终呈现为上方配图那样的 DISASM / DECOMP / STACK / BACKTRACE 同屏联动效果。自动同步与自动跳转decompiler-auto* 配置Pwndbg 在每次调试器 STOP 事件时检查三个开关见 automatic_operations()从而在单步/断点停下时自动保持数据新鲜配置项默认值说明decompiler-autosync-symsoff每次 STOP 时自动同步符号函数 全局变量。符号多、二进制大时开销可能较大默认关闭建议自行体验权衡decompiler-autosync-varson每次 STOP 时自动同步函数局部变量。通常开销很小故默认开启若遇到性能问题可关闭decompiler-autojumpoff每次 STOP 时自动让反编译器光标跳到 PC。是否好用取决于具体反编译器可自行尝试这三个开关的详细帮助文档见 docs/configuration/config.md 中decompiler-*一节也可在 Pwndbg 内用help set decompiler-autosync-syms查看。常见问题与排障decomp2dbg 版本不匹配Pwndbg 要求的版本为3.14.0di connect时校验见 check_decomp2dbg_version()。若通过发行版包管理器安装导致版本不符建议改用 Pwndbg 官方安装方式源码安装下执行uv sync --extra decomp2dbg --inexact。连接失败di connect失败时会提示是否已在反编译器中按CtrlShiftD打开服务并提醒确认插件已安装di install --help。请检查decompiler-port默认 3662是否被占用或与反编译器配置一致。Ghidra 插件过期di connect到本地 Ghidra 时会比对ghidra_plugin_version文件中的版本过期则提示执行di install ghidra见 check_outdated_ghidra_plugin()。不要在~/.gdbinit中执行source .../decomp2dbg/d2d.pyPwndbg 独立实现了调试器侧逻辑两者可能冲突见di install --help的说明。Windows 限制di install不支持 Windows需要独立安装 decomp2dbg。同步失败提示二进制未加载按提示使用di setbase或di setpath手动定位二进制。未来规划官方路线同步反编译器自定义类型并据此正确计算全局变量大小获取函数签名信息在call类型指令上展示参数连同注释一起同步伪代码目前仅 IDA 支持注释需推动其他反编译器跟进支持多种 Binary Ninja 反编译风格同步断点。深入阅读指引本文档对应的原始教程docs/tutorials/decompiler-integration.mddi命令完整参数文档docs/commands/integrations/decompiler-integration.mddecomp命令文档docs/commands/integrations/decomp.md命令实现源码安装、连接、同步、自动处理逻辑pwndbg/commands/decompiler_integration.pyXML-RPC 客户端与数据模型全局变量、函数头、寄存器/栈变量、错误枚举等pwndbg/dintegration/init.py相关配置项默认值与帮助文档docs/configuration/config.md【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
分享:

看完干货,该让你的企业上线了

免费需求沟通 · 48 小时内出具建站方案 · 河南本地可上门