【问题标题】:Data types in struct when reverse engineering逆向工程时结构中的数据类型
【发布时间】: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


    【解决方案1】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-03-29
      • 2012-10-09
      • 2014-06-25
      • 1970-01-01
      • 1970-01-01
      • 2015-07-05
      • 2011-03-20
      • 1970-01-01
      • 2021-05-03
      相关资源
      最近更新 更多