【问题标题】:Reversing a struct in undocumented API在未记录的 API 中反转结构
【发布时间】:2013-10-22 18:43:53
【问题描述】:

我正在阅读一本描述逆转技术的书,我很困惑。

    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

基本上 [EBP+8] 包含通用表结构的地址,我们将结构的第 6 个元素的值移动到 EAX,然后返回它。 书中作者将struct翻译成C,得出的结论是这个移到EAX的值只不过是表中元素的个数。

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

让我感到困惑的是看到 ULONG 数据类型,所以它指的是 64 位值,对吗?

我忘了提到,当结构在之前的反汇编的 sn-ps 中初始化时,所有元素都是 4 字节长。

【问题讨论】:

  • ULONG(在 Windows 中)通常是 32 位无符号整数。
  • 曾几何时,我们认为很久以前的事情并不是很久很久以前。

标签: c++ c struct


【解决方案1】:

根据微软的documentationULONG 是 32 位宽:

ULONG:一个无符号的 LONG。范围是 0 到 4294967295(十进制)。 这种类型在 WinDef.h 中声明如下: typedef unsigned long 超长;

作者得出了这个结论,因为汇编指令正在移动一个 DWORD,它也是 32 位宽。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-17
    • 1970-01-01
    • 2022-10-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-29
    • 1970-01-01
    相关资源
    最近更新 更多