追踪MFC的按钮事件学习笔记

阅读了“MFC程序逆向  消息篇(上)+(下)”一文后,收获颇丰。作者提到对于对话框程序,在这个函数函数入口处设置断点最好(请记住这个函数:CCmdTarget::OnCmdMsg())。在学习的过程中,对OD的一些使用方法进一步加深了理解。
首先用VC6.0建立一个基于对话框的MFC程序,分别采用动态链接(TraceButtonDynamic.exe)和静态链接(TraceButtonStatic.exe)生成。
1.  动态链接的程序分析
(1)首先用IDA找到CCmdTarget::OnCmdMsg()的地址。在我的计算机中为0040157C. 


(2)用OD载入,CTRL+G,输入0040157C,来到0040157C 。 


        可以看到有一jmp语句,Enter进入。这里就是:OnCmdMsg()的入口处。 


        向下翻倒push    dword ptr [eax+14], F2下断,运行程序。


        单击“hello,world”按钮,可以看到00401480,就是按钮所处理的东西。 


        CTRL+G,输入00401480,来到00401480。OK,搞定。 


(3)更简单的方法。
        重新载入TraceButtonDynamic.exe。Alt+ E,载入DLL模块,双击MFC42.   

       
        来到MFC42.dll 


        CTRL+S, 输入
        push    dword ptr [ebp+14]
        push    dword ptr [eax+10]
        push    dword ptr [ebp+10]
        push    dword ptr [eax+14]
        push    dword ptr [ebp+C]
        push    dword ptr [ebp+8]
        单击查找。 


        在“push    dword ptr [eax+14]”, F2下断即可
2.静态链接的程序分析。
     Od载入。CTRL+S,输入指令序列。 


     单击查找,在“push    dword ptr [eax+14]”, F2下断即可。



     当然还可以在语句序列下面的call处F7进入(本例为call    004157F5)。进入后,直接在
    “call            dword ptr [ebp+14]”这条语句出下断。当然可以用搜索的方法。


 
以上是本人的一些学习心得,不妥之处,敬请指正。
                                                                  2009-09-17
                                                                  By littlewisp

上传的附件 TraceButton.rar