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

来源:互联网 发布:centos7和ubuntu 编辑:程序博客网 时间:2024/06/02 06:06
Debug版本:mfc42d.dll:5F4926BB    B9 10484D5F     mov     ecx, offset _afxBaseModuleState5F4D4810->dword[1]即[5F4D4810]+4==&theApp5F4993E7  |.  8951 04       mov     dword ptr [ecx+4], edx           ;  MFCTest.theAppedx==&theApp结论:CMFCTestApp theApp;的初始化函数中调用了004018A8   .  B9 70684100    mov     ecx, offset theApp004018AD   .  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==esi00400401   .  E8 3E060000   call    <jmp.&MFC42.#561>=>6B732E4E >  8BFF            mov     edi, edi结论:在动态调试中通过对MFC42.#561下断可以在ecx中得到&theAppm_pMainWnd==&theApp+20h然而在静态分析中由入口点函数中的00400C24    FF15 D80F4000   call    dword ptr [<&MSVCRT.__getmainarg>; msvcrt.__getmainargs00400C2A  |.  68 2C1B4000   push    00401B2C00400C2F  |.  68 201B4000   push    00401B2000400C34  |.  E8 A1000000   call    <jmp.&MSVCRT._initterm>得到初始化函数数组,其中就包含theApp的初始化函数总结:theApp的初始化函数地址在.rdata段中且有重定位(如果存在)当vc6.0调试时类没有显示继承的成员信息的时候,清除一下重新编译全局变量和静态变量最初都是以硬编码的形式引出查找过程如下:Null=>theApp->m_pMainWnd->GetMessageMap=>messageMap->_messageEntries[]1.在动态调试中通过对MFC42.#561下断可以在ecx中得到&theApp2.m_pMainWnd==&theApp+20h3.[m_pMainWnd+0h]+30h==GetMessageMap4.在GetMessageMap函数中存在硬编码(mov eax,#~~~~~~)5._messageEntries==[messageMap+4h]

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

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

另见:重新编译MFC
 

原创粉丝点击