首页
社区
课程
招聘
[找MFC程序的按钮消息处理函数]
发表于: 2018-5-25 15:18 6181

[找MFC程序的按钮消息处理函数]

2018-5-25 15:18
6181
小弟在破一个MFC编写的软件(用VS2008写的),现在用OD调试的时候遇到的了困难。
       问题如下:
               已用工具找到了一个我需要点击的BUTTON的句柄,然后在OD 的 W 界面上对该句柄的BUTTON设置WINPROC断点,设置的为 WM_LBUTTONUP。          设置完后F9运行OD,再去界面上点击该BUTTON,OD暂停。我想找到该BUTTON所触发的消息处理事件,找到如:::OnBnClickedButton() 这样的处理函
       数位置跟进去看干了什么。
              之前看了网上的一些方法如:
                 1. 首先下消息断点WM_LBUTTONUP, 或者使用bp TranslateMessage MSG==WM_LBUTTONUP
                 2.点按钮会断在USER32模块中, ALT+M选择代码段F2下断点,再F9运行, 会看到执行到
                    0040160A   .- FF25 E0204000 jmp     dword ptr [<&MFC42.#6374_CWnd::W>;  MFC42.#6374_CWnd::WindowProc
                 3. 在这里会比较坑爹, F8进去之后, ALT+M选择代码段F2下断点,再F9运行, 然后反反复复都是差不多这个位置, 最好的办法是在WindowProc下面找到                       这句下断点
                    00401670   .- FF25 24214000 jmp     dword ptr [<&MFC42.#4425_CDialog>;  MFC42.#4431_CPropertySheet::OnCmdMsg
                4.F9运行起来, F8进去之后, ALT+M选择代码段F2下断点,再F9运行,会看到执行到这条语句
                    00401230   .  B8 E0224000   mov     eax, 004022E0
                5.单步运行,会到MFC42模块里, 继续F8单步,会看到下面有一个call
                    73D323BA    E8 7F000000     call    73D3243E
               6., 在这里ALT+M,再选择 代码段F2下断点, F9运行,OK! 跳到消息响应处理的代码里.
                   00401470   .  6A 00         push    0
                   00401472   .  68 FC304000   push    004030FC
                   00401477   .  68 20304000   push    00403020                         ;  ASCII "OnButton1"
                   0040147C   .  E8 37020000   call    <jmp.&MFC42.#4224_CWnd::MessageB>

                   00401481   .  C3            retn

         ========================分割线       接下来是我的一些问题====================================

         1.上面的方法说在代码段下断,这个软件有许多代码段,保险起见是在 M 窗口的 .text 处都下断吧?

         2.上面方法的MFC的标识符能标识出来,我的OD也能,也有MFC42D.LIB这个库,但是就是很多标识不出来,比如我用OD打开需要破解的软件后安照上面

            的方法来并没有看到 <&MFC42.#6374_CWnd::W>和 <&MFC42.#4425_CDialog 这种。

         我显示的标识情况是这个样的:

            

         3.这个是重中之重,有什么好的方法可以指引我找到这个 BUTTON 的消息处理函数呢?



[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (10)
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
没人吗?自己顶下,希望大家帮忙分析指导下
2018-5-25 15:39
0
雪    币: 486
活跃值: (583)
能力值: ( LV12,RANK:238 )
在线值:
发帖
回帖
粉丝
3
1.  程序有很多段,下断点在.text  段。
2.  <&MFC42.#4425_CDialog  可能原因是目标程序链接的realse版本,而这个版本是没有符号,按照序号连接。
3.  你考本那段非常正确。只不过你迷失了。你的消息断点是在万能断点(网上能搜到)所在函数的下一级。消息处理在后边又经过了很多MFC的函数处理。如果MFC库是采用动态链接,那么在.text段下断点的方法能较快定位,好像也要经过很多次。如果是静态链接那么,MFC的代码和你处理事件代码在同一空间,这种方法好像很困难。
4.  建议你自己写一个MFC程序采用然后在IDE下,下BUTTON的断点,就可以从函数堆栈中看到调用了哪些MFC函数(这些都是固定模式,或者叫MFC的消息路由)。
5.  以下是我以前总结的。已经够忘了,你可以参考下定位(对静态库连接也有效)。

语音表达很苍白,大致意思是挨个函数定位.然后就可以定位到你的BUTTON函数。建议自己写的MFC调试,可以有个对照。
AfxWndProc        360        WM_QUERYAFXWNDPROC
       AfxCallWndProc
AfxCallWndProc        FS[0]
关键值2个0x110  WM_INITDIALOG  之间定位函数  call  eax
       pWnd->WindowProc

pWnd->WindowProc(短)  call  reg  第一个函数  无明显特征码
       OnWndMsg

OnWndMsg    FS[0]  0x111  WM_INITDIALOG        之后第一个函数  call  edx
       if  (message  ==  WM_COMMAND)  if  (OnCommand(wParam,  lParam))

CDialogEx::OnCommand  最后一个call  短小  常量call        含Iswindow函数
       CDialog::OnCommand  (第二个call)
CDialog::OnCommand        ->  OnCmdMsg        VS2010  2次调用
       CDialog::OnCmdMsg  最后一个函数  IsWindow    ReflectLastMsg  等函数

CDialog::OnCmdMsg        第一个call,-1  0x8000  F000
       CCmdTarget::OnCmdMsg

CCmdTarget::OnCmdMsg(长代码)最后找      AfxFindMessageEntry    _AfxDispatchCmdMsg

_AfxDispatchCmdMsg  中有一个函数指针  7个参数,中间第四个为地址。
最后一个call调用事件跟随调用的call指令进入即可

2018-5-25 16:17
0
雪    币: 4859
活跃值: (2774)
能力值: ( LV3,RANK:20 )
在线值:
发帖
回帖
粉丝
4
vs  调试  Button下断点看栈回溯   
2018-5-25 16:19
0
雪    币: 486
活跃值: (583)
能力值: ( LV12,RANK:238 )
在线值:
发帖
回帖
粉丝
5
此外,MFC42的库应该是更早的编译器吧。不是VS2008吧?
2018-5-25 16:23
0
雪    币: 259
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
6
我是看网上说放一个dll关于MFC标识符的在OD的lib目录下就可以显示MFC的标识符出来,所以找了MFC42.dll  。
2018-5-25 17:39
0
雪    币: 576
活跃值: (2035)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
上ida更靠谱,不壳的话,
2018-5-25 18:00
0
雪    币: 299
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
mxr
8
顶下。
2018-5-25 19:04
0
雪    币: 4
活跃值: (14)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
程序发过来,我给你找
2018-5-26 23:45
0
雪    币: 3554
活跃值: (1877)
能力值: ( LV6,RANK:93 )
在线值:
发帖
回帖
粉丝
10
试试xspy  https://github.com/lynnux/xspy
2018-5-28 15:12
0
雪    币: 1808
活跃值: (578)
能力值: ( LV6,RANK:80 )
在线值:
发帖
回帖
粉丝
11
https://bbs.pediy.com/thread-248810.htm
https://bbs.pediy.com/thread-248816.htm
这两篇能帮到你
2019-1-6 11:15
1
游客
登录 | 注册 方可回帖
返回
//