HexRays通常会像这样反编译伪代码,为此,例如,处理MFC类
CWinThread
:如您所见,变量this
是CWinThread
实例,但它的布局似乎未定义,它通过偏移量访问其成员。 我想/需要找出哪些成员在哪个偏移量处。
即使在标记示例中很容易猜到(+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中。
#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.pdb
,vc100.pdb
,vc140.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,粘贴)。
评论
太神奇了!无论如何,如果我找到另一个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