C 逆向工程时结构中的数据类型
在《反转:第152页反转工程的秘密》一书中,他正在反转一些Windows API,我们发现结构是这样的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;
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;
};