好友
阅读权限20
听众
最后登录1970-1-1
|
本帖最后由 Chenxs110 于 2012-7-25 23:48 编辑
首先跪拜一下Sound哥的大作:http://www.52pojie.cn/thread-151725-1-1.html
Sound哥的计算器附件应该是8.0编译的吧.
后来自己测试了一下VC6下的找法.
1.载入测试文件:
停在oep处:
2.直接来到GetModuleHandleA之后的第一个call主程序模块并下断点,F7跟进
00401824 |> 50 PUSH EAX ; /Arg4
00401825 |. 56 PUSH ESI ; |Arg3
00401826 |. 53 PUSH EBX ; |Arg2
00401827 |. 53 PUSH EBX ; |/pModule
00401828 |. FF15 00204000 CALL DWORD PTR DS:[<&KERNEL32.GetModuleH>; |\GetModuleHandleA
0040182E |. 50 PUSH EAX ; |Arg1
0040182F |. E8 5E000000 CALL FindWinP.00401892 ; \FindWinP.00401892
00401834 |. 8945 98 MOV DWORD PTR SS:[EBP-68],EAX
3.进入MFC模块领空,直接alt+m对程序主模块code段F2,然后F9来到这里(进入MFC领空实际上是调用AfxWinMain,位于MFC模块中.dependency walker查不到这个东西)
initapp
(这里实际上是准备调用CWinApp::InitApplication)
4.F7再进入MFC领空,然后再重复第三步的操作来到这里
.text:004010B0 ; 这里是CxxxxApp::InitInstance(void)
.text:004010B0
.text:004010B0 sub_4010B0 proc near ; DATA XREF: .rdata:00402270o
.text:004010B0
.text:004010B0 var_70 = byte ptr -70h
.text:004010B0 var_C = dword ptr -0Ch
.text:004010B0 var_4 = dword ptr -4
.text:004010B0
.text:004010B0 push 0FFFFFFFFh
.text:004010B2 push offset SEH_4010B0
.text:004010B7 mov eax, large fs:0
.text:004010BD push eax
.text:004010BE mov large fs:0, esp
.text:004010C5 sub esp, 64h
.text:004010C8 push esi
.text:004010C9 mov esi, ecx
.text:004010CB push 0
.text:004010CD call AfxEnableControlContainer(COccManager *)
.text:004010D2 add esp, 4
.text:004010D5 mov ecx, esi
.text:004010D7 call CWinApp::Enable3dControls(void)
.text:004010DC push 0
.text:004010DE lea ecx, [esp+78h+var_70]
.text:004010E2 call sub_4011C0 ; 这里是我们从CDialog类继承过来的子类别的构造函数
.text:004010E7 lea eax, [esp+74h+var_70]
.text:004010EB lea ecx, [esp+74h+var_70]
.text:004010EF mov [esp+74h+var_4], 0
.text:004010F7 mov [esi+20h], eax
找到构造函数也就找到了this指针,接下来就可以顺藤摸瓜this指针-->虚函数表-->虚函数表中的GetMessageMap-->AFX_MSGMAP_ENTRY结构.
再从AFX_MSGMAP_ENTRY中扒出我们想要的按钮处理函数.
第一篇文章,难免有不错误或者有不详尽的地方,若有错误或者遗漏的地方.欢迎指出.
|
免费评分
-
查看全部评分
|
发帖前要善用【论坛搜索】功能,那里可能会有你要找的答案或者已经有人发布过相同内容了,请勿重复发帖。 |
|
|
|
|