我无法理解 Ghidra 中的这个特定符号

逆向工程 拆卸 x86 吉德拉
2021-06-29 10:46:43

我正在反转我为学习 Ghidra 而创建的代码结构,它看起来与 GDB 中的不同。我想知道是否有人可以澄清突出显示的 LEA 说明的含义:[我不知道应该如何阅读]

Ghidra 中的反汇编截图

谢谢,R。

1个回答

LEA表示“加载有效地址”,即不是将地址ESP+8内容加载到EAX寄存器中,而是直接加载地址,即寄存器ESP的内容增加8。

例如,如果ESP寄存器(扩展堆栈指针)中的值为1000,则情况可能是这样的:

在此处输入图片说明

然后您的指令LEA EAX, [ESP+8]数字1008加载到EAX寄存器中——堆栈中第三个的地址

换句话说,EAX将包含指向值 531地址(一个指针)。

比较:

如果您将LEA指令替换为以下指令MOV

LEA EAX, [ESP+8]    ; original (LEA): EAX = 1008
MOV EAX, [ESP+8]    ; replaced (MOV): EAX =  531

然后EAX寄存器将加载堆栈中,即531


笔记:

  1. 为什么指向堆栈的指针?
    因为函数的参数一般都是入栈的。
    因此,在您的代码中,您可能获得了一个指向特定(第二个?)参数的指针

  2. 部分EAX => local_18什么意思?

    Ghidra 的反编译器(到 C 语言)不知道原始指令(和变量名称),因此它会创建名称作为您的local_18.

    在列表中(反汇编)EAX => local_18意味着:

    “在这个位置,你的变量local_18EAX寄存器的形式使用 ”。

    (这个变量不在内存中——它的值直接在EAX寄存器中。)