资讯动态

Pwndbg `dc` 命令完全解析:基于 hexdump 引擎的 WinDbg 风格内存转储

发布时间:2026/9/16 13:42:11 来源:尧图企业网站定制
Pwndbgdc命令完全解析基于 hexdump 引擎的 WinDbg 风格内存转储【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbgdcDisplay Characters是 Pwndbg WinDbg 兼容命令族中负责十六进制转储的命令从指定地址起按字节对内存进行可视化转储同时输出十六进制字节与 ASCII 可读字符两列信息。本篇文章将围绕 dc 官方文档 展开结合 windbg.py 与 hexdump.py 源码及其测试用例完整讲解dc的参数、输出格式、底层实现原理与可调配置帮助读者在 GDB/LLDB 下像在 WinDbg 中一样高效地检视原始内存。命令速览用法与参数dc的完整用法由 windbg.py 中的 argparse 解析器定义与文档 dc.md 记录的帮助信息完全一致usage: dc [-h] address [count]位置参数位置参数帮助信息默认值address要从哪个地址开始转储The address to dump from必填无默认值count要转储的字节数The number of bytes to hexdump8可选参数短选项长选项帮助信息-h--help显示帮助信息并退出从参数表可以看出dc的核心语义是以指定地址为起点转储count个字节。与db字节转储默认 64 字节、dw字转储默认 32 个 word、dd双字转储默认 16 个 dword、dq四字转储默认 8 个 qword不同dc是命令族中唯一以hexdump 格式输出的成员默认只转储 8 个字节适合快速瞄一眼某个地址附近的原始内容。典型用法示例pwndbg dc 0x555555554000 # 从指定地址转储 8 字节 pwndbg dc 0x555555554000 32 # 从指定地址转储 32 字节 pwndbg dc $rsp # 转储当前栈顶内容 pwndbg dc data # 转储符号 data 的地址内容 pwndbg dc data 16 # 以符号名作为地址参数其中地址参数支持符号名如data、symbol取址表达式、$rsp等 GDB 寄存器表达式以及十六进制字面量——详见下文地址与 count 参数的高级用法一节。dc 在 WinDbg 兼容命令族中的定位Pwndbg 为从 Windows 调试环境迁移过来的用户提供了一套完整的 WinDbg 兼容层。官方特性说明 features.md 中写道For those coming from a Windows background, Pwndbg has a complete WinDbg compatibility layer. You candd,dps,eq, and eveneb $rip 90to your hearts content.这套兼容层全部位于 windbg.py按命令分类CommandCategory.WINDBG注册。转储类命令dX 家族与写入类命令eX 家族分工明确读取/转储db、dw、dd、dq按定宽单位显示、dchexdump 风格、da/ds字符串、dds指针与符号写入/修改eb、ew、ed、eq十六进制写入、ez/eza字符串写入断点与控制bp、bl、bd、be、bc、gocontinue 别名、pcnextcall 别名、kbacktrace 别名等。其中dc与db、dw、dd、dq一同覆盖了 WinDbg 中d*系列最常用的内存检视需求二者唯一的区别在于输出排版dX家族走定宽十六进制列而dc走带 ASCII 列的 hexdump 排版。二者可以互补使用例如先用dc快速查看可读字符串区域再用db/dq按固定单位核对字节序与字段值。底层实现dc 与 hexdump 引擎的关系从源码看dc本身是一个非常轻量的薄封装。在 windbg.py 中dc的函数体只有一行pwndbg.commands.Command(parser, categoryCommandCategory.WINDBG) pwndbg.commands.OnlyWhenRunning def dc(address, count8): return pwndbg.commands.hexdump.hexdump(addressaddress, countcount)也就是说dc将全部工作委托给 Pwndbg 的通用hexdump命令分类为CommandCategory.MEMORY见 memory/hexdump.md。这意味着dc与hexdump命令共享同一实现输出格式、配置参数、错误处理行为完全一致只是入口不同dc属于 WinDbg 兼容层hexdump属于通用内存命令两个装饰器定义了运行前提pwndbg.commands.Command负责注册命令与解析参数pwndbg.commands.OnlyWhenRunning要求当前必须存在正在调试的运行程序否则命令不可用。进一步追踪hexdump命令的实现commands/hexdump.py可以看到完整的调用链为dc → pwndbg.commands.hexdump.hexdump(address, count) → pwndbg.aglib.memory.peek(address) # 可读性预检 → pwndbg.aglib.memory.read(address, count, partialTrue) # 读取内存允许部分读取 → pwndbg.hexdump.hexdump(data, address, width, group_width, ...) # 核心排版其中pwndbg.aglib.memory.read(..., partialTrue)允许在目标内存只部分可读时返回已读到的字节避免整块失败而真正负责排版输出的是 pwndbg/hexdump.py 中的hexdump()生成器函数它逐行yield格式化后的文本行。输出格式逐段解读dc的输出由pwndbg.hexdump.hexdump生成每一行的典型结构如下以测试 test_windbg.py 中的期望输出为例0000 0x404010 00 00 00 00 00 00 00 00 │........│ │逐段拆解区段示例含义偏移0000相对本次转储起点的十六进制偏移4 位随行递增地址0x404010该行起始的绝对虚拟地址8 位十六进制前缀0x十六进制区00 00 00 00 00 00 00 00每字节两位十六进制默认以 4 字节为一组用空格分隔ASCII 区│........│ │可打印字符原样显示不可打印字符显示为.几个关键细节行宽固定 16 字节每行最多容纳 16 字节与 WinDbg 的传统习惯一致hexdump_windbg的注释也写明 Traditionally, windbg will display 16 bytes of data per line。当count小于 16 时如dc data 3不足部分留空ASCII 着色颜色方案pwndbg/hexdump.py中字母、数字与标点显示为可打印色0x00显示为零值色0xff、0x7f、0x80显示为特殊色其余字节为普通色连续相同行折叠当后续多行字节完全相同例如连续的大片0x00或0xff时会自动折叠并输出... ↓ skipped N identical lines (N bytes)提示行避免终端刷屏重复执行再次直接回车或重复触发命令会从上次转储结束的位置继续转储——hexdump.last_address会记录本次转储的结束地址见 commands/hexdump.py方便逐屏翻阅大块内存。测试 test_windbg.py 给出了dc精确的期望输出例如dc data8 字节全为 0输出0000 0x... 00 00 00 00 00 00 00 00 │........│ │dc data 3输出0000 0x... 00 00 00 │... │ │。这组断言同时验证了dc接受符号名、data取址、带0x前缀与不带前缀的十六进制地址四种写法且输出完全一致。地址与 count 参数的高级用法dc的两个位置参数类型定义于 windbg.py都不是普通的整数解析address类型为pwndbg.commands.HexOrAddressExpr。该类型在解析时优先把参数当作十六进制地址处理——因此不带0x前缀的十六进制数字同样按十六进制解释例如dc 404010等价于dc 0x404010这一点由测试dc {data_addr.replace(0x, )}与dc {data_addr}输出一致所印证。同时它也支持符号名、symbol、$rsp等 GDB 表达式解析失败时会报出形如Incorrect address (or GDB expression): xxx的错误count类型为pwndbg.commands.AddressExpr。这意味着 count 同样可以是寄存器表达式或 GDB 算术表达式例如dc $rsp $rax用寄存器值控制字节数、dc $rsp 8/28/2被解析为 4等测试中对dw data 8/2、db data $ax的断言验证了这类表达式在 dX 命令族中的通用性。此外hexdump命令还内置了一个区间语义的智能判断commands/hexdump.py当满足0x10000 address count时命令会把第二个参数理解为结束地址而非字节数并自动换算为count - address。由于dc与hexdump共用实现这一行为同样适用于dc。可调参数控制输出宽度与读取上限虽然dc的文档只列出了两个位置参数但由于其底层是hexdump命令因此hexdump的全部配置项都会影响dc的行为。这些参数在 commands/hexdump.py 中注册参数默认值说明hexdump-width16每行显示的字节数行宽hexdump-bytes64hexdump命令的默认转储字节数dc自身的默认值固定为 8不受此参数影响hexdump-group-width-1十六进制区每组字节数-1表示使用架构指针宽度x86-64 下为 8x86 下为 4hexdump-group-use-big-endianFalse组内字节是否按大端序显示仅影响十六进制区不影响 ASCII 区hexdump-limit-mb10单次转储的最大字节数上限单位 MB防止一次性申请过多内存导致调试器崩溃设为0可取消限制同时 pwndbg/hexdump.py 还注册了三个主题类参数主题参数默认值说明hexdump-colorize-asciiTrue是否对 ASCII 区着色hexdump-ascii-block-separator│ASCII 区块分隔符字符hexdump-byte-separator十六进制区单个字节间的分隔符这些参数均通过set param-name value在调试会话中动态调整例如pwndbg set hexdump-width 32 # 每行显示 32 字节 pwndbg set hexdump-group-width 4 # 每 4 字节一组 pwndbg set hexdump-limit-mb 0 # 关闭读取上限谨慎使用边界行为与错误处理dc/hexdump对各类异常输入有明确的处理逻辑commands/hexdump.py地址不可读pwndbg.aglib.memory.peek(address)失败时输出Could not read memory at specified addresscount 非法count 0时输出count must be larger than 0 (is N).超出读取上限当count超过hexdump-limit-mb设定值时抛出带提示的ValueError指引用户通过set hexdump-limit-mb new_limit_in_mb提高上限或设为 0 取消地址超出指针掩码当地址大于pwndbg.aglib.arch.ptrmask时自动截断到合法范围并给出警告0x%x is larger than the maximum address, truncating to 0x%x instead部分可读由于使用了partialTrue读取即使目标内存后半部分不可读也能输出前半部分已读到的字节。测试验证行为即契约dc的行为在 tests/library/dbg/tests/test_windbg.py 中有完整的集成测试覆盖运行于tests/binaries/host/memory.native.c编译出的测试二进制之上。test_windbg_dX_commands用例中关于dc的部分验证了四种地址写法符号名、data、0x前缀十六进制、无前缀十六进制输出完全一致默认 8 字节的转储内容与精确的排版格式偏移、地址、十六进制、ASCII 四段指定count如 3时只转储 3 字节且输出格式正确与db/dw/dd/dq共享同一套错误路径非法符号报 usage 错误、地址 0 报Could not access the provided address。此外x86 用例 展示了在$esp上预写测试数据后db/dw/dd/dq各自按字节/字/双字/四字单位解读同一段内存的输出差异可作为理解dc与其他 dX 命令排版差异的直观参照。这些测试同时运行在 GDB 与 LLDB 两种调试后端之上见pwndbg.dbg.name()的分支逻辑保证dc的跨后端一致性。总结dc是 Pwndbg WinDbg 兼容层中hexdump 风格内存检视的入口它参数极简一个必填地址 一个默认 8 的可选字节数却因复用了成熟的hexdump引擎而获得了彩色输出、ASCII 对照、相同行折叠、回车续读、超大转储保护与高度可定制排版等完整能力。对于从 WinDbg 迁移到 GDB/LLDB 的逆向与漏洞利用开发者dc配合db/dw/dd/dq/dds即可无缝覆盖日常内存检视需求对于希望深入定制输出格式的读者commands/hexdump.py 中的配置参数与 pwndbg/hexdump.py 中的排版实现是继续探索的最佳起点。【免费下载链接】pwndbgExploit Development and Reverse Engineering with GDB LLDB Made Easy项目地址: https://gitcode.com/GitHub_Trending/pw/pwndbg创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价