OD对按钮下断点的方法

首先
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段内存断点法了。 


敬请各位指正。 


当上面的方法不行的时候,也可以使用TranslateMessage
这个时候就要[[esp+4]]==xxxxxxxx && [[esp+4]+4]==202,因为只有一个参数传入
对于win32 程序,断下,然后在代码段下断,执行后,会来到消息循环的地方,这个时候再F7,进入user32.dll,然后再在代码段下断点,F9就应该来到真正的处理地点了
对于MFC       ,要麻烦点,进入mfc,然后一下F8,然后再代码段下断,再执行,直到有跳转到程序真正领空,那才是真正的处理地方

你可能感兴趣的:(逆向杂谈)