【转贴】关于重启时验证的软件一般方法
【破解作者】 clide2000[DFCG][OCN]
【使用工具】 OD1.10;C32Asm
【破解平台】 win2000
【软件名称】 Exe Password
【下载地址】
http://www.salfeld.com/prg/exepw04.exe
【软件简介】 一个可以给EXE文件加密码的工具
【软件大小】 1.15M
【加壳方式】 无壳
【破解声明】 我是一只小菜鸟,偶得一点心得,愿与大家分享:)
--------------------------------------------------------------------------------
【破解内容】
一个偶然机会看到了这个软件,发现她是一个标准的重启验证类的程序,很适合初学者做练习。
我先来说说,重启验证类软件大致的验证过程。
1、运行软件输入注册信息,点注册后。一般软件会提示你重新运行软件,以便验证注册信息的正确性(如FlashGet);
也有的只在你输入正确的注册信息时才有这个提示,不然会告诉你输入的注册信息有问题(此软件就属这类)
2、要破解这种软件,首先是判断一下她把注册信息存在哪里(因为她重启验证时要用)。大致有两种存放方式,第一种是放在注册表里;第二种是放在文件里。(我们可以在输入注册信息,点击确定前,利用监视类软件来查看一下,如FileMon和RegShot等)
3、知道她的注册信息的存放地点后,就可以选则相应的API断点,来调试了
访问注册表类常用API
RegOpenKeyA 打开一个现有的注册表项
RegOpenKeyExA 打开一个现有的注册表项
RegCreateKeyA 在指定的项下创建或打开一个项
RegCreateKeyExA 在指定项下创建新项的更复杂的方式
RegDeleteKeyA 删除现有项下方一个指定的子项
RegDeleteValueA 删除指定项下方的一个值
RegQueryValueA 获取一个项的设置值
RegQueryValueExA 获取一个项的设置值
RegSetValueA 设置指定项或子项的值
RegSetValueExA 设置指定项的值
RegCloseKey 关闭系统注册表中的一个项(或键)
访问文件类常用API
CreateFileA 打开和创建文件、管道、邮槽、通信服务、设备以及控制台
OpenFile 这个函数能执行大量不同的文件操作
ReadFile 从文件中读出数据
ReadFileEx 与ReadFile相似,只是它只能用于异步读操作,并包含了一个完整的回调
好了,下面我们开工。
第一步,让软件保存我们输入的注册信息,并判断出其保存位置
1、首先用PEID检查,无壳。
2、运行软件,输入注册信息,用户名:clide 注册码:12345678
结果出现“Please enter a name with at least 6 characters!"的错误提示,意思是说用户名须大于6位。好,用C32Asm载入此程序,在字符串信息里找到关于"Please enter a name with at least 6 characters!"这个的调用
结果如下:
Please enter a name with at least 6 characters!
::005511D2->MOV EAX,551508
3、下面我们关闭软件,并用OD载入,然后Ctrl+G,输入上面的调用地址5511D2,回车,来到5511D2一行,并向上看看,找到跳转处,注意加****的这行
00551196 . E8 B933EBFF CALL ExePW.00404554
0055119B . 83F8 06 CMP EAX,6 *******这里判断输入的用户名的倍数是否大于6
0055119E . 7F 4F JG SHORT ExePW.005511EF 诺大于,这里会跳。(上次输入clide时,这里就没跳)
005511A0 . 833D CC775600>CMP DWORD PTR DS:[5677CC],0
005511A7 . 75 15 JNZ SHORT ExePW.005511BE
005511A9 . 6A 00 PUSH 0 ; /Arg1 = 00000000
005511AB . 66:8B0D 80135>MOV CX,WORD PTR DS:[551380] ; |
005511B2 . 33D2 XOR EDX,EDX ; |
005511B4 . B8 CC145500 MOV EAX,ExePW.005514CC ; |ASCII "Geben Sie mindestens einen 6-stelligen Namen ein !"
005511B9 . E8 964AEEFF CALL ExePW.00435C54 ; \ExePW.00435C54
005511BE > 833D CC775600>CMP DWORD PTR DS:[5677CC],1
005511C5 . 75 15 JNZ SHORT ExePW.005511DC
005511C7 . 6A 00 PUSH 0 ; /Arg1 = 00000000
005511C9 . 66:8B0D 80135>MOV CX,WORD PTR DS:[551380] ; |
005511D0 . 33D2 XOR EDX,EDX ; |
005511D2 . B8 08155500 MOV EAX,ExePW.00551508 ; |ASCII "Please enter a name with at least 6 characters!"
005511D7 . E8 784AEEFF CALL ExePW.00435C54 ; \ExePW.00435C54
005511DC > 8B83 6C030000 MOV EAX,DWORD PTR DS:[EBX+36C]
005511E2 . 8B10 MOV EDX,DWORD PTR DS:[EAX]
005511E4 . FF92 C4000000 CALL DWORD PTR DS:[EDX+C4]
005511EA . E9 68010000 JMP ExePW.00551357
005511EF > 8D55 F4 LEA EDX,DWORD PTR SS:[EBP-C]
005511F2 . 8B83 70030000 MOV EAX,DWORD PTR DS:[EBX+370]
005511F8 . E8 1BB1EFFF CALL ExePW.0044C318
好,这次我们直接在0055119E JG SHORT ExePW.005511EF这句目标地址下断,在005511EF这行按F2下断,然后F9运行软件
这次我们输入信息时,用户名:clide2000 注册码:12345678 输入完毕后,点击注册按钮
会中断在005511EF,此时,我们用F8一步步走下去,会发现0055121A JE ExePW.0055130D这句会跳转,而且是直接跳向的出错窗口
005511EF > \8D55 F4 LEA EDX,DWORD PTR SS:[EBP-C]
005511F2 . 8B83 70030000 MOV EAX,DWORD PTR DS:[EBX+370]
005511F8 . E8 1BB1EFFF CALL ExePW.0044C318
005511FD . 8B45 F4 MOV EAX,DWORD PTR SS:[EBP-C]
00551200 . 50 PUSH EAX
00551201 . 8D55 F0 LEA EDX,DWORD PTR SS:[EBP-10]
00551204 . 8B83 6C030000 MOV EAX,DWORD PTR DS:[EBX+36C]
0055120A . E8 09B1EFFF CALL ExePW.0044C318
0055120F . 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
00551212 . 5A POP EDX
00551213 . E8 8CA9FFFF CALL ExePW.0054BBA4
00551218 . 84C0 TEST AL,AL
0055121A . 0F84 ED000000 JE ExePW.0055130D
00551220 . 33C0 XOR EAX,EAX
00551222 . 55 PUSH EBP
00551223 . 68 EF125500 PUSH ExePW.005512EF
00551228 . 64:FF30 PUSH DWORD PTR FS:[EAX]
0055122B . 64:8920 MOV DWORD PTR FS:[EAX],ESP
0055122E . B2 01 MOV DL,1
00551230 . A1 9CB44300 MOV EAX,DWORD PTR DS:[43B49C]
00551235 . E8 62A3EEFF CALL ExePW.0043B59C
0055123A . 8945 FC MOV DWORD PTR SS:[EBP-4],EAX
0055123D . BA 02000080 MOV EDX,80000002
00551242 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00551245 . E8 2EA4EEFF CALL ExePW.0043B678
0055124A . B1 01 MOV CL,1
0055124C . BA 40155500 MOV EDX,ExePW.00551540 ; ASCII "Software\Salfeld\Exelock"
00551251 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00551254 . E8 87A4EEFF CALL ExePW.0043B6E0
00551259 . 8D55 EC LEA EDX,DWORD PTR SS:[EBP-14]
0055125C . 8B83 6C030000 MOV EAX,DWORD PTR DS:[EBX+36C]
00551262 . E8 B1B0EFFF CALL ExePW.0044C318
00551267 . 8B4D EC MOV ECX,DWORD PTR SS:[EBP-14]
0055126A . BA 64155500 MOV EDX,ExePW.00551564 ; ASCII "User"
0055126F . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00551272 . E8 9DA9EEFF CALL ExePW.0043BC14
00551277 . 8D55 E8 LEA EDX,DWORD PTR SS:[EBP-18]
0055127A . 8B83 70030000 MOV EAX,DWORD PTR DS:[EBX+370]
00551280 . E8 93B0EFFF CALL ExePW.0044C318
00551285 . 8B4D E8 MOV ECX,DWORD PTR SS:[EBP-18]
00551288 . BA 74155500 MOV EDX,ExePW.00551574 ; ASCII "ID"
0055128D . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00551290 . E8 7FA9EEFF CALL ExePW.0043BC14
00551295 . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00551298 . E8 6722EBFF CALL ExePW.00403504
0055129D . 833D CC775600>CMP DWORD PTR DS:[5677CC],0
005512A4 . 75 15 JNZ SHORT ExePW.005512BB
005512A6 . 6A 00 PUSH 0 ; /Arg1 = 00000000
005512A8 . 66:8B0D 80135>MOV CX,WORD PTR DS:[551380] ; |
005512AF . B2 02 MOV DL,2 ; |
005512B1 . B8 80155500 MOV EAX,ExePW.00551580 ; |ASCII "Programm wurde erfolgreich in Vollversion verwandelt.
Bitte Programm neu starten."
005512B6 . E8 9949EEFF CALL ExePW.00435C54 ; \ExePW.00435C54
005512BB > 833D CC775600>CMP DWORD PTR DS:[5677CC],1
005512C2 . 75 15 JNZ SHORT ExePW.005512D9
005512C4 . 6A 00 PUSH 0 ; /Arg1 = 00000000
005512C6 . 66:8B0D 80135>MOV CX,WORD PTR DS:[551380] ; |
005512CD . B2 02 MOV DL,2 ; |
005512CF . B8 DC155500 MOV EAX,ExePW.005515DC ; |ASCII "Programm was successfully registered.
Please restart this program now."
005512D4 . E8 7B49EEFF CALL ExePW.00435C54 ; \ExePW.00435C54
005512D9 > A1 D4375600 MOV EAX,DWORD PTR DS:[5637D4]
005512DE . 8B00 MOV EAX,DWORD PTR DS:[EAX]
005512E0 . E8 F7AEF1FF CALL ExePW.0046C1DC
005512E5 . 33C0 XOR EAX,EAX
005512E7 . 5A POP EDX
005512E8 . 59 POP ECX
005512E9 . 59 POP ECX
005512EA . 64:8910 MOV DWORD PTR FS:[EAX],EDX
005512ED . EB 68 JMP SHORT ExePW.00551357
005512EF .^ E9 F026EBFF JMP ExePW.004039E4
005512F4 . B8 2C165500 MOV EAX,ExePW.0055162C ; ASCII "Error writing licence information to registry.
Please contact developer: [email]support@salfeld.com[/email]"
005512F9 . E8 4E4AEEFF CALL ExePW.00435D4C
005512FE . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
00551301 . E8 FE21EBFF CALL ExePW.00403504
00551306 . E8 412AEBFF CALL ExePW.00403D4C
0055130B . EB 4A JMP SHORT ExePW.00551357
0055130D > 833D CC775600>CMP DWORD PTR DS:[5677CC],0
00551314 . 75 15 JNZ SHORT ExePW.0055132B
00551316 . 6A 00 PUSH 0 ; /Arg1 = 00000000
00551318 . 66:8B0D 80135>MOV CX,WORD PTR DS:[551380] ; |
0055131F . 33D2 XOR EDX,EDX ; |
00551321 . B8 94165500 MOV EAX,ExePW.00551694 ; |ASCII "Die eingegebene Seriennummer ist falsch."
00551326 . E8 2949EEFF CALL ExePW.00435C54 ; \ExePW.00435C54
0055132B > 833D CC775600>CMP DWORD PTR DS:[5677CC],1
00551332 . 75 15 JNZ SHORT ExePW.00551349
00551334 . 6A 00 PUSH 0 ; /Arg1 = 00000000
00551336 . 66:8B0D 80135>MOV CX,WORD PTR DS:[551380] ; |
0055133D . 33D2 XOR EDX,EDX ; |
0055133F . B8 C8165500 MOV EAX,ExePW.005516C8 ; |ASCII "Sorry, wrong serial number."
00551344 . E8 0B49EEFF CALL ExePW.00435C54 ; \ExePW.00435C54
00551349 > 8B83 6C030000 MOV EAX,DWORD PTR DS:[EBX+36C]
0055134F . 8B10 MOV EDX,DWORD PTR DS:[EAX]
00551351 . FF92 C4000000 CALL DWORD PTR DS:[EDX+C4]
00551357 > 33C0 XOR EAX,EAX
00551359 . 5A POP EDX
0055135A . 59 POP ECX
0055135B . 59 POP ECX
0055135C . 64:8910 MOV DWORD PTR FS:[EAX],EDX
0055135F . 68 79135500 PUSH ExePW.00551379
00551364 > 8D45 E8 LEA EAX,DWORD PTR SS:[EBP-18]
00551367 . BA 05000000 MOV EDX,5
0055136C . E8 472FEBFF CALL ExePW.004042B8
00551371 . C3 RETN
好,现在我们在软件的错误提示窗口Sorry, wrong serial number.里点击OK后。再次点击注册按钮,以便再次中断在005511EF
这次,当我们走到0055121A JE ExePW.0055130D,把它nop掉,不让她跳转(在这行上按空格,直接在新窗口里输入NOP即可)。
然后,我们F8继续往下走.
当我们看到下面的提示后,可以断定她已经把我们输入的注册信息放进注册表了(所以也省去用监视工具的麻烦了)
; ASCII "Software\Salfeld\Exelock"
; ASCII "User"
; ASCII "ID"
而执行到|ASCII "Programm was successfully registered.
Please restart this program now."这里时,程序提示我们要重新运行,当我们在软件介面点OK后,反回到OD中,直接按F9,程序已自动退出了。
第二步,根据上面分析得到的结果,确定API断点
好了,既然我们已经知道软件把注册信息放在注册表里,那我们就用RegOpenKeyExA 打开一个现有的注册表项 来试试吧。
具体操作:
1、Ctrl+F2使OD重新加载该软件
2、在命令行下bp RegOpenKeyExA,并回车(注册字母的大小)
3、F9运行,此时注意观察堆栈的提示,以确定在什么时候读取保存的注册信息了
当按下F9后,第一次中断时堆栈的内容如下:
0012F8E8 00405E03 /CALL to RegOpenKeyExA from ExePW.00405DFE
0012F8EC 80000001 |hKey = HKEY_CURRENT_USER
0012F8F0 00405FF4 |Subkey = "Software\Borland\Locales" ;看这里,这里要访问的路径
0012F8F4 00000000 |Reserved = 0
0012F8F8 000F0019 |Access = KEY_QUERY_VALUE|KEY_ENUMERATE_SUB_KEYS|KEY_NOTIFY|F0000
0012F8FC 0012FA20 \pHandle = 0012FA20
4、我们继续一下一下的按F9,当Sukey="Software\Salfeld\Exelock"时停下(因为此时离读取注册信息已不远了)
即看到堆栈出现下面的内容时,就要停止按F9了
0012F17C 0043B875 /CALL to RegOpenKeyExA from ExePW.0043B870
0012F180 80000002 |hKey = HKEY_LOCAL_MACHINE
0012F184 0054D9E4 |Subkey = "Software\Salfeld\Exelock"
0012F188 00000000 |Reserved = 0
0012F18C 00020019 |Access = KEY_READ
0012F190 0012F1AC \pHandle = 0012F1AC
5、现在我们在命令行里下BC RegOpenKeyExA来清除断点,然后Ctrl+f9返回到(需要返回到程序的领空):
0043B875 |. 85C0 TEST EAX,EAX
0043B877 |. 0F9445 FF SETE BYTE PTR SS:[EBP-1]
0043B87B |. 807D FF 00 CMP BYTE PTR SS:[EBP-1],0
0043B87F |. 74 3C JE SHORT ExePW.0043B8BD
0043B881 |. C746 18 19000>MOV DWORD PTR DS:[ESI+18],2001>
0043B888 |. 837E 04 00 CMP DWORD PTR DS:[ESI+4],0
0043B88C |. 0F95C0 SETNE AL
6、再次Ctrl+f9,这次返回到:
0043B9A5 . 8A45 FF MOV AL,BYTE PTR SS:[EBP-1]
0043B9A8 . 5E POP ESI
0043B9A9 . 5B POP EBX
0043B9AA . 8BE5 MOV ESP,EBP
0043B9AC . 5D POP EBP
0043B9AD . C3 RETN
7、当再次Ctrl+f9时,会返回到0054D19B这一行:
0054D18E . BA E4D95400 MOV EDX,ExePW.0054D9E4 ; ASCII "Software\Salfeld\Exelock"
0054D193 . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
0054D196 . E8 69E6EEFF CALL ExePW.0043B804
0054D19B . 8D4D E4 LEA ECX,DWORD PTR SS:[EBP-1C]
0054D19E . BA 08DA5400 MOV EDX,ExePW.0054DA08 ; ASCII "User"
0054D1A3 . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
0054D1A6 . E8 95EAEEFF CALL ExePW.0043BC40
0054D1AB . 8D4D E0 LEA ECX,DWORD PTR SS:[EBP-20]
0054D1AE . BA 18DA5400 MOV EDX,ExePW.0054DA18 ; ASCII "ID"
0054D1B3 . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
0054D1B6 . E8 85EAEEFF CALL ExePW.0043BC40
8、现在开始我们要仔细分析了(但到底按多少次Ctrl+f9才能返回程序领空,这个我就说不太清楚了,我自己觉昨只能靠经难了。记得原来用SoftIce时,有当前所处的进程的提示可以参考,但在OD里我没找到。诺有其它方法,希望多多指教)
让我们来仔细看看加#############的部分吧
0054D19B . 8D4D E4 LEA ECX,DWORD PTR SS:[EBP-1C]
0054D19E . BA 08DA5400 MOV EDX,ExePW.0054DA08 ; ASCII "User"
0054D1A3 . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
0054D1A6 . E8 95EAEEFF CALL ExePW.0043BC40
0054D1AB . 8D4D E0 LEA ECX,DWORD PTR SS:[EBP-20]
0054D1AE . BA 18DA5400 MOV EDX,ExePW.0054DA18 ; ASCII "ID"
0054D1B3 . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
0054D1B6 . E8 85EAEEFF CALL ExePW.0043BC40
0054D1BB . 8B55 E0 MOV EDX,DWORD PTR SS:[EBP-20]
0054D1BE . B8 DC775600 MOV EAX,ExePW.005677DC
0054D1C3 . E8 2071EBFF CALL ExePW.004042E8
0054D1C8 . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
0054D1CB . E8 3463EBFF CALL ExePW.00403504
0054D1D0 . 33C0 XOR EAX,EAX
0054D1D2 . 5A POP EDX
0054D1D3 . 59 POP ECX
0054D1D4 . 59 POP ECX
0054D1D5 . 64:8910 MOV DWORD PTR FS:[EAX],EDX
0054D1D8 . EB 12 JMP SHORT ExePW.0054D1EC
0054D1DA .^ E9 0568EBFF JMP ExePW.004039E4
0054D1DF . 8B45 E8 MOV EAX,DWORD PTR SS:[EBP-18]
0054D1E2 . E8 1D63EBFF CALL ExePW.00403504
0054D1E7 . E8 606BEBFF CALL ExePW.00403D4C
0054D1EC > E8 EB600000 CALL ExePW.005532DC
0054D1F1 . 3C 01 CMP AL,1
0054D1F3 . 75 68 JNZ SHORT ExePW.0054D25D
0054D1F5 . 833D CC775600>CMP DWORD PTR DS:[5677CC],0
0054D1FC . 75 28 JNZ SHORT ExePW.0054D226
0054D1FE . 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14] ################################
0054D201 . BA 24DA5400 MOV EDX,ExePW.0054DA24 ; ASCII "Unregistrierte Testversion"
0054D206 . E8 2171EBFF CALL ExePW.0040432C
0054D20B . 8D45 DC LEA EAX,DWORD PTR SS:[EBP-24]
0054D20E . 8B4D EC MOV ECX,DWORD PTR SS:[EBP-14]
0054D211 . BA 48DA5400 MOV EDX,ExePW.0054DA48 ; ASCII "EXE Passwort / "
0054D216 . E8 8573EBFF CALL ExePW.004045A0
0054D21B . 8B55 DC MOV EDX,DWORD PTR SS:[EBP-24]
0054D21E . 8B45 FC MOV EAX,DWORD PTR SS:[EBP-4]
0054D221 . E8 22F1EFFF CALL ExePW.0044C348
0054D226 > 833D CC775600>CMP DWORD PTR DS:[5677CC],1
0054D22D . 0F85 A6000000 JNZ ExePW.0054D2D9
0054D233 . 8D45 EC LEA EAX,DWORD PTR SS:[EBP-14] ##############################
0054D236 . BA 60DA5400 MOV EDX,ExePW.0054DA60 ; ASCII "Unregistered Trial Version"
0054D23B . E8 EC70EBFF CALL ExePW.0040432C
0054D240 . 8D45 D8 LEA EAX,DWORD PTR SS:[EBP-28]
0054D243 . 8B4D EC MOV ECX,DWORD PTR SS:[EBP-14]
0054D246 . BA 84DA5400 MOV EDX,ExePW.0054DA84 ; ASCII "EXE Password / "
0054D24B . E8 5073EBFF CALL ExePW.004045A0
0054D250 . 8B55 D8 MOV EDX,DWORD PTR SS:[EBP-28]
我们从加################的ASCII提示部分可以猜测到,这部分是在软件未注册时才会执行到的地方,为验证我们的猜测是正确的,可在程序执行到0054D1F3 JNZ SHORT ExePW.0054D25D时使其强行跳转看看
结果如我们所料,软件启动已经显示是注册版了。
--------------------------------------------------------------------------------
【破解总结】
爆破修改:
方法一:
0055121A JE ExePW.0055130D 改成 NOP
0054D1F3 JNZ SHORT ExePW.0054D25D 改成 JMP
做上面两处修改后就可以了
其实,只要把0054D1F3 JNZ 改成JMP就已经是注册版了,但问题是诺此时注册表里没有注册信息。软件里也不有用户名的。
诺想要用任意注册名都可以注册,需要跟进0054D1EC > E8 EB600000 CALL ExePW.005532DC
在里面,你会看到一个很熟悉的跳转:
00553357 . 8B55 F4 MOV EDX,DWORD PTR SS:[EBP-C]
0055335A . 8B45 F0 MOV EAX,DWORD PTR SS:[EBP-10]
0055335D . E8 4288FFFF CALL ExePW.0054BBA4
00553362 . 84C0 TEST AL,AL
00553364 . 74 15 JE SHORT ExePW.0055337B ; 就是这里
00553366 . C645 FF 00 MOV BYTE PTR SS:[EBP-1],0
方法二:
0055121A JE ExePW.0055130D 改成 NOP
00553364 JE SHORT ExePW.0055337B 改成 NOP
这样就可以在注册时输入任意用户名和密码注册了(但记得用户名位数要大于6位啊,这里没我们可没有改过)
关于重启时验证的软件,主要是确定注册信息的保存位置,然后再确定对就的API断点调试就可以了