首页 > 代码库 > 破解常用断点设置

破解常用断点设置

bpx hmemcpy    破解万能断点,拦截内存拷贝动作
bpx Lockmytask 当你用其它断点都无效时可以试一下,这个断点拦截按键的动作
bmsg handle wm_gettext 拦截注册码(handle为对应窗口的句柄)
bmsg handle wm_command 拦截OK按钮(handle为对应窗口的句柄)


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


拦截消息框:

bpx MessageBox(A) 创建消息框
bpx MessageBoxExA 创建消息框
bpx MessageBoxIndirect(A) 创建定制消息框


拦截警告声:
bpx MessageBeep 发出系统警告声(如果没有声卡就直接驱动系统喇叭发声)


拦截对话框:
bpx DialogBox         创建模态对话框
bpx DialogBoxParam(A) 创建模态对话框
bpx DialogBoxIndirect 创建模态对话框
bpx DialogBoxIndirectParam(A) 创建模态对话框
bpx CreateDialog         创建非模态对话框
bpx CreateDialogParam(A) 创建非模态对话框
bpx CreateDialogIndirect 创建非模态对话框
bpx CreateDialogIndirectParam(A) 创建非模态对话框
bpx GetDlgItemText(A)    获取对话框文本
bpx GetDlgItemInt        获取对话框整数值


拦截剪贴板:
bpx GetClipboardData 获取剪贴板数据


