Pwndbg `bd` 命令详解:在 GDB 中按索引禁用 WinDbg 风格断点 📅 发布时间:2026/9/16 22:12:24 👁 浏览次数: Pwndbgbd命令详解在 GDB 中按索引禁用 WinDbg 风格断点【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg导读bd是 Pwndbg 为习惯 WinDbg 操作习惯的逆向工程师提供的断点管理命令用于按断点索引禁用DisableGDB 中已设置的断点是 WinDbg 兼容命令族bl/bd/be/bc/bp中的关键一环。通过本文你将掌握bd的完整参数语义、与原生 GDBdisable命令的对应关系、底层实现原理以及在调试会话中配合bl、be完成断点列出—禁用—恢复的完整工作流。bd命令速览bd是 Pwndbg 提供的 WinDbg 兼容命令命令全称对应 WinDbg 的bdBreakpoint Disable语法。其官方帮助文本为usage: bd [-h] [which] Disable the breakpoint with the specified index.功能一句话概括禁用指定索引的断点。被禁用的断点不会触发程序暂停但它仍然保留在断点列表中随时可以通过be命令重新启用而无需重新设置。参数说明参数类型说明默认值which位置参数可选要禁用的断点索引号*禁用全部断点-h/--help可选参数显示帮助信息并退出—源码实现bd的底层原理bd的实现在 pwndbg/commands/windbg.py 中其核心逻辑非常简洁本质上是将 WinDbg 风格的命令语法翻译为原生 GDB 命令parser argparse.ArgumentParser(descriptionDisable the breakpoint with the specified index.) parser.add_argument( which, nargs?, typestr, default*, helpIndex of the breakpoint to disable. ) pwndbg.commands.Command(parser, categoryCommandCategory.WINDBG) def bd(which*) - None: Disable the breakpoint with the specified index. if which *: gdb.execute(disable breakpoints) else: gdb.execute(fdisable breakpoints {which})从源码可以看出几个关键实现事实参数默认值与解析which通过argparse定义nargs?表示可选default*表示省略参数时默认值为*。类型为字符串typestr因此它接收的是断点索引的文本形式如1、2而非数值。通配符分支当which *时实际执行gdb.execute(disable breakpoints)即禁用 GDB 中所有断点这与原生 GDB 中不带参数的disable breakpoints行为完全一致。指定索引分支当传入具体索引如bd 2时实际执行gdb.execute(fdisable breakpoints {which})对应原生 GDB 的disable breakpoints 2。命令分类categoryCommandCategory.WINDBG将该命令归入 WinDbg 兼容类别可通过 Pwndbg 的命令帮助系统如help bd或 Pwndbg 的pwndbg配置命令检索到。断点禁用与删除的本质区别bd只做禁用disable不做删除delete。禁用后断点仍保留在断点表中只是不再触发而 Pwndbg 的bc命令则对应 WinDbg 的Clear语义底层执行gdb.execute(delete breakpoints ...)见 pwndbg/commands/windbg.py 中bc的实现会真正从断点表中移除断点。调试实践中临时不想命中某断点时用bd彻底不需要时用bc。前置条件仅 GDB 调试器可用bd命令有一个重要使用前提——它仅在 GDB 后端下可用。文档中明确标注了(only in GDB)标记源码层面也有对应佐证在 pwndbg/commands/windbg.py 中bd、bl、be、bc、bp等断点管理命令都被包裹在if pwndbg.dbg.is_gdblib_available():条件块内只有通过import gdb使用原生 GDB 接口时才注册因此当 Pwndbg 运行在 LLDB 后端如 pwndbg_dbg_mod/lldb 实现时这些命令不会被注册。这一点与同目录下的内存读写类命令如db、dq、dd等实现在windbg.py的函数体顶层不同后者基于 Pwndbg 的pwndbg.aglib抽象层实现可以跨 GDB/LLDB 后端工作。实战使用完整的断点管理工作流1. 列出当前断点bl禁用断点前通常先用bl查看当前断点列表获取每个断点的索引号pwndbg blbl的实现直接转发给原生 GDB 的info breakpoints见 pwndbg/commands/windbg.py输出格式与 GDB 原生一致形如Num Type Disp Enb Address What 1 breakpoint keep y 0x0000000000401234 in main at test.c:10 2 breakpoint keep y 0x0000000000401267 in vulnerable_func at test.c:25其中Num列即为索引号Enb列的y/n表示该断点当前处于启用/禁用状态。2. 禁用指定断点bdpwndbg bd 2执行后编号为 2 的断点被禁用。再次运行bl可以看到Num Type Disp Enb Address What 1 breakpoint keep y 0x0000000000401234 in main at test.c:10 2 breakpoint keep n 0x0000000000401267 in vulnerable_func at test.c:25注意Enb列变为n但断点仍保留在列表中。3. 一次禁用全部断点pwndbg bd省略which参数等价于bd *时会执行disable breakpoints一次性禁用所有断点适用于需要暂时放行所有断点的场景例如让程序跑完一段不关心路径时。4. 恢复断点be需要重新启用时使用对应的be命令Enablepwndbg be 2be与bd的源码结构完全对称同为which参数、默认*底层分别执行enable breakpoints/enable breakpoints {which}见 pwndbg/commands/windbg.py 中be的实现。5. 彻底移除断点bc确认不再需要的断点可以用bc清除Clear底层执行 GDB 的delete breakpoints。常见使用场景条件性放行调试堆利用或格式化字符串漏洞时常在malloc、free、strcpy等函数上设置多个断点当某段路径反复命中不关心的断点时用bd index临时禁用避免频繁中断。暂停断点命中程序需要先执行到某个稳定状态如等待输入、完成初始化再开始单步调试可用bd暂时禁用全部断点到达目标点后再用be恢复。避免删除重设的繁琐bd/be的禁用-启用模式保留了断点的位置与条件设置比删除后重新bp更高效也不会丢失断点关联的命令序列或条件表达式。命令族索引bd属于 Pwndbg WinDbg 兼容命令族配套命令及其文档如下命令功能文档路径bl列出断点转发info breakpointsbl.mdbd禁用断点本文bd.mdbe启用断点be.mdbc清除删除断点bc.mdbp在指定地址设置断点bp.md完整的命令族源码集中在 pwndbg/commands/windbg.pyGDB 专属断点管理部分位于该文件 L412-L490 附近断点管理命令对应的端到端测试可参考 tests/library/dbg/tests/test_windbg.py。小结bd是 Pwndbg WinDbg 兼容层中面向断点管理的核心命令之一它用一行 WinDbg 风格的语法封装了 GDB 原生的disable breakpoints逻辑并提供了通配符*默认值以支持批量操作。理解其禁用而非删除的语义配合bl列出、be启用、bc清除即可在 Pwndbg 调试会话中高效管理多个断点的生命周期。【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考