破解常用断点设置

来源:互联网 发布:淘宝群词荟萃 编辑:程序博客网 时间:2024/05/17 03:52
对不同平台生成的程序,分别处理:


一、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,然后再代码段下断,再执行,直到有跳转到程序真正领空,那才是真正的处理地方






bpx hmemcpy                                  ;破解万能断点,拦截内存拷贝动作(注意:Win9x专用断点) 
bpx Lockmytask                               ;当你用其它断点都无效时可以试一下,这个断点拦截按键的动作(Win9x专用)


实在找不到断点可以试下面的方法:
bmsg handle wm_gettext               ;拦截注册码(handle为对应窗口的句柄)
bmsg handle wm_command            ;拦截OK按钮(handle为对应窗口的句柄)


拦截窗口:
bpx CreateWindow                            ;创建窗口 
bpx CreateWindowEx(A/W)              ;创建窗口
bpx ShowWindow                              ;显示窗口
bpx UpdateWindow                           ;更新窗口
bpx GetWindowText(A/W)                ;获取窗口文本


拦截消息框:
bpx MessageBox(A/W)                       ;创建消息框
bpx MessageBoxExA(W)                    ;创建消息框
bpx MessageBoxIndirect(A/W)          ;创建定制消息框
拦截警告声:
bpx MessageBeep                               ;发出系统警告声(如果没有声卡就直接驱动系统喇叭发声)
拦截对话框:
bpx DialogBox                                        ;创建模态对话框                                      
bpx DialogBoxParam(A/W)                     ;创建模态对话框
bpx DialogBoxIndirect                            ;创建模态对话框
bpx DialogBoxIndirectParam(A/W)        ;创建模态对话框
bpx CreateDialog                                   ;创建非模态对话框
bpx CreateDialogParam(A/W)                ;创建非模态对话框
bpx CreateDialogIndirect                       ;创建非模态对话框
bpx CreateDialogIndirectParam(A/W)    ;创建非模态对话框
bpx GetDlgItemText(A/W)                      ;获取对话框文本
bpx GetDlgItemInt                                   ;获取对话框整数值
拦截剪贴板:
bpx GetClipboardData                             ;获取剪贴板数据
拦截注册表:
bpx RegOpenKey(A/W)                          ;打开子健 ( 例:bpx RegOpenKey(A) if *(esp->8)=='****' )
bpx RegOpenKeyExA(W)                       ;打开子健 ( 例:bpx RegOpenKeyEx if *(esp->8)=='****' )
bpx RegQueryValue(A/W)                      ;查找子健 ( 例:bpx RegQueryValue(A) if *(esp->8)=='****' )
bpx RegQueryValueEx(A/W)                  ;查找子健 ( 例:bpx RegQueryValueEx if *(esp->8)=='****' )
bpx RegSetValue(A/W)                           ;设置子健 ( 例:bpx RegSetValue(A) if *(esp->8)=='****' ) 
bpx RegSetValueEx(A/W)                       ;设置子健 ( 例:bpx RegSetValueEx(A) if *(esp->8)=='****' )
注意:'****'为指定子键名的前4个字符,如子键为'Regcode',则'****'= 'Regc' 


功能限制拦截断点:
bpx EnableMenuItem                                ;禁止或允许菜单项 
bpx EnableWindow                                   ;禁止或允许窗口
bmsg hMenu wm_command                      ;拦截菜单按键事件,其中hMenu为菜单句柄
bpx K32Thk1632Prolog                             ;配合bmsg hMenu wm_command使用,可以通过这个断点进入菜单处理程序 
                                                                  应用示例: 
                                                                  CALL [KERNEL32!K32Thk1632Prolog] 
                                                                  CALL [......]                    <-- 由此跟踪进入菜单处理程序 
                                                                  CALL [KERNEL32!K32Thk1632Epilog]


