了解特定的装配线

逆向工程 部件 x86
2021-06-25 17:22:14

我尝试分析一个 .exe 文件,我总是这样:

MOV EAX, DWORD PTR DS:[ESI]

我为此搜索了很多,我知道带有 [...] 的表达式意味着我们将 ESI 的上下文存储在 EAX 中。例如,当我在 ESI 中有值 00000101(十进制为 5)时,我会用 C 表示它,如下所示:

    int x = 5;
    int y = x;

好的,那很好,但是如果我在 ESI 中有地址怎么办?像 001B5355 这样的东西,我知道它是一个地址。那我怎么代表呢?也许使用类似指向 001B5355 的指针之类的东西?

  UnknownType *immediatePointer = &001B5355;

  UnknownType *pointerEAX = *immediatePointer;

我需要帮助,因为 .exe 的整个汇编代码由那种行组成,我不知道如何表示它以想象它如何实现它。

2个回答

指令

MOV EAX, DWORD PTR DS:[ESI]

获取DWORD指向的内容DS:ESI如果你ESI知道的值是一个常数,你可以在这样的一行中完成它:

unsigned eax = *(unsigned *)0x001B5355;

您可以通过将它分成两部分(如您所做的那样)来使它更好一点,以便您可以命名指针。

unsigned *ptr = (unsigned *)0x001B5355;
unsigned eax = *ptr;

这假设unsigned您的编译器是 32 位数量。

如果esi holds 5 mov eax, [esi]将创建一个 access violationas 5valid address在正常情况下不会是 a

并且it does not translate to int x = 5 ; int y = x
其由下式表示 mov eax , esi不MOV EAX [ESI]

pointermagic:\>type pointermagic.cpp

int x = 4;
int *y = &x;
int z = x + *y;
int main (void)
{
    return z + x;
}

pointermagic:\>cl /Zi /nologo pointermagic.cpp /link /RELEASE

pointermagic:\>cdb -c "g main; uf @eip;q" pointermagic.exe 

0:000> cdb: Reading initial command 'g main; uf @eip;q'    
pointermagic!main:
00401000 55              push    ebp
00401001 8bec            mov     ebp,esp
00401003 a140bb4000      mov     eax,dword ptr [pointermagic!z (0040bb40)]
00401008 030500b04000    add     eax,dword ptr [pointermagic!x (0040b000)]
0040100e 5d              pop     ebp
0040100f c3              ret
quit: