反转 MFC 应用程序:如何查找类内存布局?

逆向工程 六线谱 微信
2021-06-14 04:29:25

我有一个我想反转的旧电脑游戏(准确地说是 Windows 95“悬停!”),我发现它使用了 MFC。

HexRays 经常反编译这样的伪代码,例如,处理 MFC 类CWinThreadIDA MFC 代码伪代码

如您所见,变量thisCWinThread实例,但它的布局似乎未定义,它通过偏移量访问其成员。

我想/需要找出哪些成员在哪些偏移量处。

尽管在标记的示例中很容易猜到(+48 似乎是偷看的消息),但在偏移量 +60 处还有另一个成员稍低一点,我对此一无所知。我搜索了 MSDN 文档并查看了头文件以找到类的布局,但找不到任何对我有帮助的内容。

我在哪里可以检索有关 MFC 类的此类成员/内存布局信息?

3个回答

为了轻松地将信息导入 IDA,可以:

  • 下载 Visual C++ 和 MFC(最好是同一版本)
  • 制作一个非常小的 C++ 文件,其中包含类型的定义,例如:

    #include <afxwin.h>
    

    (您可以验证afxwin.h标题确实包含类的定义)假设文件保存为a.cpp

  • 编译它。(不需要链接)

    cl /c /EHsc /Zi a.cpp
    

    /Zi标志很重要,它指示编译器生成调试信息。

    随着a.obj中,vcXXX.pdb也应该产生的文件(可以是vc80.pdbvc100.pdbvc140.pdb,等依赖于编译器版本)

  • 输入 IDA,打开项目,选择File -> Load file -> PDB file...,然后加载该 PDB 文件。可选择启用Types only

这些类型现在应该出现在“本地类型”选项卡中。

你可以看看这里,第 456 行。

您正在寻找的方法似乎是 OnIdle 函数。

备注: 2018年,该链接不再活跃。但是,可能会在 Visual Studio 社区版(我使用的是 VS2015)的目录“C:\Program Files (x86)\Microsoft Visual Studio 14.0\VC\atlmfc\src\mfc”中找到源代码。CWinThread 类包含在文件 thrdcore.cpp 中。

一种方法是获取用于生成二进制文件的编译器的副本,包括随附的库存库 - 最好是完全相同的版本,或者至少尽可能接近。

然后,您可以简单地编译合适的小测试程序并将它们加载到 IDA 中进行检查和/或导出类型信息并将其导入到 IDA 数据库中作为您的二进制文件。单个结构定义可以通过剪贴板轻松传输(显示为 C 结构、复制、切换到另一个 IDA、粘贴)。