首页
社区
课程
招聘
[原创]MFC程序逆向 – 消息篇(上)+(下) 11楼
发表于: 2007-10-31 06:26 73920

[原创]MFC程序逆向 – 消息篇(上)+(下) 11楼

2007-10-31 06:26
73920
收藏
免费 8
支持
分享
最新回复 (68)
雪    币: 311
活跃值: (124)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
26
顶一个,学习ing.
2007-11-2 23:29
0
雪    币: 359
活跃值: (430)
能力值: ( LV9,RANK:150 )
在线值:
发帖
回帖
粉丝
27
真的不错,受教了,呵呵,谢谢楼主
2007-11-2 23:47
0
雪    币: 1341
活跃值: (3616)
能力值: ( 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
2007-11-4 09:48
0
雪    币: 1341
活跃值: (3616)
能力值: ( 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] 中存放的就是按钮处理程序的入口地址。
2007-11-4 10:57
0
雪    币: 266
活跃值: (52)
能力值: ( LV9,RANK:210 )
在线值:
发帖
回帖
粉丝
30
不错,不错,很好,万变不离其宗!

你高兴,我快乐 .. ....
2007-11-4 11:57
0
雪    币: 1919
活跃值: (901)
能力值: ( LV9,RANK:490 )
在线值:
发帖
回帖
粉丝
31
好文章,学习了!
2007-11-4 19:51
0
雪    币: 215
活跃值: (15)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
32
确实很不错的说,调试mfc确实头疼!
2007-11-24 11:52
0
雪    币: 210
活跃值: (43)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
33
好文,不能不顶啊!
2007-11-30 17:16
0
雪    币: 200
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
34
mfcspy 用起来不是更方便??
2007-12-3 14:13
0
雪    币: 203
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
35
MFC其实反编译后大部分都是库代码,找其中的逻辑代码可以比较有用
2007-12-3 17:57
0
雪    币: 116
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
36
强烈支持出bcb和delphi版本
2007-12-3 19:20
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
37
需要强顶!!!
2008-12-5 16:31
0
雪    币: 65
活跃值: (811)
能力值: ( LV12,RANK:210 )
在线值:
发帖
回帖
粉丝
38
不管什么东西,什么知识,只有需要用到了,才知道这是多么的宝贵!!!
曾经这个文章飘过好多次,也看过,没想到今天用到了,才知道这个文章写的是这么的好……

特意过来顶一下……
PS:感谢LZ的无私奉献……
2009-1-31 21:44
0
雪    币: 200
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
39
好晕呀,楼主怎么不简单总结一下,直接拿个按钮来演示一下,如何在OD里快速断点?新手没几个有那么耐心学完这MFC的消息分发机制,而且对于没编过MFC程序的人来说根本是理解不了的。
2009-2-27 13:23
0
雪    币: 411
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
40
好贴呀。学习学习。
2009-2-27 13:55
0
雪    币: 218
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
41
写了好多,正为mfc的消息机制头疼,顶楼主
2009-6-14 14:09
0
雪    币: 190
活跃值: (22)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
42
好文章,顶一下
2009-6-18 16:46
0
雪    币: 220
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
43
看的头大,内功不行
2009-6-19 18:14
0
雪    币: 56
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
44
学习了.............
2009-6-19 18:39
0
雪    币: 245
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
45
MFC没学好,但还是得顶一个
2009-6-20 21:38
0
雪    币: 6
活跃值: (12)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
46
看不完了~~~~头都大了~~~我还是去好好学习基础吧~~~
2009-6-24 20:20
0
雪    币: 129
活跃值: (1095)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
47
学习了,消息是WINDOWS之根
2009-6-29 22:00
0
雪    币: 210
活跃值: (11)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
48
顶楼主,好文章,学习一下
2009-7-10 14:41
0
雪    币: 325
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
49
学习了  谢谢LZ
2009-7-10 16:16
0
雪    币: 23
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
50
沙发,学习.....再学习...........,前进.......
2009-8-10 15:27
0
游客
登录 | 注册 方可回帖
返回
//