c++ - 在未记录的 API 中反转结构

标签 c++ c struct

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

    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 位值,对吧?

而且我忘了提到,在前面的反汇编片段中初始化结构时,所有元素都是 4 字节长。

最佳答案

根据微软的 documentation , ULONG 是 32 位宽:

ULONG: An unsigned LONG. The range is 0 through 4294967295 decimal. This type is declared in WinDef.h as follows: typedef unsigned long ULONG;

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

关于c++ - 在未记录的 API 中反转结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19525838/

相关文章:

使用 typename 并将 typedef 传递给函数的 C++ 模板

c++ - 了解 typeid().name() 的输出

c - C 中 malloc 的工作原理

struct - 如何导入其他包内的结构?

c++ - 带指针的结构的大小

c++ - 使用 strtok 从输入字符串中获取某些字符串

c++ - 使用CMake生成Visual Studio 2015 Makefile项目(GDB)

c - 数组堆栈溢出

c - 返回内容后如何释放指针

c - 从文件中读取内容时出错