拦截注册表:
bpx RegOpenKey(A)    打开子健 ( 例:bpx RegOpenKey(A) if *(esp+8)==‘****‘ )
bpx RegOpenKeyEx     打开子健 ( 例:bpx RegOpenKeyEx if *(esp+8)==‘****‘ )
bpx RegQueryValue(A) 查找子健 ( 例:bpx RegQueryValue(A) if *(esp+8)==‘****‘ )
bpx RegQueryValueEx  查找子健 ( 例:bpx RegQueryValueEx if *(esp+8)==‘****‘ )
bpx RegSetValue(A)   设置子健 ( 例:bpx RegSetValue(A) if *(esp+8)==‘****‘ )
bpx RegSetValueEx(A) 设置子健 ( 例: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  创建或打开文件 (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) 获取磁盘驱动器类型
bpx GetLogicalDrives 获取逻辑驱动器符号
bpx GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径


拦截狗:
bpio -h 378(或278、3BC) R 378、278、3BC是并行打印端口
bpio -h 3F8(或2F8、3E8、2E8) R 3F8、2F8、3E8、2E8是串行端口


VB程序专用断点:
bpx msvbvm50!__vbaStrCmp   比较字符串是否相等
bpx msvbvm50!__vbaStrComp  比较字符串是否相等
bpx msvbvm50!__vbaVarTstNe 比较变量是否不相等
bpx msvbvm50!__vbaVarTstEq 比较变量是否相等
bpx msvbvm50!__vbaStrCopy  复制字符串
bpx msvbvm50!__vbaStrMove  移动字符串
bpx MultiByteToWideChar    ANSI字符串转换成Unicode字符串
bpx WideCharToMultiByte    Unicode字符串转换成ANSI字符串
上面的断点对应VB5程序,如果是VB6程序则将msvbvm50改成msvbvm60即可

VB程序的破解
记住VB常用的一些函数:
MultiByteToWideChar   将ANSI字符串转换成UNICODE字符
WideCHatToMultiByte  将UNICODE字符转换成ANSI字符
rtcT8ValFromBstr    把字符转换成浮点数  
vbaStrCmp        比较字符串(常用断点)
vbaStrComp       字符串比较(常用断点)
vbaStrCopy       复制字符串
StrConv         转换字符串
vbaStrMove       移动字符串
__vbaVarCat          连接字符串
rtcMidCharVar        在字符串中取字符或者字符串!
__vbaLenBstr         取字符串的长度
vbaVarTstNe      变量比较
vbaVarTstEq      变量比较
rtcMsgBox       显示对话框
VarBstrCmp       比较字符串
VarCyCmp        比较字符串
  
用OD载入脱壳后的程序,在命令行输入:bpx hmemcpy,然后回车,会弹出程序运行调用的所有的函数,在每个函数上设置好断点!

说明:我破VB程序喜欢用这个断点设置方法,通过一步步跟踪,基本可以把握程序保护的思路,所以我破VB程序基本用这个断点,当然你可以用其它的断点,只要能找到关键,任何断点都是有意义的。

关于VB的程序,注册没有提示的二个办法:
第一(提示错误):用GetVBRes来替换里面的提示串,一般是以‘111111’,‘222222’之类的替换
因为:VB,用的字来存放提示还有加了点东东,我们用的工具一般是字节分析。换成‘22222’之类的就是字节了,用静态分析,就有你该的串了。GetVBRes(网上很多,自己下吧)

第二(没有提示):用vbde这个工具(不知道,有没有用过DEDE,是一样思路),主要是找出破解的按钮窗口的位置,来进行跟踪。

先给出修改能正确反编译VB程序的W32DASM的地址:
======================
offsets 0x16B6C-0x16B6D

修改机器码为: 98 F4
======================

VB程序的跟踪断点: 

MultiByteToWideChar,
rtcR8ValFromBstr,
WideCharToMultiByte,
__vbaStrCmp
__vbaStrComp
__vbaStrCopy
__vbaStrMove
__vbaVarTstNe
rtcBeep
rtcGetPresentDate (时间API)
rtcMsgBox
=========

时间限制断点:

CompareFileTime
GetLocalTime
GetSystemTime
GetTimeZoneInformation
msvcrt.diffTime()
msvcrt.Time()
================

VB断点查找方法

1.VB6.0编写,OD载入程序调出注册窗口,alt+e调出可执行模块窗口找到X:\WINDOWS\system32\MSVBVM60.DLL双击,在ctrl+n调出窗口找到,名称XXXXXXE区段=ENGINE 导出__vbaVarMove双击来到下面地址(可以直接在命令行 bp __vbaVarMove),回到程序注册窗口点注册被拦断在刚才下断的地址,断后在ctrl+F9,F8回
2.OD载入程序,命令行下断点:bp rtcMsgBox
堆栈友好提示
确定注册失败按钮返回。接着向上找出点注册按钮执行的代码第一句,可以吗?当然行,根据我们知道程序员写一个事件执行的代码是如这种,各种语言都差不多。
3.OD载入程序,命令行下断点:bp rtcMsgBox
任意填入伪注册码 9999999999999999999,确定后中断
堆栈友好提示
确定注册失败按钮返回。
W32Dasm反汇编程序,Shiht+F12
4.VB中的messagebox是一个消息框,汇编中用rtcMsgBox下断点.用olldbg载入程序,Alt+e,在可执行文件模块中找到Msvbvm60.dll,双击它,在代码窗口点右键-搜索-当前模块中的名称中的rtcMsgBox函数,双击它,在6A362F29 55 PUSH EBP这一句双击下断点,关掉多余的窗口,只留下cpu调试主窗口,F9运行程序,点?号按钮,随便输入987654321后,回车后立即中断,然后Ctrt+f9执行到返回地址,因为这是msvbvm60的领空,我们要回到程序领空.秘密记事本弹出message错误提示信息,点确定,向上看,再按F8就回到
5.为Microsoft Visual Basic 6.0,先用SmartCheck找到程序比较注册码点
6.用vb常用比较断点
vbastrcmp
vbastrcomp
vbavartsteq
在od中设断点找注册码
7.用Od载入程序,运行,填入上面的注册码和顺序号。在Od中下断点,Alt+E,双击Msvbvm60运行库,右键-搜索当前模块中的名称,找到Vbastrcmp,双击下断点。