原文:http://bbs.pediy.com/showthread.php?t=20078
首先
1 od 下运行程序,F12 暂停;
2 View菜单中选击Windows项,在打开的窗口中可以从Title栏看到目标按钮,从而找到它的Handle(xxxxxxxx) ;
对不同平台生成的程序,分别处理:
一、VB, Delphi, CBuilder 程序:
3 在CallWindowProcA入口下条件断点: [esp+8]==xxxxxxxx && [esp+0c]==202;
4 F9继续程序,点击目标按钮,程序中断;
5 Alt+F4,在代码段(.text)上下访问断点;
6 F9执行程序,程序中断,
1). VB程序中断在下面代码
PUSH DWORD PTR DS:[EAX+EBX] ; yyyyyyy
上面[EAX+EBX]的值(yyyyyy)就是我们要找的位置。
2). Delphi, CBuilder 的程序
程序直接断在我们要找的位置。
借moon一句,这姑妄称作CallWindowProcA条件断点加上code段内存断点法吧。
二、VC程序
又分MFC和Win32两种情况,二者相同之处:
3 在IsDialogMessageW入口下条件断点: [[esp+8]]==xxxxxxxx && [[esp+8]+4]==202
4 F9继续程序,点击目标按钮,程序中断;
5 Alt+F4,在代码段上下访问断点;
6 F9执行程序,程序中断, 注意这里虽然中断在code段,但却不是处理Button点击事件的代码处
这时:
对Win32程序,只需要按几下F7,当回到User32.dll领空后再重复一次第 5、6步就可以了;
而对于MFC程序,我们不得不多次重复这样的操作:单步回到MFC领空,再第 5、6步。好在已经看到大陆啦!
类比,这就叫IsDialogMessageW条件断点加上code段内存断点法了。
敬请各位指正。
======================================================================================
下面的内容则摘自看雪精华2011,作者:guxinyi
得到按钮响应函数地址的方法:
1、在MFC42.DLL的偏移0x23BA处下断点,进入这个函数后,遇见的第一个CALL就是进入程序空间
2、下消息断点
WinDbg中的断点:
MFC程序:
bp User32!IsDialogMessageA ".if( poi( poi(esp+8) ) == 控件的句柄 and poi( poi(esp+8) + 4 ) == WM_LBUTTONUP ){}.else{gc}"
OD中的断点:
vc
bp IsDialogMessageA [[esp+8]]==控件的句柄 && [[esp+8]+4]==WM_LBUTTONUP
VB, Delphi, CBuilder
bp CallWindowProcA [esp+8]==控件的句柄 && [esp+0c]==WM_LBUTTONUP
=======================================================================================
来源:http://www.cnblogs.com/huhu0013/archive/2011/03/31/2000707.html
工具:OllyDbg、Delphi程序一个、易语言程序一个、MFC程序一个
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
《《《Delphi程序》》》
特征码:FF 93 20 01 00 00 5B C3 53
-----------------------------------------------------------------------------
《《《易语言程序》》》
特征码:FF 55 FC 5F 5E 89 5D F4
特征码来源:krnln.fnr
-----------------------------------------------------------------------------
《《《MFC程序》》》
RELEASE
特征码:FF 55 14 EB 7F FF 75 0C
特征码来源:MFC42.DLL
DEBUG
特征码:FF 55 FC E9 48 04 00 00 33 C9
特征码来源:MFC42D.DLL
-----------------------------------------------------------------------------
使用方法:OD载入程序---F9运行---Alt+M打开内存镜像---Ctrl+B搜索特征码---Ctrl+G跳到找到的地址---F2下断---点击按钮---断下后F7进入CALL(此处即为事件代码)
说明:对于Delphi程序和易语言程序,根据目前测试的情况来看,都是一击必杀,例无虚发
对于MFC程序只取了VC++6.0的特征码
易语言程序下断后,可能界面没出来就断下了,这是因为断下的是[启动窗口创建完毕事件]或[时钟周期事件]
-----------------------------------------------------------------------------
-----------------------------------------------------------------------------
欢迎暴力测试,有问题楼下说明!
得到按钮响应函数地址的方法:
1、在MFC42.DLL的偏移0x23BA处下断点,进入这个函数后,遇见的第一个CALL就是进入程序空间
2、下消息断点
WinDbg中的断点:
MFC程序:
bp User32!IsDialogMessageA ".if( poi( poi(esp+8) ) == 控件的句柄 and poi( poi(esp+8) + 4 ) == WM_LBUTTONUP ){}.else{gc}"
OD中的断点:
vc
bp IsDialogMessageA [[esp+8]]==控件的句柄 && [[esp+8]+4]==WM_LBUTTONUP
VB, Delphi, CBuilder
bp CallWindowProcA [esp+8]==控件的句柄 && [esp+0c]==WM_LBUTTONUP
本文介绍了通过特征码和断点技术定位不同编程语言(如VB、Delphi、CBuilder、VC等)中按钮响应事件的具体方法。包括设置条件断点、内存断点及使用OD或WinDbg进行调试。同时提供了适用于Delphi、易语言、MFC程序的特征码,以及获取按钮响应函数地址的步骤。通过实例演示如何在OD中实现快速定位和跟踪事件处理过程。

3089

被折叠的 条评论
为什么被折叠?



