跟踪什么价值的反汇编程序

时间:2010-06-02 17:05:21

标签: disassembly

最近我一直在查看我的C ++代码的反汇编,并且必须手动跟踪每个寄存器中的内容,如下所示:

  95:   48 8b 16                mov    (%rsi),%rdx ; %rdx = raggedCross.sink
  98:   48 8b 42 38             mov    0x38(%rdx),%rax ; %rax = sink.table
  9c:   8b 4a 10                mov    0x10(%rdx),%ecx ; %ecx = sink.baseCol
  9f:   48 8b 70 50             mov    0x50(%rax),%rsi ; %rsi = table.starts
  a3:   89 c8                   mov    %ecx,%eax   ; %eax = baseCol
  a5:   83 c1 1c                add    $0x1c,%ecx  ; %ecx = baseCol + 1

等等。手动添加的评论是在C ++类中查找各个字段(例如sink,table,baseCol,starts)的偏移量。

这是直截了当的,但是时间和耗时:对于一个程序来说,这是完美的事情。 gdb似乎知道结构中各个字段的偏移量:我可以做&((表*)0x1200) - >启动并告诉正确的地址。所以,这些信息就在附近。

是否有一些反汇编程序可以使用此信息为我注释代码?

如果做不到,我可以写自己的。 gdb在哪里获得偏移?

3 个答案:

答案 0 :(得分:0)

GDB使用您包含的调试信息来确定那种事情,它不是普通可执行文件的一部分; DWARF是用于存储调试信息的一种常用格式

答案 1 :(得分:0)

您可以使用调试信息(DWARF2)来查看目标文件。当您使用GCC时,可以使用binutils实用程序objdump -S执行带注释的转储。如果转储所有部分,则也会转储DWARF信息。

答案 2 :(得分:0)

您可以查看IDA Pro。它不会完全自动化这个过程,但它至少可以让你在一个地方定义你的结构/类,它将从那里处理大部分事情。