我正在阅读 Eldad Eilam 的逆向工程书籍,并试图遵循他的 RtlInitializeGenericTable 示例。
它的第一部分相当简单——
7C921A39 MOV EDI,EDI
7C921A3B PUSH EBP
7C921A3C MOV EBP,ESP
7C921A3E MOV EAX,DWORD PTR SS:[EBP+8] ; eax = UnknownStruct->Member1
7C921A41 XOR EDX,EDX
7C921A43 LEA ECX,DWORD PTR DS:[EAX+4] ; ecx = UnknownStruct->Member2
7C921A46 MOV DWORD PTR DS:[EAX],EDX ; UnknownStruct->Member1 = 0;
7C921A48 MOV DWORD PTR DS:[ECX+4],ECX ; UnknownStruct->Member3 = &UnknownStruct->Member2;
7C921A4B MOV DWORD PTR DS:[ECX],ECX ; UnkownStruct->Member2 = &UnknownStruct->Member2;
7C921A4D MOV DWORD PTR DS:[EAX+C],ECX ; UnknownStruct->Member4 = &UnknownStruct->Member2;
我感到困惑的是第二部分:
7C921A50 MOV ECX,DWORD PTR SS:[EBP+C] ; ecx = UnknownStruct->Member2
7C921A53 MOV DWORD PTR DS:[EAX+18],ECX; UnknownStruct->Member7 = UnknownStruct->Member2;
7C921A56 MOV ECX,DWORD PTR SS:[EBP+10]; ecx = UnknownStruct->Member3
7C921A59 MOV DWORD PTR DS:[EAX+1C],ECX; UnknownStruct->Member8 = UnknownStruct->Member3;
在这部分中,EBP 的偏移量用于访问变量并设置它们的值。然而,在他的 decompiled-c-equivalent 输出中,显示内存地址没有被用作初始化值,即
UnknownStruct->Member7 = UnknownStruct->Member2;
而在第一部分,它们是:
UnknownStruct->Member3 = &UnknownStruct->Member2;
为什么会这样?据我所知,这两个部分应该是相同的——第一个和第二个之间的唯一区别是 LEA 指令,但这应该只计算基指针的偏移量,与第二部分中所做的相同。
谢谢。