2016-11-04 51 views
0

我试图破译简单的汇编代码,但我对该语言不是很有经验。如果我的代码主要以下块:如何确定地址中的内容汇编正在调用

push %ebp 
8048a45:  89 e5     mov %esp,%ebp 
8048a47:  53      push %ebx 
8048a48:  83 e4 f0    and $0xfffffff0,%esp 
8048a4b:  83 ec 10    sub $0x10,%esp 
8048a4e:  8b 45 08    mov 0x8(%ebp),%eax 
8048a51:  8b 5d 0c    mov 0xc(%ebp),%ebx 
8048a54:  83 f8 01    cmp $0x1,%eax 
8048a57:  75 0c     jne 8048a65 <main+0x21> 
8048a59:  a1 c4 d7 04 08   mov 0x804d7c4,%eax ?? 
8048a5e:  a3 f0 d7 04 08   mov %eax,0x804d7f0 ?? 
8048a63:  eb 74     jmp 8048ad9 <main+0x95> 
8048a65:  83 f8 02    cmp $0x2,%eax 
8048a68:  75 49     jne 8048ab3 <main+0x6f> 
8048a6a:  c7 44 24 04 e8 a2 04 movl $0x804a2e8,0x4(%esp) 

上线8048a59和048a5e,在那里我已经把问号,我猜想它试图设置无论是在地址0x804d7f0什么是地址0x804d7c4,但是我怎么知道这些地址具体是什么?

+0

如果您不知道该程序是什么以及它在做什么,则不这样做。 – Hannu

+1

如果你可以让连接器吐出一个地图文件,你应该得到你的变量的所有绝对地址列表。 – Lundin

回答

1

首先你需要确定哪个部分对应这个地址。你可以这样做objdump像这样objdump -h

然后,你可以拆卸你感兴趣的部分,就像它完成here

Here有关查看段落及其地址的一些有用信息。

其他方法是使用运行时调试器,只是打印出内存,例如gdb的x addr


P.S.如果你想恢复变量名,这可能是不可能的,因为编译器通常会去除大多数符号的那种信息。

+1

当地址可用时,使用'objdump -d -r'打印地址的符号信息(“重定位”)。它贴着像#61d0c8 '这样的评论。注意像这样的情况,它与stderr没有任何关系,只是这是最后一个二进制文件中仍然存在的最近的符号。它对'.o'文件的处理比可执行文件好得多,因为链接器还没有抛弃非全局静态数据的符号信息。 –

+0

我实际上使用'alias disas ='objdump -drwC -Mintel''来做到这一点,解压C++名称并使用Intel风格的语法。 (而不是长时间指令换行机器码)。 –

相关问题