您的位置:首页 > 其它

动态调试中获取mfc程序的消息响应函数列表的思路

2013-08-08 07:29 453 查看
Debug版本:mfc42d.dll:
5F4926BB    B9 10484D5F     mov     ecx, offset _afxBaseModuleState
5F4D4810->dword[1]即[5F4D4810]+4==&theApp

5F4993E7  |.  8951 04       mov     dword ptr [ecx+4], edx           ;  MFCTest.theApp
edx==&theApp

结论:
CMFCTestApp theApp;的初始化函数中调用了
004018A8   .  B9 70684100    mov     ecx, offset theApp
004018AD   .  E8 F3F7FFFF    call    004010A5
......
004010A5   $ /E9 86060000    jmp     CMFCTestApp::CMFCTestApp
其中又调用了
00401752  |.  E8 1B100000    call    CWinApp::CWinApp                  ;  jmp 到 MFC42D.#528
因此theApp的地址实际上被硬编码在mfc程序的某个特定的初始化函数中,再传到mfc42d保存起来
而这个初始化函数的地址在动态调试中可以通过MFC42D.#528下断再逆向推出;

messageMap及_messageEntries存在于.rdata段
004010BE   . /E9 DD0D0000   jmp     CMFCTestDlg::GetMessageMap
除非在函数中用到messageMap,否则仅在GetMessageMap函数中存在硬编码(mov eax,#~~~~~~)
[m_pMainWnd+0h]+30h==GetMessageMap即CObject::__vfptr[12]

Release版本:mfc42.dll:
6B730A3D    8906            mov     dword ptr [esi], eax
&_afxBaseModuleState==esi

00400401   .  E8 3E060000   call    <jmp.&MFC42.#561>
=>
6B732E4E >  8BFF            mov     edi, edi
结论:
在动态调试中通过对MFC42.#561下断可以在ecx中得到&theApp
m_pMainWnd==&theApp+20h
然而在静态分析中
由入口点函数中的
00400C24    FF15 D80F4000   call    dword ptr [<&MSVCRT.__getmainarg>; msvcrt.__getmainargs
00400C2A  |.  68 2C1B4000   push    00401B2C
00400C2F  |.  68 201B4000   push    00401B20
00400C34  |.  E8 A1000000   call    <jmp.&MSVCRT._initterm>
得到初始化函数数组,其中就包含theApp的初始化函数

总结:theApp的初始化函数地址在.rdata段中且有重定位(如果存在)
当vc6.0调试时类没有显示继承的成员信息的时候,清除一下重新编译
全局变量和静态变量最初都是以硬编码的形式引出
查找过程如下:
Null=>theApp->m_pMainWnd->GetMessageMap=>messageMap->_messageEntries[]
1.在动态调试中通过对MFC42.#561下断可以在ecx中得到&theApp
2.m_pMainWnd==&theApp+20h
3.[m_pMainWnd+0h]+30h==GetMessageMap
4.在GetMessageMap函数中存在硬编码(mov eax,#~~~~~~)
5._messageEntries==[messageMap+4h]

何时达到庖丁解牛的感觉就好了

现在感觉如果是动态链接的mfc程序,可以链接到自己改的mfc上面,想做什么都可以

另见:重新编译MFC
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