拦截时间:
bpx GetLocalTime                                      ;获取本地时间 
bpx GetSystemTime                                  ;获取系统时间
bpx GetFileTime                                         ;获取文件时间
bpx GetTickCount                                      ;获得自系统成功启动以来所经历的毫秒数
bpx GetCurrentTime                                  ;获取当前时间(16位)
bpx SetTimer                                             ;创建定时器
bpx TimerProc                                            ;定时器超时回调函数
拦截文件:
bpx CreateFileA(W)                                   ;创建或打开文件 (32位)
bpx OpenFile                                              ;打开文件       (32位)
bpx ReadFile                                               ;读文件         (32位)
bpx WriteFile                                               ;写文件         (32位)
bpx _lcreat                                                 ;创建或打开文件 (16位)
bpx _lopen                                                  ;打开文件       (16位)
bpx _lread                                                    ;读文件         (16位)
bpx _lwrite                                                  ;写文件         (16位)
bpx _hread                                                  ;读文件         (16位)
bpx _hwrite                                                 ;写文件         (16位)
拦截驱动器:
bpx GetDrivetype(A/W)                               ;获取磁盘驱动器类型
bpx GetLogicalDrives                                    ;获取逻辑驱动器符号
bpx GetLogicalDriveStringsA(W)                  ;获取当前所有逻辑驱动器的根驱动器路径
拦截狗:
bpio -h 378(或278、3BC) R                          ;378、278、3BC是并行打印端口
bpio -h 3F8(或2F8、3E8、2E8) R                 ;3F8、2F8、3E8、2E8是串行端口
VB程序专用断点:
bpx msvbvm60!rtcMsgBox 
bpx msvbvm60!__vbaStrCmp 
bpx msvbvm60!__vbaStrComp 
bpx msvbvm60!__vbaStrCompVar 
bpx msvbvm60!__vbaStrTextCmp 
bpx msvbvm60!__vbaFileOpen 
bpx msvbvm60!__vbaInputFile 
bpx msvbvm60!__vbaFileSeek 
bpx msvbvm60!__vbaWriteFile 
bpx msvbvm60!__vbaFileClose 
bpx msvbvm60!rtcFileAttributes 
bpx msvbvm60!rtcFileDateTime 
bpx msvbvm60!rtcFileLen 
bpx msvbvm60!rtcFileLength 
bpx msvbvm60!__vbaVarInt 
bpx msvbvm60!__vbaVarCmpGe 
bpx msvbvm60!__vbaVarCmpGt 
bpx msvbvm60!__vbaVarCmpLe 
bpx msvbvm60!__vbaVarCmpLt 
bpx msvbvm60!__vbaVarCmpNe 
bpx msvbvm60!__vbaVarTextCmpEq 
bpx msvbvm60!__vbaVarTextCmpGe 
bpx msvbvm60!__vbaVarTextCmpGt 
bpx msvbvm60!__vbaVarTextCmpLe 
bpx msvbvm60!__vbaVarTextCmpLt 
bpx msvbvm60!__vbaVarTextCmpNe 
bpx msvbvm60!__vbaVarTextTstEq 
bpx msvbvm60!__vbaVarTextTstGe 
bpx msvbvm60!__vbaVarTextTstGt 
bpx msvbvm60!__vbaVarTextTstLe 
bpx msvbvm60!__vbaVarTextTstLt 
bpx msvbvm60!__vbaVarTextTstNe 
bpx msvbvm60!__vbaVarTstEq 
bpx msvbvm60!__vbaVarTstGe 
bpx msvbvm60!__vbaVarTstGt 
bpx msvbvm60!__vbaVarTstLe 
bpx msvbvm60!__vbaVarTstLt 
bpx msvbvm60!__vbaVarTstNe 
注意:VB程序仍然可以使用普通API函数,只要函数“最终”CALL了这个函数 
上面的断点对应VB6程序,如果是VB5程序则将msvbvm60改成msvbvm50即可


找万能断点方法:
1.用OD载入目标程序crackme(见上面附件)
2.Ctrl+N打开当前模块中的名称,或鼠标右键-->搜索-->当前模块中的名称;
选中USER32.DLL中的函数TranslateMessage。
3.在此函数上按鼠标右键-->"在导入中条件记录断点",在"条件"下面的框中
添入MSG==201(不工作就设为202),"表达"添MSG,选中"条件满足时暂停
程序",点"确定"。
4.F9运行程序,填入用户名,按Tab键跳到注册码框(别用鼠标点,记住用Tab键),填入假注册 麻,点"OK",OD将停在所下条件断点上
5.Alt+M打开内存镜像,鼠标右键-->搜索(或Ctrl+B),在弹出窗口中ASCII栏中
输入上面所填"假注册码",点"确定"搜索。
6.在找到的假注册码位置下"内存访问断点"。
7.F9,断在那儿的地址就是你机器的万能断点 
原创粉丝点击