能力值:
( LV2,RANK:10 )
|
-
-
26 楼
顶一个,学习ing.
|
能力值:
( LV9,RANK:150 )
|
-
-
27 楼
真的不错,受教了,呵呵,谢谢楼主
|
能力值:
( LV3,RANK:30 )
|
-
-
28 楼
谢谢,学到新东东了。
windows 2003下在MFC42.#4424_?OnCmdMsg@CCmdTarget@@UAEHIHP中对73EFEBE3下断,马上得到按钮处理程序的入口
CCmdTarget::OnCmdMsg()函数:
73EFEBD8 |> \8B4D 14 MOV ECX,DWORD PTR SS:[EBP+14]
73EFEBDB |. 8B50 10 MOV EDX,DWORD PTR DS:[EAX+10]
73EFEBDE |. 51 PUSH ECX ; /Arg7
73EFEBDF |. 8B4D 10 MOV ECX,DWORD PTR SS:[EBP+10] ; |
73EFEBE2 |. 52 PUSH EDX ; |Arg6
73EFEBE3 |. 8B50 14 MOV EDX,DWORD PTR DS:[EAX+14] ; |EDX中的地址为按钮处理程序入口
73EFEBE6 |. 8B45 08 MOV EAX,DWORD PTR SS:[EBP+8] ; |
73EFEBE9 |. 51 PUSH ECX ; |Arg5
73EFEBEA |. 8B4D FC MOV ECX,DWORD PTR SS:[EBP-4] ; |
73EFEBED |. 52 PUSH EDX ; |Arg4
73EFEBEE |. 57 PUSH EDI ; |Arg3
73EFEBEF |. 50 PUSH EAX ; |Arg2
73EFEBF0 |. 51 PUSH ECX ; |Arg1
73EFEBF1 |. E8 FAFCFFFF CALL MFC42.73EFE8F0 ; \MFC42.73EFE8F0
以后在别的程序中,这个断点一样管用:)不错不错,再次谢谢szdbg
|
能力值:
( LV3,RANK:30 )
|
-
-
29 楼
跟了一个VC8的程序,程序的消息泵处理函数在程序内部,不在MFC42.dll模块中
下面代码类似于MFC42.dll中的PumpMessage函数
0044BE30 /> /56 PUSH ESI
0044BE31 |. |57 PUSH EDI
0044BE32 |. |E8 7676FFFF CALL mbpoll.004434AD
0044BE37 |. |8BF8 MOV EDI,EAX
0044BE39 |. |33C0 XOR EAX,EAX
0044BE3B |. |50 PUSH EAX ; /MsgFilterMax => 0
0044BE3C |. |50 PUSH EAX ; |MsgFilterMin => 0
0044BE3D |. |50 PUSH EAX ; |hWnd => NULL
0044BE3E |. |8D77 30 LEA ESI,DWORD PTR DS:[EDI+30] ; |
0044BE41 |. |56 PUSH ESI ; |pMsg
0044BE42 |. |FF15 1C274800 CALL DWORD PTR DS:[<&USER32.GetMessageW>>; \GetMessageW
0044BE48 |. |85C0 TEST EAX,EAX
0044BE4A |. |74 25 JE SHORT mbpoll.0044BE71
0044BE4C |. |817F 34 6A030>CMP DWORD PTR DS:[EDI+34],36A
0044BE53 |. |74 19 JE SHORT mbpoll.0044BE6E
0044BE55 |. |56 PUSH ESI
0044BE56 >|. |E8 ACFEFFFF CALL mbpoll.0044BD07
0044BE5B |. |85C0 TEST EAX,EAX
0044BE5D |. |59 POP ECX
0044BE5E |. |75 0E JNZ SHORT mbpoll.0044BE6E
0044BE60 |. |56 PUSH ESI ; /pMsg
0044BE61 |. |FF15 20274800 CALL DWORD PTR DS:[<&USER32.TranslateMes>; \TranslateMessage
0044BE67 |. |56 PUSH ESI ; /pMsg
0044BE68 |. |FF15 8C254800 CALL DWORD PTR DS:[<&USER32.DispatchMess>; \DispatchMessageW
0044BE6E |> |33C0 XOR EAX,EAX
0044BE70 |. |40 INC EAX
0044BE71 |> |5F POP EDI
0044BE72 |. |5E POP ESI
0044BE73 |. |C3 RETN
0044BE74 |$ |E8 937BFFFF CALL mbpoll.00443A0C
0044BE79 |. |8B48 04 MOV ECX,DWORD PTR DS:[EAX+4]
0044BE7C |. |85C9 TEST ECX,ECX
0044BE7E |. |74 05 JE SHORT mbpoll.0044BE85
0044BE80 |. |8B01 MOV EAX,DWORD PTR DS:[ECX]
0044BE82 |. |FF60 5C JMP DWORD PTR DS:[EAX+5C]
0044BE85 \>^ E9 A6FFFFFF JMP mbpoll.0044BE30
对于调用MFC42.dll模块的程序,只要在OD中对MFC42.dll模块的关键点下断后,以后其他程序也可以利用这个关键点断下按钮处理,得到按钮处理函数的入口地址。
如果能根据按下按钮程序给出的相关信息找到按钮处理程序的任意点,你继续往后跟踪,会遇到类似下面的分支代码(类似楼主的_AfxDispatchCmdMsg()函数)
00438EC4 |. 83C0 C8 ADD EAX,-38 ; Switch (cases 38..43)
00438EC7 |. 83F8 0B CMP EAX,0B
00438ECA |. 56 PUSH ESI
00438ECB |. 0F87 C4000000 JA mbpoll.00438F95
00438ED1 |. FF2485 A08F43>JMP DWORD PTR DS:[EAX*4+438FA0] ; 消息处理函数
00438ED8 |> FF55 14 CALL DWORD PTR SS:[EBP+14] ; Case 38 ('8') of switch 00438EC4
00438EDB |. E9 B1000000 JMP mbpoll.00438F91
00438EE0 |> FF55 14 CALL DWORD PTR SS:[EBP+14] ; Case 39 ('9') of switch 00438EC4
00438EE3 |. E9 A7000000 JMP mbpoll.00438F8F
00438EE8 |> FF75 0C PUSH DWORD PTR SS:[EBP+C] ; Case 3A (':') of switch 00438EC4
00438EEB |> FF55 14 CALL DWORD PTR SS:[EBP+14]
00438EEE |. E9 9E000000 JMP mbpoll.00438F91
00438EF3 |> FF75 0C PUSH DWORD PTR SS:[EBP+C] ; Case 3B (';') of switch 00438EC4
继续往上翻,查看由谁调用了该处代码,即可找到由下面程序调用了该处代码,下面程序相当于楼主提到的CCmdTarget::OnCmdMsg()函数
004390D0 |> \FF75 14 PUSH DWORD PTR SS:[EBP+14] ; /Arg7
004390D3 |. FF70 10 PUSH DWORD PTR DS:[EAX+10] ; |Arg6
004390D6 |. FF75 10 PUSH DWORD PTR SS:[EBP+10] ; |Arg5
004390D9 |. FF70 14 PUSH DWORD PTR DS:[EAX+14] ; |Arg4
004390DC |. FF75 0C PUSH DWORD PTR SS:[EBP+C] ; |Arg3
004390DF |. FF75 08 PUSH DWORD PTR SS:[EBP+8] ; |Arg2
004390E2 |. 57 PUSH EDI ; |Arg1
004390E3 |. E8 B0FDFFFF CALL mbpoll.00438E98 ; \mbpoll.00438E98
004390E8 \.^ EB DF JMP SHORT mbpoll.004390C9
而004390D9 |. FF70 14 PUSH DWORD PTR DS:[EAX+14] 中存放的就是按钮处理程序的入口地址。
|
能力值:
( LV9,RANK:210 )
|
-
-
30 楼
不错,不错,很好,万变不离其宗!
你高兴,我快乐 .. ....
|
能力值:
( LV9,RANK:490 )
|
-
-
31 楼
好文章,学习了!
|
能力值:
( LV2,RANK:10 )
|
-
-
32 楼
确实很不错的说,调试mfc确实头疼!
|
能力值:
( LV2,RANK:10 )
|
-
-
33 楼
好文,不能不顶啊!
|
能力值:
( LV2,RANK:10 )
|
-
-
34 楼
mfcspy 用起来不是更方便??
|
能力值:
( LV2,RANK:10 )
|
-
-
35 楼
MFC其实反编译后大部分都是库代码,找其中的逻辑代码可以比较有用
|
能力值:
( LV2,RANK:10 )
|
-
-
36 楼
强烈支持出bcb和delphi版本
|
能力值:
( LV2,RANK:10 )
|
-
-
37 楼
需要强顶!!!
|
能力值:
( LV12,RANK:210 )
|
-
-
38 楼
不管什么东西,什么知识,只有需要用到了,才知道这是多么的宝贵!!!
曾经这个文章飘过好多次,也看过,没想到今天用到了,才知道这个文章写的是这么的好……
特意过来顶一下……
PS:感谢LZ的无私奉献……
|
能力值:
( LV2,RANK:10 )
|
-
-
39 楼
好晕呀,楼主怎么不简单总结一下,直接拿个按钮来演示一下,如何在OD里快速断点?新手没几个有那么耐心学完这MFC的消息分发机制,而且对于没编过MFC程序的人来说根本是理解不了的。
|
能力值:
( LV2,RANK:10 )
|
-
-
40 楼
好贴呀。学习学习。
|
能力值:
( LV2,RANK:10 )
|
-
-
41 楼
写了好多,正为mfc的消息机制头疼,顶楼主
|
能力值:
( LV2,RANK:10 )
|
-
-
42 楼
好文章,顶一下
|
能力值:
( LV2,RANK:10 )
|
-
-
43 楼
看的头大,内功不行
|
能力值:
( LV2,RANK:10 )
|
-
-
44 楼
学习了.............
|
能力值:
( LV2,RANK:10 )
|
-
-
45 楼
MFC没学好,但还是得顶一个
|
能力值:
( LV2,RANK:10 )
|
-
-
46 楼
看不完了~~~~头都大了~~~我还是去好好学习基础吧~~~
|
能力值:
( LV2,RANK:10 )
|
-
-
47 楼
学习了,消息是WINDOWS之根
|
能力值:
( LV4,RANK:50 )
|
-
-
48 楼
顶楼主,好文章,学习一下
|
能力值:
( LV2,RANK:10 )
|
-
-
49 楼
学习了 谢谢LZ
|
能力值:
( LV2,RANK:10 )
|
-
-
50 楼
沙发,学习.....再学习...........,前进.......
|
|
|