前不久想刻个光碟,才发现机子里没有相关软件,于是到天空下了一个“刻录大师6.1”,这个工具是挺好用的,可是要注册,不然有次数限制
用的实在不爽,所以打算把它破掉,找出珍藏了很久的破解工具,开始给它动个小手术。。
先用PE检测,发现是“Borland Delphi 6.0 - 7.0”,没壳,正好下手(因为本人目前还不会手动脱壳,用工具脱还总是出问题)
先运行一下程序,直接弹出的窗口就如上图所示,点“继续试用”,进去后依然有注册的地方,点注册他就又进入到了如上的界面中,好了,熟悉了界面现在就可以进行破解尝试了。。
用OD运行程序,随便在输入框中输入一些数字后点注册
F12暂停,可以跟综到如下所示的地方
在006581A4 - FF25 081B7100 jmp dword ptr ds:[<&user32.MessageB>处下断,重新运行,断下后结果如下图,在进行如图操作,跟综到代码窗
代码:
007006F1 /E9 37030000 jmp CheckReg.00700A2D
007006F6 |8D55 C0 lea edx,dword ptr ss:[ebp-40]
007006F9 |8B83 98030000 mov eax,dword ptr ds:[ebx+398]
........
整个这一段就是进行最后的错误提示,所以他前面的内容应该就是注册判断的所在地,这个JMP实现了,然后就会出现错误提示,所以往上找,找到能跳过这个JMP的路线,这就应该是正确的注册路线了。。。
0070063E E8 3D98F5FF call CheckReg.00659E80
00700643 83F8 05 cmp eax,5
00700646 0F85 80000000 jnz CheckReg.007006CC ; 这个跳不能实现
0070064C 8D55 D0 lea edx,dword ptr ss:[ebp-30]
0070064F 8B83 9C030000 mov eax,dword ptr ds:[ebx+39C]
00700655 E8 2ADCF9FF call CheckReg.0069E284
0070065A 8B45 D0 mov eax,dword ptr ss:[ebp-30]
0070065D E8 724EF5FF call CheckReg.006554D4
00700662 E8 1998F5FF call CheckReg.00659E80
00700667 83F8 05 cmp eax,5
0070066A 75 60 jnz short CheckReg.007006CC ; 这个跳不能实现
0070066C 8D55 CC lea edx,dword ptr ss:[ebp-34]
0070066F 8B83 A0030000 mov eax,dword ptr ds:[ebx+3A0]
00700675 E8 0ADCF9FF call CheckReg.0069E284
0070067A 8B45 CC mov eax,dword ptr ss:[ebp-34]
0070067D E8 524EF5FF call CheckReg.006554D4
00700682 E8 F997F5FF call CheckReg.00659E80
00700687 83F8 05 cmp eax,5
0070068A 75 40 jnz short CheckReg.007006CC ; 这个跳不能实现
0070068C 8D55 C8 lea edx,dword ptr ss:[ebp-38]
0070068F 8B83 A4030000 mov eax,dword ptr ds:[ebx+3A4]
00700695 E8 EADBF9FF call CheckReg.0069E284
0070069A 8B45 C8 mov eax,dword ptr ss:[ebp-38]
0070069D E8 324EF5FF call CheckReg.006554D4
007006A2 E8 D997F5FF call CheckReg.00659E80
007006A7 83F8 05 cmp eax,5
007006AA 75 20 jnz short CheckReg.007006CC ; 这个跳不能实现
007006AC 8D55 C4 lea edx,dword ptr ss:[ebp-3C]
007006AF 8B83 A8030000 mov eax,dword ptr ds:[ebx+3A8]
007006B5 E8 CADBF9FF call CheckReg.0069E284
007006BA 8B45 C4 mov eax,dword ptr ss:[ebp-3C]
007006BD E8 124EF5FF call CheckReg.006554D4
007006C2 E8 B997F5FF call CheckReg.00659E80
007006C7 83F8 05 cmp eax,5
007006CA 74 2A je short CheckReg.007006F6 ; 这个跳要实现
007006CC 6A 40 push 40 ;-----------
007006CE A1 1C077100 mov eax,dword ptr ds:[71071C] ;
007006D3 E8 FC4DF5FF call CheckReg.006554D4 ; 进
007006D8 50 push eax ; 行
007006D9 A1 24077100 mov eax,dword ptr ds:[710724] ; 错
007006DE E8 F14DF5FF call CheckReg.006554D4 ; 误
007006E3 50 push eax ; 提
007006E4 8BC3 mov eax,ebx ; 示
007006E6 E8 D156FAFF call CheckReg.006A5DBC ;
007006EB 50 push eax ;
007006EC E8 B37AF5FF call <jmp.&user32.MessageBoxA> ;-------------007006F1 E9 37030000 jmp CheckReg.00700A2D ;跳至错误提示
007006F6 8D55 C0 lea edx,dword ptr ss:[ebp-40]
007006F9 8B83 98030000 mov eax,dword ptr ds:[ebx+398]
大概分析代码就可以得出 cmp eax,5 是比较字符串长度的,也就是说这一段就是判断几个注册框中的数子是否为5位(我测试过了,只要全是5位的数字就能顺利的执行下来,当然也可以用一个JMP直接跳过这些检测,我这就先不改了),知道前面的东西了,那就可以继续向下进行了,在
007006F6 8D55 C0 lea edx,dword ptr ss:[ebp-40]
下断点,重新运行,为了方便测试,我在注输入框中输入
11111-22222-33333-44444-55555,确定后单步,可以发现
00700704 837D C0 00 cmp dword ptr ss:[ebp-40],0 ;比较“11111”与“0”
00700708 74 3C je short CheckReg.00700746
0070070A 8D55 BC lea edx,dword ptr ss:[ebp-44]
0070070D 8B83 9C030000 mov eax,dword ptr ds:[ebx+39C]
00700713 E8 6CDBF9FF call CheckReg.0069E284
00700718 837D BC 00 cmp dword ptr ss:[ebp-44],0 ;比较“22222”与“0”
0070071C 74 28 je short CheckReg.00700746
0070071E 8D55 B8 lea edx,dword ptr ss:[ebp-48]
00700721 8B83 A0030000 mov eax,dword ptr ds:[ebx+3A0]
00700727 E8 58DBF9FF call CheckReg.0069E284
0070072C 837D B8 00 cmp dword ptr ss:[ebp-48],0 ;比较“33333”与“0”
00700730 74 14 je short CheckReg.00700746
00700732 8D55 B4 lea edx,dword ptr ss:[ebp-4C]
00700735 8B83 A4030000 mov eax,dword ptr ds:[ebx+3A4]
0070073B E8 44DBF9FF call CheckReg.0069E284
00700740 837D B4 00 cmp dword ptr ss:[ebp-4C],0 ;比较“44444”与“0”
00700744 75 2A jnz short CheckReg.00700770
00700746 6A 40 push 40
00700748 A1 1C077100 mov eax,dword ptr ds:[71071C]
这段代码就是在判断输入的是否全为0,我输入的全都不为“0”,所以可以继续F8下去,
-------------这段应该就是注册码计算了,直接过了(以俺现在的水平还算不出)----------
00700770 8D55 B0 lea edx,dword ptr ss:[ebp-50]
00700773 8B83 A0030000 mov eax,dword ptr ds:[ebx+3A0]
00700779 E8 06DBF9FF call CheckReg.0069E284
0070077E 8B45 B0 mov eax,dword ptr ss:[ebp-50]
00700781 E8 3691F5FF call CheckReg.006598BC
00700786 8BF0 mov esi,eax
00700788 8D45 AC lea eax,dword ptr ss:[ebp-54]
0070078B E8 7C84FCFF call CheckReg.006C8C0C
00700790 8B45 AC mov eax,dword ptr ss:[ebp-54]
00700793 E8 2491F5FF call CheckReg.006598BC
00700798 8BC8 mov ecx,eax
0070079A 8BC6 mov eax,esi
0070079C BF 10270000 mov edi,2710
007007A1 33D2 xor edx,edx
007007A3 F7F7 div edi
007007A5 8BF8 mov edi,eax
007007A7 8BC1 mov eax,ecx
007007A9 B9 10270000 mov ecx,2710
007007AE 33D2 xor edx,edx
007007B0 F7F1 div ecx
----------------------------------------------------------------------------------
下面又有比较了,又要仔细看了。。
-------------------------------------
007007B2 3BF8 cmp edi,eax
007007B4 74 2F je short CheckReg.007007E5
007007B6 83FF 01 cmp edi,1
007007B9 74 2A je short CheckReg.007007E5
007007BB 6A 40 push 40
007007BD A1 1C077100 mov eax,dword ptr ds:[71071C]
007007C2 E8 0D4DF5FF call CheckReg.006554D4
007007C7 50 push eax
007007C8 A1 24077100 mov eax,dword ptr ds:[710724]
007007CD E8 024DF5FF call CheckReg.006554D4
007007D2 50 push eax
007007D3 8BC3 mov eax,ebx
007007D5 E8 E255FAFF call CheckReg.006A5DBC
007007DA 50 push eax
007007DB E8 C479F5FF call <jmp.&user32.MessageBoxA>007007E0 E9 48020000 jmp CheckReg.00700A2D
007007E5 8D55 A8 lea edx,dword ptr ss:[ebp-58]
007007E8 8B83 98030000 mov eax,dword ptr ds:[ebx+398]
看那两个JE都是跳到同一个地方,如果两个JE都不实现呢?接着红色代码是否眼熟呢,可以看一看它与前面的错误提示代码完全相同,那就说明这两个JE如果都不实现就会进行错误提示。。
那就让它执行吧,把任意一个JE改成JMP就好了,为了安全我是把第二个JE改成了JMP。。。(这是第一刀)
后面的还是验证注册码的,继续F8,直到。。
0070083A 33D2 xor edx,edx
0070083C 3B5424 04 cmp edx,dword ptr ss:[esp+4]
00700840 75 03 jnz short CheckReg.00700845
00700842 3B0424 cmp eax,dword ptr ss:[esp]
00700845 5A pop edx
00700846 58 pop eax
00700847 0F85 BB010000 jnz CheckReg.00700A08
0070084D 8D55 9C lea edx,dword ptr ss:[ebp-64]
00700850 8B83 A8030000 mov eax,dword ptr ds:[ebx+3A8]
这里又有两个跳,第一个跳
00700840 75 03 jnz short CheckReg.00700845
没有跳出第二个跳的范围,所以不用管它,主要是第二个跳,看它跳过去的位置00700A08处
----------------------------
00700A08 6A 40 push 40
00700A0A A1 1C077100 mov eax,dword ptr ds:[71071C]
00700A0F E8 C04AF5FF call CheckReg.006554D4
00700A14 50 push eax
00700A15 A1 24077100 mov eax,dword ptr ds:[710724]
00700A1A E8 B54AF5FF call CheckReg.006554D4
00700A1F 50 push eax
00700A20 8BC3 mov eax,ebx
00700A22 E8 9553FAFF call CheckReg.006A5DBC
00700A27 50 push eax
00700A28 E8 7777F5FF call <jmp.&user32.MessageBoxA>
--------------------------------
看着像错误提示框,不确定的话可以F8过来,就可以得到如下结果
看右下角,这又是一个错误提示,所以上面
00700847 0F85 BB010000 jnz CheckReg.00700A08
这个跳就不能让它实现,直接NOP掉就好了。。。(第二刀)
重新运程序到这里(前面修改过的地方都已保存),F8继续。。。
-------------------这里的代码是否与前面的相似-----------
0070086A 3B5424 04 cmp edx,dword ptr ss:[esp+4]
0070086E 75 03 jnz short CheckReg.00700873
00700870 3B0424 cmp eax,dword ptr ss:[esp]
00700873 5A pop edx
00700874 58 pop eax
00700875 0F85 8D010000 jnz CheckReg.00700A08
0070087B 8D55 98 lea edx,dword ptr ss:[ebp-68]
0070087E 8B83 98030000 mov eax,dword ptr ds:[ebx+398]
-------------------------------------------------------------------
同样NOP掉“ jnz CheckReg.00700A08 ”。。。(第三刀)
继续F8,可以注意下寄存器EDX中的数据如:
edx=006CA30C (CheckReg.006CA30C), ASCII "aZHiVAwi88m+OQupeq"
这应该就是加密过的注册码吧,这个我不会破,就等高手来解决了
咱还是继续F8吧。。。一直到
可以看到右下方的信息了吧,注册成功。。。。
哈哈,总算完成了(不过要输入5组5位的数字,当然还能在进一步优化,我就不弄了,有兴趣的朋友在试试吧)
+++++++++++++++++++++++++++++++++++++++++++
总结:虽然这不是我第一次玩破解,但却次第一次比较有成就感(之前弄的全是CrackMe,难度可是比这个软件大啊,完全是在打击俺弱小的心灵),见意初学者也可以下个试试,就当练手找自信了。。。
这个软件算了破解掉了,能用了,不过还是有个小问题,注册成功后还是总需要重复注册,无论用什么功能,在使用前都会重新弹出注册框,要求输入注册码,相当的烦人,希望高手能给予指点,在此先谢过了。。。。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!