【发布时间】:2016-09-07 09:43:03
【问题描述】:
在第 152 页的 Reversing: Secrets of Reverse Engineering 一书中,他正在研究一些 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 中的任何内容。显然,offset +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 还是他只是做了一些假设
【问题讨论】:
标签: c assembly reverse-engineering