首页
社区
课程
招聘
MFC中如何定为类信息的存储部位,MFC生成的EXE文件的数据布局是什么样?
发表于: 2007-3-1 17:54 6430

MFC中如何定为类信息的存储部位,MFC生成的EXE文件的数据布局是什么样?

2007-3-1 17:54
6430
在读了看雪精华8里面的文章《Reversing MS VC++ Part II: Classes, Methods and RTTI》后有一些不太明白的地方
在这里向各位老师请教一下。在上面提到的文章中说了MSVC对于类的数据的组织形式,此后我用IDA反编译了使用MFC
生成的EXE文件,发现在这个文件中的.rdata段找到了类似虚函数表的的数据。假设该表就是虚函数表的话,但是
在这个虚函数表之前还有一部分数据如下面所示。前面这段数据第一部分好像是该类的message_entry和message_map,
紧跟后面的是一个指针,这个指针是指向什么数据呢?
.rdata:0041C850 stru_41C850     MFC_MessageMap <40124Ah, 41C858h> ; DATA XREF: sub_401083o
.rdata:0041C858                 dd 0
.rdata:0041C85C                 dd 0
.rdata:0041C860                 dd 0
.rdata:0041C864                 dd 0
.rdata:0041C868                 dd 0
.rdata:0041C86C                 dd 0
.rdata:0041C870                 dd offset dword_41EB38  ;这个指针应该是指向什么数据?
.rdata:0041C874 off_41C874      dd offset CWnd::GetRuntimeClass(void)
.rdata:0041C874                                         ; DATA XREF: sub_401000+25o
.rdata:0041C874                                         ; sub_40105A+Eo
.rdata:0041C878                 dd offset sub_40103E    ; 虚函数表的开始
.rdata:0041C87C                 dd offset nullsub_4
.rdata:0041C880                 dd offset nullsub_5
.rdata:0041C884                 dd offset nullsub_4
.rdata:0041C888                 dd offset CCmdTarget::OnCmdMsg(uint,int,void *,AFX_CMDHANDLERINFO *)
.rdata:0041C88C                 dd offset CWnd::OnFinalRelease(void)
.rdata:0041C890                 dd offset CCmdTarget::IsInvokeAllowed(long)
.rdata:0041C894                 dd offset CCmdTarget::GetDispatchIID(_GUID *)
.rdata:0041C898                 dd offset CCmdTarget::GetTypeInfoCount(void)
.rdata:0041C89C                 dd offset CCmdTarget::GetTypeLibCache(void)
.rdata:0041C8A0                 dd offset CCmdTarget::GetTypeLib(ulong,ITypeLib * *)
.rdata:0041C8A4                 dd offset sub_401083
还有一个问题就是该段是.rdata只有读许可,而且没有发现类的成员变量和虚函数表指针。
想问一下该如何找到一个类的信息的存储部位?如何判断该类是什么类?

[培训]《安卓高级研修班(网课)》月薪三万计划,掌握调试、分析还原ollvm、vmp的方法,定制art虚拟机自动化脱壳的方法

收藏
免费 0
支持
分享
最新回复 (6)
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2
自己顶一下。。。。关于上一段内容时静态反汇编出的,补充
2007-3-3 11:47
0
雪    币: 325
活跃值: (97)
能力值: ( LV13,RANK:530 )
在线值:
发帖
回帖
粉丝
3
这个只是常量段 保存一些常量和代码用
实际上虚函数表是在创建类的时候
Class anyclass = new anyclass(Args...)
创建的  这种东西还是动态跟踪比较好。。除非你的汇编功底很好
2007-3-3 16:05
0
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
4
谢谢FOXABU老师的指点,不过我看了一下上面的函数表,确实是按照MFC中虚函数的顺序来的。正如《Reversing MS VC++ Part II: Classes, Methods and RTTI》中所说,虚函数表中虚函数的位置是根据类创建的顺序来的。经过观察CObject以及子类,和这个对比,发现顺序是一样的。是否可以认为这段表在动态载入以后恰好就是虚函数表呢?
2007-3-3 23:57
0
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
5
经过研究发现该表就是相关类的虚函数表,同时该虚函数表是以CXX::GetRunTimeClass函数开始的。该函数表上面的函数指针是该类的RTTI Complete Object Locator结构指针。
之所以以GetRunTimeClass开始是以为在CObject虚函数中以该函数开始。不知这样分析有没有错?
2007-3-7 16:07
0
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
6
经过研究发现该表就是相关类的虚函数表,同时该虚函数表是以CXX::GetRunTimeClass函数开始的。该函数表上面的函数指针是该类的RTTI Complete Object Locator结构指针。
之所以以GetRunTimeClass开始是以为在CObject虚函数中以该函数开始。而在没有声明RunTime支持的情况下,以该类的析构函数为开始。不知这样分析有没有错?
2007-3-7 16:11
0
雪    币: 215
活跃值: (10)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
7
经过研究发现该表就是相关类的虚函数表,同时该虚函数表是以CXX::GetRunTimeClass函数开始的。该函数表上面的函数指针是该类的RTTI Complete Object Locator结构指针。
之所以以GetRunTimeClass开始是以为在CObject虚函数中以该函数开始。而在没有声明RunTime支持的情况下,以该类的析构函数为开始。不知这样分析有没有错?
2007-3-7 16:16
0
游客
登录 | 注册 方可回帖
返回
//