Ghidra 中未显示局部变量和加法

逆向工程 拆卸 部件 C 吉德拉 局部变量
2021-06-18 20:57:39

我在学习汇编和逆向工程时遇到了一些麻烦。具体来说,我正在了解全局变量与局部变量。对于全局变量,我设法在汇编中获得了它们存储在内存地址中的见解。对于局部变量,我希望它们存储在堆栈中(理论),但是我下面的简单 C 代码在 Ghidra 中反汇编时,在主函数中没有显示任何内容。

代码:

void main()
{
    int x = 1;
    int y = 2;
    x = x + y;
}

吉德拉输出:

在此处输入图片说明

为什么我在 Ghidra 中看不到任何东西?对我来说它看起来像一个空函数,但显然应该有一些局部变量声明,然后再执行加法。

我真的很抱歉经常在这里打开线程,但这是我可以获得此类问题帮助的唯一来源。在 Reddit 上,他们不允许发布问题并将我推荐到这里。

编辑 - 25.09.2019:

根据建议,我在现有的 C 代码中添加了一些代码,以查看它现在是否会显示在程序集中:

#include <stdio.h>

void main()
{
    int x = 1;
    int y = 2;

    x = x + y;

    printf("Rezultat = %d\n", x);

}

为此,我必须将入口点设置回 CRT 初始化,否则我无法使用 stdio 库。这是 Ghidra 中 main 函数的结果:

在此处输入图片说明

现在我可以看到 PUSH 指令和值 0x03。这可能是加法 1 + 2 的结果值,但我再次无法看到局部变量初始化的位置以及算术运算的执行位置。

2个回答

您可能需要使用局部变量或在禁用优化的情况下进行编译

我假设您在 Windows 上使用 msvc ?下面显示的是在 x64 上为 x64 在 win 10 中编译的片段,您可以在其中清楚地看到正在初始化和使用的本地变量

f:\git\usr\bin\ls -lg
total 1
-rw-r--r-- 1 197121 61 Sep 25 15:24 local.cpp

f:\git\usr\bin\cat *
int main (void)
{
        int x = 1;
        int y = 2;
        return x+y;
}
cl /Zi /W4 -GS /analyze /Od /nologo local.cpp /link /release /ENTRY:main /SUBSYSTEM:windows /FIXED
local.cpp

f:\git\usr\bin\ls -lg *.exe
-rwxr-xr-x 1 197121 2560 Sep 25 15:32 local.exe

提供给编译器和链接器的选项描述

/Zi = build with debug info embedded in pdbfile 
/w4 build with highest possible warning level
-GS disable stack cookie
/analyze run code analysis on the src files 
/Od disable optimization
/entry:main (no crt libs are sued so you need to set the entry point
/subsystem:windows  no cmd or no crt or no input output this is not a console app 
so you need to specify which subsystem will this program work on
/fixed disable relocations

在 ghidra 中打开 exe 并按原样复制 main 函数

                             //
                             // .text 
                             // ram: 140001000-140001022
                             //
                             **************************************************************
                             *                          FUNCTION                          *
                             **************************************************************
                             int __fastcall main(int _Argc, char * * _Argv, char * * 
             int               EAX:4          <RETURN>
             int               ECX:4          _Argc
             char * *          RDX:8          _Argv
             char * *          R8:8           _Env
             undefined4        Stack[-0x14]:4 local_14                                XREF[2]:     140001004(W), 
                                                                                                   140001016(R)  
             undefined4        Stack[-0x18]:4 local_18                                XREF[2]:     14000100c(*), 
                                                                                                   140001013(*)  

|||||||||||||||||||| FUNCTION |||||||||||||||||||||||||||||||
                             Symbol Ref: main
                             entry                                           XREF[4]:     Entry Point(*), 1400000e0(*), 
                             .text$mn                                                     1400000e4(*), [more]
                             main
       140001000 48 83 ec 18     SUB        RSP,0x18
       140001004 c7 44 24        MOV        dword ptr [RSP + local_14],0x1
                 04 01 00 
                 00 00
       14000100c c7 04 24        MOV        dword ptr [RSP]=>local_18,0x2
                 02 00 00 00
       140001013 8b 04 24        MOV        EAX,dword ptr [RSP]=>local_18
       140001016 8b 4c 24 04     MOV        _Argc,dword ptr [RSP + local_14]
       14000101a 03 c8           ADD        _Argc,EAX
       14000101c 8b c1           MOV        EAX,_Argc
       14000101e 48 83 c4 18     ADD        RSP,0x18
       140001022 c3              RET
                             ********** main Exit ********** 

如果您只想禁用特定功能的优化,而不是使用 /Od 进行批发,您可以使用 #pragmas 请参阅下面的屏幕截图,其中显示了 vscode / vsdevcmdprompt / 编译

用做“显示和显示”显示的 gif 替换图像

在此处输入图片说明

这些是发布版本的编译器优化。您应该构建一个调试版本,然后将其加载到 ghidra