c - 如何确定程序集正在调用的地址中的内容

标签 c assembly x86 att

我正在尝试破译简单的汇编代码,但我对该语言的经验不是很丰富。如果我在 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/

相关文章:

c - 确定数字是否出现在字符串中的最快方法是什么?

c - 我如何验证我是否从标准输入(Stdin)获得了 N^2 个整数?

c++ - 线程安全的 Hook 函数

c - gdb 在使用偏移量工作时在地址处中断时停止程序

c# - .net 框架错误 (HRESULT 0x8007000B)

c - 仅使用 bool 运算符如何知道二进制数是否为负数?

java - 调用 JNI_CreateJavaVM 函数后应用程序内存增加了 Giga Bytes

linux - 停止缓冲区溢出 - NASM 输入

assembly - 获取 16 或 32 字节固定大小缓冲区的 C 字符串长度? (XMM 或 YMM 寄存器宽度)

c - 将 FOR 翻译成汇编程序