1)经典比较组合,常为注册码出现处(by programhunter) 1 mov eax [ ] 这里可以是地址,也可以是其它寄存器 mov edx [ ] 同上 通常这两个地址就储存着重要信息 call 00?????? test eax eax jz(jnz) 2 mov eax [ ] 这里可以是地址,也可以是其它寄存器 mov edx [ ] 同上 通常这两个地址就储存着重要信息 call 00?????? jne(je) 3 mov eax [ ] mov edx [ ] cmp eax,edx jnz(jz) 或者 begin mov al [ ] mov cl [ ] cmp al,cl jnz(jz) mov al [ +1] mov cl [ +1] cmp al,cl jnz(jz) cmp eax ecx (eax为计数器) jnl begin mov al 01 4 lea edi [ ] lea esi [ ] repz cmpsd jz(jnz) 5 mov eax [ ] 这里可以是地址,也可以是其它寄存器 mov edx [ ] 同上 通常这两个地址就储存着重要信息 call 00?????? setz (setnz) al (bl,cl…) 6 mov eax [ ] 这里可以是地址,也可以是其它寄存器 mov edx [ ] 同上 通常这两个地址就储存着重要信息 call 00?????? test eax eax setz (setnz) bl,cl… 7 call 00?????? *** push eax (ebx,ecx…) …… …… call 00?????? pop eax (ebx,ecx…) test eax eax jz(jnz) 这个形式比较特别,它的关键比较地方不在第二call中,而在第一call中 (2)注册码按字节依次给出 :0042A159 0FBE03 movsx eax,byte ptr [ebx] :0042A15C 50 push eax ^^^^^ :0042A15D E8228C0400 call 00472D84 :0042A162 59 pop ecx :0042A163 83F84A cmp eax,0000004A ---->J :0042A166 7559 jne 0042A1C1 :0042A168 0FBE5301 movsx edx,byte ptr [ebx+01] :0042A16C 52 push edx ^^^^^^^ :0042A16D E8128C0400 call 00472D84 :0042A172 59 pop ecx :0042A173 83F853 cmp eax,00000053 ^^^^^^^^^^^^^^^^^----> S :0042A176 7549 jne 0042A1C1 :0042A178 0FBE4B02 movsx ecx,byte ptr [ebx+02] :0042A17C 83F924 cmp ecx,00000024 ^^^^^^^ ^^^^^^^^^^^^^^^^^----> $ :0042A17F 7540 jne 0042A1C1 :0042A181 0FBE4303 movsx eax,byte ptr [ebx+03] :0042A185 83F832 cmp eax,00000032 ^^^^^^^^ ^^^^^^^^^^^^^^^^^----> 2 :0042A188 7537 jne 0042A1C1 :0042A18A 0FBE5304 movsx edx,byte ptr [ebx+04] :0042A18E 83FA38 cmp edx,00000038 ^^^^^^^^ ^^^^^^^^^^^^^^^^^----> 8 :0042A191 752E jne 0042A1C1 :0042A193 0FBE4B05 movsx ecx,byte ptr [ebx+05] :0042A197 83F939 cmp ecx,00000039 ^^^^^^^ ^^^^^^^^^^^^^^^^^----> 9 :0042A19A 7525 jne 0042A1C1 :0042A19C 0FBE4306 movsx eax,byte ptr [ebx+06] :0042A1A0 83F832 cmp eax,00000032 ^^^^^^^^ ^^^^^^^^^^^^^^^^^----> 2 :0042A1A3 751C jne 0042A1C1 :0042A1A5 0FBE5307 movsx edx,byte ptr [ebx+07] :0042A1A9 83FA31 cmp edx,00000031 ^^^^^^^^ ^^^^^^^^^^^^^^^^^ ----->1 (3)比较位数 cmp dword ptr[ebp-04],0000000A jne/jge/jle/je 00xxxx 或 mov eax,dword ptr [ebp-04] call 00xxxx cmp eax,0000000A <----比较注册码是否为10位 jne 00xxxxx <----不是,错 (4)VB程序经典比较 PUSH XXX //假注册码 PUSH XXX //真注册码 CALL [MSVBVM60!__vbaStrCmp] TEST EAX,EAX JNZ 00XXXXX (5)SmartCheck中,注册码常出现处 __vbasrtcmp(String:"zzzzz",String:"yyyyy")returns __vbaStrVarVal(VARIATN:String"a") returns __vbaVarTstEq(VARIANT:****,VARIANT:****) returns (6)依次取两位比较 :004044D8 8A10 mov dl,byte ptr [eax] :004044DA 8ACA mov cl,dl :004044DC 3A16 cmp dl,byte ptr [esi] :004044DE 751C jne 004044FC :004044E0 84C9 test cl,cl :004044E2 7414 je 004044F8 :004044E4 8A5001 mov dl,byte ptr [eax+01] :004044E7 8ACA mov cl,dl :004044E9 3A5601 cmp dl,byte ptr [esi+01] :004044EC 750E jne 004044FC :004044EE 83C002 add eax,00000002 *** :004044F1 83C602 add esi,00000002 *** :004044F4 84C9 test cl,cl :004044F6 75E0 jne 004044D8 每次程序依次取两位,放入byte ptr [esi],byte ptr [esi+1],与eax,eax+1比较。如此循环 (7)小写转大写(一时找不到,自己补充) (8)大写转小写(一时找不到,自己补充)刚才看到的补充一下这个觉得也不错!!常用断点(OD中)拦截窗口:bp CreateWindow 创建窗口 bp CreateWindowEx(A) 创建窗口 bp ShowWindow 显示窗口 bp UpdateWindow 更新窗口 bp GetWindowText(A) 获取窗口文本 拦截消息框:bp MessageBox(A) 创建消息框 bp MessageBoxExA 创建消息框 bp MessageBoxIndirect(A) 创建定制消息框 bp IsDialogMessageW拦截警告声:bp MessageBeep 发出系统警告声(如果没有声卡就直接驱动系统喇叭发声) 拦截对话框:bp DialogBox 创建模态对话框 bp DialogBoxParam(A) 创建模态对话框 bp DialogBoxIndirect 创建模态对话框 bp DialogBoxIndirectParam(A) 创建模态对话框 bp CreateDialog 创建非模态对话框 bp CreateDialogParam(A) 创建非模态对话框 bp CreateDialogIndirect 创建非模态对话框 bp CreateDialogIndirectParam(A) 创建非模态对话框 bp GetDlgItemText(A) 获取对话框文本 bp GetDlgItemInt 获取对话框整数值 拦截剪贴板: bp GetClipboardData 获取剪贴板数据 拦截注册表:bp RegOpenKey(A) 打开子健 bp RegOpenKeyEx 打开子健bp RegQueryValue(A) 查找子健bp RegQueryValueEx 查找子健bp RegSetValue(A) 设置子健 bp RegSetValueEx(A) 设置子健功能限制拦截断点:bp EnableMenuItem 禁止或允许菜单项 bp EnableWindow 禁止或允许窗口 bp send 网络访问断点bp recv 返回信息断点拦截关机重启:bp ExitWindowsEx 重启问题 bp断在系统领空bpx ExitWindowsEx 拦截时间:bp GetLocalTime 获取本地时间 bp GetSystemTime 获取系统时间 bp GetFileTime 获取文件时间 bp GetTickCount 获得自系统成功启动以来所经历的毫秒数 bp GetCurrentTime 获取当前时间(16位) bp SetTimer 创建定时器 bp TimerProc 定时器超时回调函数GetDlgItemInt 得指定输入框整数值 GetDlgItemText 得指定输入框输入字符串 GetDlgItemTextA 得指定输入框输入字符串拦截文件: bp CreateFileA 创建或打开文件 (32位) bp OpenFile 打开文件 (32位) bp ReadFile 读文件 (32位) bp WriteFile 写文件 (32位) GetModuleFileNameAGetFileSizeSetfilepointerfileopenFindFirstFileAReadFile拦截驱动器: bp GetDriveTypeA 获取磁盘驱动器类型 bp GetLogicalDrives 获取逻辑驱动器符号 bp GetLogicalDriveStringsA 获取当前所有逻辑驱动器的根驱动器路径 ★★VB程序专用断点★★文件长度:RtcFileLenbp __vbaFreeStr 对付VB程序重启验证bp __vbaStrCmp 比较字符串是否相等 bp __vbaStrComp 比较字符串是否相等 bp __vbaVarTstNe 比较变量是否不相等 bp __vbaVarTstEq 比较变量是否相等 bp __vbaStrCopy 复制字符串 bp __vbaStrMove 移动字符串 bp MultiByteToWideChar ANSI字符串转换成Unicode字符串 bp WideCharToMultiByte Unicode字符串转换成ANSI字符串 =============== ================密码常用中断Hmemcpy (win9x专用)GetDlgItemTextA GetDlgItemIntvb:getvolumeinformationa vbastrcomp (trw)Bpx __vbaStrComp (记得是两个 '_')MSVBVM60!_vbastrcomp|soficeMSVBVM50! | VBAI4STR Ctrl+D bpx msvbvm60!__vbastrcomp do "d *(esp+0c)"(softice) 按几次F5出册码出来了。 bpx regqueryvalueexa do "d esp->8"(trw) vbaVarTstEq 判断是否注册的函数(0042932F 66898580FEFFFF mov word ptr [ebp+FFFFFE80],ax改为0042932F 66898580FEFFFF mov word ptr [ebp+FFFFFE80],bx)时间常用中断GetSystemTimeGetLocalTimeGetTickCountvb:rtcGetPresentDate //取得当前日期 杀窗常用中断Lockmytask (win9x专用)bp ExitProcess 退出进程DestroyWindowmouse_event (鼠标中断)postquitmessage (Cracking足彩xp,很有用^_^)vb:_rtcMsgBox ini文件内容常用中断GetPrivateProfileStringAGetPrivateProfileProfileInt key文件:getprivateprofileintReadFileCreateFileA 注册表常用中断RegQueryvalueARegQueryvalueExA 狗加密中断BPIO -h 278 RBPIO -h 378 R 其它常用函数断点CreateFileA (读狗驱动程序),DeviceIOControl,FreeEnvironmentStringsA (对付HASP非常有效). Prestochangoselector (16-bit HASP's),'7242' 查找字符串 (对付圣天诺).具体含义参考下面的范例。 光盘破解中断16:getvolumeinformationgetdrivetypeint 2fh (dos)32:GetDriveTypeA GetFullPathNameAGetWindowsDirectoryA 读磁盘中断GETLASTERROR 返回扩充出错代码 限制中断EnableMenuItem 允许、禁止或变灰指定的菜单条目 EnableWindow 允许或禁止鼠标和键盘控制指定窗口和条目(禁止时菜单变灰) 不知道软盘中断是什么了?还有其它特殊中断,不知道其他朋友可否说一下了?如ockmytask and mouse_event,这些就不是api32函数?win9x 与 win2k进行破解,以上中断有部分已经不能用了?不知道在win2k上,以上常用中断函数是什么了?也就是问密码、时间、窗口、ini、key、注册表、加密狗、光盘、软盘、限制等!了解常用的中断,对破解分析可以做到事半功倍!请大家说一下!还有如何破解了某个软件时,一重启就打回原形?不知道下什么中断了?可以分为三种情况:1.比较可能在注册表中2.比较在特殊文件(*.key *.ini *.dat等)3.比较在程序中,没有任何错误提示或者反译也找不到明显字符(这个就是我想问的) 还有一个是最难的,就是去掉水印!也可以三种情况:A.水印是位图文件(bitblt,creatBITMAP等位图函数)B.水印是明显字符(反译分析)C.水印不是明显字符(如:This a demo!它只是显示在另一个制作文件上,可是*.htm *.exe等)C.才是最难搞,也是很多人想知道的!包括我在内。不知道高手们有何提示了? 广告条:可以分两种情况:A.从创建窗口进手,可以用到movewindow或者其它窗口函数!B.从位图进手,也可以用到bitblt或者其它位图函数!最后可以借助一些现有工具(如:api27,vwindset,freespy之类的工具) 葡萄虽无树,藤生棚中秧。人处凡尘中,岂不惹尘埃? 小球[CCG] 那要看是在哪作的标记,通常是在注册表中留下信息! 在softice中就要用bpx regqueryvalueexa do "d esp->8"来中断看看,在trw中要用bpx regqueryvalueexa do "d*(esp+8)"来中断看看。还有的是在本目录下留下注册信息,常见的有.dat .ini .dll等等,我是用bpx readfile来中断的,还有的是在windows目录下留下注册信息。你可以借助专用的工具帮助你查看,入filemon等! vb: 1、__vbaVarTstNe //比较两个变量是否不相等 2、rtcR8ValFromBstr //把字符串转换成浮点数 3、rtcMsgBox 显示一信息对话框 4、rtcBeep //让扬声器叫唤 5、rtcGetPresentDate //取得当前日期 针对字串: __vbaStrComp __vbaStrCmp __vbaStrCompVar __vbaStrLike __vbaStrTextComp __vbaStrTextLike 针对变量: __vbaVarCompEq __vbaVarCompLe __vbaVarCompLt __vbaVarCompGe __vbaVarCompGt __vbaVarCompNeVB的指针:THROW VB DLL还调用了oleauto32.dll中的部分函数。oleauto32.dll是个通用的proxy/stub DLL,其每个函数的原型在<oleauto.h>中定义,并在MSDN中有详细描述。这也有助于理解VB DLL中的函数的作用。 举例: LEA EAX,[EBP-58] PUSH EAX CALL [MSVBVM60!__vbaI4Var] 执行call之前敲dd eax+8,得到的值为3; 执行完call之后,eax = 3 从而可知__vbaI4Var的作用是将一个VARIANT转换为I4(即一个长整数)。 __vbaVarTstNe似乎是用来进行自校验的,正常情况下返回值为0。 已知适用的软件有:网络三国智能机器人、音乐贺卡厂。当这两个软件被脱壳后都回出错,网络三国智能机器人会产生非法*作,而音乐贺卡厂会告诉你是非法拷贝,通过修改__vbaVarTstNe的返回值都可让它们正常运行。 所以当您遇到一个VB软件,脱壳后无法正常运行,而又找不出其它问题时,可试试拦截这个函数,说不定会有用哦。8-) API不太知道,也许可以通过BIOS在98平台上读写扇区,不过在2000/NT下可以通过内黑ATAPI,HAL写扇区 machoman[CCG]bpx WRITE_PORT_BUFFER_USHORT NT/2000下这个断点,当edx=1f0h,时,可以看见EDI地址内数据为扇区位置数据,必须先 在winice.dat 中装入hal.sys 详细内容看ATAPI手册 补充篇:关于对VB程序和时间限制程序的断点CrackerABC先给出修改能正确反编译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() ================ 一般处理bpx hmemcpybpx MessageBoxbpx MessageBoxExAbpx MessageBeepbpx SendMessage bpx GetDlgItemTextbpx GetDlgItemIntbpx GetWindowTextbpx GetWindowWordbpx GetWindowIntbpx DialogBoxParamAbpx CreateWindowbpx CreateWindowExbpx ShowWindowbpx UpdateWindow bmsg xxxx wm_movebmsg xxxx wm_gettextbmsg xxxx wm_commandbmsg xxxx wm_activate 时间相关 bpint 21 if ah==2A (dos)bpx GetLocalTimebpx GetFileTimebpx GetSystemtime CD-ROM 或 磁盘相关 bpint 13 if ah==2 (dos)bpint 13 if ah==3 (dos)bpint 13 if ah==4 (dos)bpx GetFileAttributesAbpx GetFileSizebpx GetDriveTypebpx GetLastErrorbpx ReadFilebpio -h (Your CD-ROM Port Address) R 软件狗相关 bpio -h 278 Rbpio -h 378 R 键盘输入相关 bpint 16 if ah==0 (dos)bpint 21 if ah==0xA (dos) 文件访问相关 bpint 21 if ah==3dh (dos)bpint 31 if ah==3fh (dos)bpint 21 if ah==3dh (dos)bpx ReadFilebpx WriteFilebpx CreateFilebpx SetFilePointerbpx GetSystemDirectory INI 初始化文件相关 bpx GetPrivateProfileStringbpx GetPrivateProfileIntbpx WritePrivateProfileStringbpx WritePrivateProfileInt 注册表相关 bpx RegCreateKeybpx RegDeleteKeybpx RegQueryvaluebpx RegCloseKeybpx RegOpenKey 注册标志相关 bpx cs:eip if EAX==0 内存标准相关 bpmb cs:eip rw if 0x30:0x45AA==0 显示相关 bpx 0x30:0x45AA do "d 0x30:0x44BB"bpx CS:0x66CC do "? EAX"查找窗口FindWindowABP SetFilePointerbpx 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即可