C 逆向工程时结构中的数据类型

C 逆向工程时结构中的数据类型,c,assembly,reverse-engineering,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;

在《反转:第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

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

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

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,或者他只是做了一些假设,因为这大约是32位,
ULONG
UINT
相同。它必须是无符号的,因为它是关于某物的大小/数量,不能是负数

请注意,许多其他结构和函数对此类值(元素数等)使用
DWORD
,但它也被定义为无符号整数,就像
ULONG
UINT
——它们的用法差异是历史性的(16位纪元等)

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