MFC程序里单击按钮时执行的入口地址查找方法
我这个方法可能比较繁琐,但我找不出更好的办法了,哪位知道怎么知道能更快,更方便地找出入口地址的麻烦教我一下,在此先谢了~
首先用OD装入MFC程序运行起来,在OD里 查看->窗口 打开窗口面板 在所要的中断按钮右键 选"在ClassProc上设消息断点",消息里选"202 WM_LBUTTONUP",好了按确定!
这样完成后点击按钮时OD就在77D3AFFE中断了下来
77D3AFFE > 8BFF mov edi, edi
77D3B000 55 push ebp
77D3B001 8BEC mov ebp, esp
77D3B003 8B4D 08 mov ecx, dword ptr ss:[ebp+8]
77D3B006 56 push esi
77D3B007 E8 C4D4FDFF call USER32.77D184D0
77D3B00C 8BF0 mov esi, eax
77D3B00E 85F6 test esi, esi
77D3B010 74 38 je short USER32.77D3B04A
这里是USER32领空!所以我们要回到程序领空,在OD菜单里 查看->内存 在我们程序的.text区断访问设置中断
然后F9运行,OD就在004019C8断了下来,这里就是我们程序领空了
004019C2 .- FF25 14204000 jmp dword ptr ds:[<&MFC42.#5163_?OnWndMsg@CWnd@@MAEHIIJPAJ@Z>]
004019C8 .- FF25 18204000 jmp dword ptr ds:[<&MFC42.#6374_?WindowProc@CWnd@@MAEJIIJ@Z>]
004019CE .- FF25 1C204000 jmp dword ptr ds:[<&MFC42.#4353_?OnAmbientProperty@CWnd@@UAEHP>
004019D4 .- FF25 20204000 jmp dword ptr ds:[<&MFC42.#3798_?GetSuperWndProcAddr@CWnd@@MAE>
004019DA .- FF25 24204000 jmp dword ptr ds:[<&MFC42.#4837_?OnNotify@CWnd@@MAEHIJPAJ@Z>]
004019E0 .- FF25 28204000 jmp dword ptr ds:[<&MFC42.#4441_?OnCommand@CWnd@@MAEHIJ@Z>]
但不是我们所要找的位置,还要继续分析.这里是最重要的了,在这地方有N多的连续jmp指令,我们向下查找,
找到OnCmdMsg,也就是下面的00401B66,在00401B66按F2设置中断
00401B66 .- FF25 30214000 jmp dword ptr ds:[<&MFC42.#4425_?OnCmdMsg@CDialog@@UAEHIHPAXPA>;
00401B6C .- FF25 34214000 jmp dword ptr ds:[<&MFC42.#3597_?GetRuntimeClass@CDialog@@UBEP>;
00401B72 $- FF25 38214000 jmp dword ptr ds:[<&MFC42.#324_??0CDialog@@QAE@IPAVCWnd@@@Z>] ;
再F9运行起来 程序终于在00401B66断了下来
然后F8让它执行下一步,运行到这里,这里是MFC领空
73D9DE90 > 8BFF mov edi, edi
73D9DE92 55 push ebp
73D9DE93 8BEC mov ebp, esp
73D9DE95 53 push ebx
73D9DE96 8B5D 08 mov ebx, dword ptr ss:[ebp+8]
73D9DE99 56 push esi
73D9DE9A 57 push edi
73D9DE9B FF75 14 push dword ptr ss:[ebp+14]
73D9DE9E 8B7D 0C mov edi, dword ptr ss:[ebp+C]
73D9DEA1 FF75 10 push dword ptr ss:[ebp+10]
再像上面的 在OD菜单里 查看->内存 在我们程序的.text区断访问设置中断
再F9运行起来,在00401340中断下来,这里虽然是程序自己领空,但还不是我我们所要地址
00401340 . B8 20234000 mov eax, MyCalcul.00402320
00401345 . C3 retn
F8两次后,又到MFC的73D32383 位置
73D32383 /EB 15 jmp short MFC42.73D3239A
73D32385 |FF75 08 push dword ptr ss:[ebp+8]
73D32388 |FF75 0C push dword ptr ss:[ebp+C]
73D3238B |53 push ebx
73D3238C |FF76 04 push dword ptr ds:[esi+4]
73D3238F |E8 DAFEFFFF call MFC42.#1145_?AfxFindMessageEntry@@YGPBUAFX_MSGMAP_ENTRY@@P>
73D32394 |85C0 test eax, eax
这时还要 像上面的 在OD菜单里 查看->内存 在我们程序的.text区断访问设置中断
F9运行起来,终在00401590断了下来 这里就是入口地址了!!
00401590 . 83EC 64 sub esp, 64
00401593 . A1 24304000 mov eax, dword ptr ds:[403024]
00401598 . 66:8B15 2C304>mov dx, word ptr ds:[40302C]
0040159F . 53 push ebx
004015A0 . 56 push esi
004015A1 . 8BF1 mov esi, ecx
以上地址会因程序的不同而不一样,但只要是MFC程序,按这个方法来找出入口地址都会找到的~
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)