在未记录的API中反转结构

时间:2013-10-22 18:43:53

标签: c++ c struct

我正在读一本描述逆转技术的书,我很困惑。

    RtlNumberGenericTableElements:
7C923FD2 PUSH EBP
7C923FD3 MOV EBP,ESP
7C923FD5 MOV EAX,DWORD PTR [EBP+8]
7C923FD8 MOV EAX,DWORD PTR [EAX+14]
7C923FDB POP EBP
7C923FDC RET 4

基本上[EBP + 8]包含通用表结构的地址,我们将结构的第6个元素的值移动到EAX然后返回它。 在本书中,作者将结构转换为C并得出结论,此值移至EAX只不过是表中元素的数量。

struct TABLE
{
    UNKNOWN Member1;
    UNKNOWN_PTR Member2;
    UNKNOWN_PTR Member3;
    UNKNOWN_PTR Member4;
    UNKNOWN Member5;
    ULONG NumberOfElements;
    UNKNOWN Member7;
    UNKNOWN Member8;
    UNKNOWN Member9;
    UNKNOWN Member10;
};

让我感到困惑的是看到ULONG数据类型,所以它引用的是64位值吗?

我忘了提到当结构在前面的反汇编片段中初始化时,所有元素都是4个字节长。

1 个答案:

答案 0 :(得分:1)

根据微软的documentationULONG是32位宽:

  

ULONG:未签名的LONG。范围是0到4294967295十进制。   此类型在WinDef.h中声明如下:typedef unsigned long   ULONG;

作者得出了这个结论,因为汇编指令正在移动DWORD,这也是32位宽。