在第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,或者他只是做出一些假设
答案 0 :(得分:0)
由于这大约是32位,ULONG
与UINT
相同。它必须是无符号的,因为它是关于某些东西的大小/数量,这不能是负面的。
请注意,许多其他结构和函数使用DWORD
来表示这些值(元素数等),但它也被定义为无符号整数,就像ULONG
和UINT
一样 - 使用上的差异是历史的(16位时代等)。