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

HexRays通常会像这样反编译伪代码,为此,例如,处理MFC类CWinThread:如您所见,变量thisCWinThread实例,但它的布局似乎未定义,它通过偏移量访问其成员。

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

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

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

#1 楼

您可能会在这里看到行号456。
您正在寻找的方法似乎是OnIdle函数。
备注:在2018年,该链接不再有效。但是,这些源可能在Visual Studio社区版本(我正在使用VS2015)的目录中找到
“ C:\ Program Files(x86)\ Microsoft Visual Studio 14.0 \ VC \ atlmfc \ src \ mfc”。 br /> CWinThread类包含在文件thrdcore.cpp中。

评论


太神奇了!无论如何,如果我找到另一个MFC类,我将如何查找呢?

–雷
16年4月10日在9:57

据MS称,他们已经发布了MFC的完整源代码。请参阅msdn.microsoft.com/en-us/library/bs046sh0.aspx。可能仅在VStudio的专业版中。直到几年前,我已经使用MFC进行了许多项目,并且始终可以进入MFC的源代码。但是,我没有太多与之相反的经验。 Ida反编译器在识别MFC方面似乎做得很好。

–乔什
16 Apr 10'在10:52

该链接似乎已消失,是否有可能获得一个新链接?

–雷
18年5月18日在5:42

这里的链接仍然有效!

–乔什
18年5月27日在21:16

没关系,雷。我搜索了一下,但在网络上找不到源。但是,它们包含在VStudio中。我相应地编辑了答案。

–乔什
18年5月28日在12:33

#2 楼

为了轻松地将信息导入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


类型应立即显示在“本地类型”选项卡中。

评论


我尝试了此操作,但是加载vc40.pdb文件(在这种情况下为明显版本)没有填写任何结构信息。 “本地类型”窗口仍仅列出结构名称,但不包含其内容。输出窗口状态为PDB:虽然已加载211种类型。我想念什么吗?

–雷
18-11-16在9:46



@RayKoopa无法复制。 /是否加载了其他任何结构定义?

–user202729
18年11月16日在13:57

没关系,我只是在愚蠢地尝试加载为示例MFC应用程序生成的PDB。现在,我加载了MFC源提供的PDB文件。但是,IDA仅为主类(如CObject)创建一个vtable,而不为子类(如CWinApp)创建一个vtable。这使它有点无用...

–雷
18/12/5在17:33

#3 楼

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

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