逆向工程时struct中的数据类型

时间:2016-05-11 19:45:07

标签: c assembly reverse-engineering

在第152页的“逆转:反向工程的秘密”一书中,他正在通过颠倒某些Windows API来解决这个问题,我们已经发现结构看起来像这样

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

我按照他如何达到这一点,然后他查看API中的另一个函数并提供此位

  

让我们继续研究一下希望是一个简单的函数:RtlNumberGenericTableElements。这个想法是,如果根数据结构有一个   表示表中元素总数的成员,此函数   会暴露它。如果没有,该函数将遍历所有元素   并且在做这件事时算一算。以下是OllyDbg输出   RtlNumberGenericTableElements。

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
  

好吧,问题似乎得到了回答。这个功能很简单   获取指向一个人只能假设与以前相同的结构的指针,   并返回偏移量+14中的任何内容。显然,偏移+14包含数字   通用表数据结构中的元素。让我们更新TABLE结构的定义。

只有该函数返回表中元素的数量,他将结构更新为下面的结构。

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;
};

注意他所做的只是将Member6更新为ULONG类型并将其称为NumberOfElements,显然该成员包含某种int以包含表的元素数量,但他如何从中知道它是ULONG ?难道它也不是UINT或INT,或者他只是做出一些假设

1 个答案:

答案 0 :(得分:0)

由于这大约是32位,ULONGUINT相同。它必须是无符号的,因为它是关于某些东西的大小/数量,这不能是负面的。

请注意,许多其他结构和函数使用DWORD来表示这些值(元素数等),但它也被定义为无符号整数,就像ULONGUINT一样 - 使用上的差异是历史的(16位时代等)。