我正在尝试破译简单的汇编代码,但我对该语言的经验不是很丰富。如果我在 main 中有以下代码块:
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 中的内容,但我如何知道这些地址中具体内容是什么?
最佳答案
首先,您需要确定该地址对应于哪个部分。您可以使用 objdump 来执行此操作,如下所示 objdump -h
然后你可以像完成一样反汇编你感兴趣的部分 here .
Here有关查看部分及其地址的一些有用信息。
另一种方法是使用运行时调试器并仅打印出内存,例如x addr
用于 gdb。
附注如果你想恢复变量名,这可能是不可能的,因为编译器通常会删除大多数符号的此类信息。
关于c - 如何确定程序集正在调用的地址中的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40422955/