破解《速达3000 Pro》 正式版的加密狗
【声明】
我写这篇文章是以技术交流为主,希望大家在转载时能保持文章的完整性。
【前言】
看过牧童兄的《小牧童放牛赶“狗“笨笨招(上)》后,一直想找个加密狗软件学习研究一下。恰好小弟所在公司为了实现会计电算化。购买了正版的《速达3000
pro》进销存财务软件。小弟正好拿来练练手,在小弟的软硬兼施外加一顿肯德基的诱惑下公司财务部的MM,终于肯将软件和加密狗借给我一观。
这是小弟第一次破解加密狗的软件,功力有限。如有不足之处,请各位大侠指点。
软件简介:《速达3000 PRO》软件是非常著名的进销存财务软件。
破解工具:
(1)Soft-ICE v4.01 //及各种补丁Frogsice
1.08、icepatch 、si_bd.zip
(2)wmldr.zip、 //让Soft-ICE能够在Win
ME下运行的补丁。
(3)IceDump 6.015
(4)Trw2000 1.22
(5)UltraEdit-32 v7.10b
(6)CodeFusion Wizard V3.00 //补丁制作工具
在破解之前,我们需要对软件有一个基本的了解。 在没有安装加密狗之前,在启动软件时会弹出“未检测到本软件使用的软件狗,本软件将工作试验版状态”对话框。在软件的启动画面中醒目的有红色“试用版”三个字。就进入了“选择公司帐套”。在进入软件后。在
“关于速达3000 PRO”中同样有红色“试用版”三个字。
首先,取出我们的打狗棒Soft-ICE,在 LPT1上设置了最常用破狗断点: BPIO -H 378 R。 停在了这儿:
EAX=CA51033F EBX=C17CDB9C ECX=CA51CCBC EDX=CA510378
ESI=CA51CE64
EDI=C17CDBB0 EBP=CA51CB6C ESP=CA51CB5C EIP=C17CB061
o d I S z a p c
CS=0028 DS=0030 SS=0030 ES=0030 FS=0078 GS=0030
SS:CA51CB68=CB88
==================================================byte==============PROT==?0)==
0030:00000000 CC 00 FF 2F 2B 04 70 00-C3 E2 00 F0 2B 04 70 00 .../+.p.....+.p.
0030:00000010 2B 04 70 00 54 FF 00 F0-08 80 00 F0 6F EF 00 F0 +.p.T.......o...
0030:00000020 00 00 00 C8 87 E9 00 F0-6F EF 00 F0 6F EF 00 F0 ........o...o...
0030:00000030 6F EF 00 F0 6F EF 00 F0-57 EF 00 F0 6F EF 00 F0 o...o...W...o...
==========================================================================ROT32==
0028:C17CB060 IN AL,DX
0028:C17CB061 MOV [EBP-04],AX <<--光标停在了这儿
0028:C17CB065 MOV AX,[EBP-04]
0028:C17CB069 JMP C17CB06E
0028:C17CB06E POP EDI
0028:C17CB06F POP ESI
0028:C17CB070 POP EBX
0028:C17CB071 LEAVE
0028:C17CB072 RET
0028:C17CB073 PUSH EBP
0028:C17CB074 MOV EBP,ESP
0028:C17CB076 PUSH EBX
0028:C17CB077 PUSH ESI
0028:C17CB078 PUSH EDI
0028:C17CB079 MOV AL,[EBP+0C]
0028:C17CB07C MOV DX,[EBP+08]
0028:C17CB080 OUT DX,AL
0028:C17CB081 POP EDI
0028:C17CB082 POP ESI
0028:C17CB083 POP EBX
0028:C17CB084 LEAVE
0028:C17CB085 RET
0028:C17CB086 PUSH EBP
0028:C17CB087 MOV EBP,ESP
0028:C17CB089 SUB ESP,1C
====================================TDSD(01)+3060==============================
:CLS
:pagein n 1.txt
从上面的信息可以推断出这是一个TDSD狗加密的软件(可能是彩虹DJ系列的狗),我对狗认识不多,请指正。在按了几次F12后,就跳到了Sd3000的领空。但我无从这该死的SD3000领空中出来!按住
F12,可是什么都没有变!使我陷入困境了。
在这里我发现一个奇怪的现象。在SD3000的领空时,用Soft-ICE跟踪时按F10代码会随机改变。而Trw2000 1.22则没有这样的现象发生。我怀疑加密狗防Soft-ICE造成。但是在给Soft-ICE打上Frogsice
1.08、icepatch 、si_bd.zip等补丁后,还是有这样的情况发生。不知是什么问题。有那位大虾知道请告知!! 小弟先行谢谢了。
第一次解狗,我不可能解加密狗的硬件,我看过的一些解狗的教程中有提到,“狗保护的弱点一般都是在软件的本身!”也就是说要在软件本身下手。对了,软件在启动时有对话框。我们就从这个点进行突破。
下指令bpx createwindowex 拦截软件的对话框。
来到cc3250mt.dll的领空。
......................
016F:3257DBC9 INC EBX
016F:3257DBCA JMP SHORT 3257DBCD
016F:3257DBCC INC EBX
016F:3257DBCD MOV AL,[EBX]
016F:3257DBCF TEST AL,AL
016F:3257DBD1 JZ 3257DBD7
016F:3257DBD3 CMP AL,20
016F:3257DBD5 JZ 3257DBCC
016F:3257DBD7 CMP AL,09
016F:3257DBD9 JZ 3257DBCC
016F:3257DBDB CALL 3257DC24
016F:3257DBE0 PUSH EAX
016F:3257DBE1 PUSH EBX
016F:3257DBE2 PUSH BYTE +00
016F:3257DBE4 PUSH BYTE +00
016F:3257DBE6 CALL `KERNEL32!GetModuleHandleA`
016F:3257DBEB PUSH EAX
016F:3257DBEC CALL NEAR [ESI+18]
<<---关键! ! !
016F:3257DBEF ADD ESP,BYTE +10
016F:3257DBF2 PUSH EAX
016F:3257DBF3 CALL `CC3250MT!_exit`
016F:3257DBF8 POP ECX
016F:3257DBF9 JMP SHORT 3257DC1C
016F:3257DBFB MOV EDX,[325AD400]
016F:3257DC01 PUSH EDX
016F:3257DC02 MOV ECX,[325AD3FC]
016F:3257DC08 PUSH ECX
......................
当走到016F:3257DBEC CALL NEAR [ESI+18]时,按F10带过此处时,软件弹出“未检测到本软件使用的软件狗,本软件将工作试验版状态”对话框。估计在016F:3257DBEC
CALL NEAR [ESI+18]此处有重大嫌疑,重新在此处下中断点。按F8进入此CAll。来到了SD3000的领空,就真正进入的软件检查加密的核心。
.................
016F:004017F4 55 PUSH
EBP
016F:004017F5 8BEC MOV
EBP,ESP
016F:004017F7 83C4C0 ADD
ESP,BYTE -40
016F:004017FA 53 PUSH
EBX
016F:004017FB 56 PUSH
ESI
016F:004017FC 57 PUSH
EDI
016F:004017FD B8D8C97500 MOV EAX,0075C9D8
016F:00401802 E8AD782800 CALL 006890B4
016F:00401807 6A00 PUSH
BYTE +00
016F:00401809 680EC97500 PUSH DWORD 0075C90E
016F:0040180E E853933500 CALL `USER32!FindWindowA`
016F:00401813 8945C0 MOV
[EBP-40],EAX
016F:00401816 837DC000 CMP
DWORD [EBP-40],BYTE +00
016F:0040181A 7622 JNA
0040183E
016F:0040181C 6A00 PUSH
BYTE +00
016F:0040181E 6A00 PUSH
BYTE +00
016F:00401820 68B9080000 PUSH DWORD 08B9
016F:00401825 FF75C0 PUSH DWORD
[EBP-40]
016F:00401828 E841943500 CALL `USER32!PostMessageA`
016F:0040182D 33C0 XOR
EAX,EAX
016F:0040182F 8B55C4 MOV
EDX,[EBP-3C]
016F:00401832 64891500000000 MOV `DOSMGR_BackFill_Allowed`,EDX
016F:00401839 E9F0030000 JMP 00401C2E
016F:0040183E C6050056890000 MOV BYTE [00895600],00
016F:00401845 803D0056890000 CMP BYTE [00895600],00
016F:0040184C 0F852B010000 JNZ NEAR 0040197D
016F:00401852 C6050056890001 MOV BYTE [00895600],01
016F:00401859 66C745D41400 MOV WORD [EBP-2C],14
016F:0040185F 8D45F8 LEA
EAX,[EBP-08]
016F:00401862 E8D1030000 CALL 00401C38
016F:00401867 FF45E0 INC
DWORD [EBP-20]
016F:0040186A E86D353500 CALL `SD3000!@Dogtestpro@_ManCheckDlgDan$qqrv`
016F:0040186F 66C745D40800 MOV WORD [EBP-2C],08
016F:00401875 66C745D42000 MOV WORD [EBP-2C],20
016F:0040187B BA1FC97500 MOV EDX,0075C91F
016F:00401880 8D45F4 LEA
EAX,[EBP-0C]
016F:00401883 E8EC3D3500 CALL 00755674
016F:00401888 FF45E0 INC
DWORD [EBP-20]
016F:0040188B 8D55F4 LEA
EDX,[EBP-0C]
016F:0040188E 8D45F8 LEA
EAX,[EBP-08]
016F:00401891 E856413500 CALL 007559EC
016F:00401896 50 PUSH
EAX
016F:00401897 FF4DE0 DEC
DWORD [EBP-20]
016F:0040189A 8D45F4 LEA
EAX,[EBP-0C]
016F:0040189D BA02000000 MOV EDX,02
016F:004018A2 E861403500 CALL 00755908
016F:004018A7 59 POP
ECX
016F:004018A8 84C9 TEST
CL,CL
016F:004018AA 7412 JZ
004018BE
016F:004018AC E83F373500 CALL `SD3000!@Dogtestpro@_GoldenSoftCheckdlgDan$qqrv`
016F:004018B1 84C0 TEST
AL,AL
016F:004018B3 7457 JZ
0040190C
016F:004018B5 C6050056890000 MOV BYTE [00895600],00
016F:004018BC EB4E JMP
SHORT 0040190C
016F:004018BE 66C745D42C00 MOV WORD [EBP-2C],2C
016F:004018C4 BA21C97500 MOV EDX,0075C921
016F:004018C9 8D45F0 LEA
EAX,[EBP-10]
016F:004018CC E8A33D3500 CALL 00755674
016F:004018D1 FF45E0 INC
DWORD [EBP-20]
016F:004018D4 8D55F0 LEA
EDX,[EBP-10]
016F:004018D7 8D45F8 LEA
EAX,[EBP-08]
016F:004018DA E80D413500 CALL 007559EC
016F:004018DF 50 PUSH
EAX
016F:004018E0 FF4DE0 DEC
DWORD [EBP-20]
016F:004018E3 8D45F0 LEA
EAX,[EBP-10]
016F:004018E6 BA02000000 MOV EDX,02
016F:004018EB E818403500 CALL 00755908
016F:004018F0 59 POP
ECX
016F:004018F1 84C9 TEST
CL,CL
016F:004018F3 7417 JZ
0040190C
016F:004018F5 33C0 XOR
EAX,EAX
016F:004018F7 E820BB0100 CALL 0041D41C
016F:004018FC 84C0 TEST
AL,AL
016F:004018FE 740C JZ
0040190C
016F:00401900 E8833B3500 CALL `SD3000!@Dogtestpro@WriteNewInfo$qqrv`
016F:00401905 C6050056890000 MOV BYTE [00895600],00
016F:0040190C 803D0056890000 CMP BYTE [00895600],00
016F:00401913 7452 JZ
00401967
016F:00401915 BADEC87500 MOV EDX,0075C8DE
016F:0040191A 8D45E8 LEA
EAX,[EBP-18]
016F:0040191D E8523D3500 CALL 00755674
016F:00401922 FF45E0 INC
DWORD [EBP-20]
016F:00401925 FF30 PUSH
DWORD [EAX]
016F:00401927 66C745D43800 MOV WORD [EBP-2C],38
016F:0040192D BA23C97500 MOV EDX,0075C923
016F:00401932 8D45EC LEA
EAX,[EBP-14]
016F:00401935 E83A3D3500 CALL 00755674
016F:0040193A FF45E0 INC
DWORD [EBP-20]
016F:0040193D 8B00 MOV
EAX,[EAX]
016F:0040193F 33C9 XOR
ECX,ECX
016F:00401941 5A POP
EDX
016F:00401942 E849E50100 CALL 0041FE90
//走到这儿。对话框跳出来了。
016F:00401947 FF4DE0 DEC
DWORD [EBP-20]
016F:0040194A 8D45E8 LEA
EAX,[EBP-18]
016F:0040194D BA02000000 MOV EDX,02
016F:00401952 E8B13F3500 CALL 00755908
016F:00401957 FF4DE0 DEC
DWORD [EBP-20]
016F:0040195A 8D45EC LEA
EAX,[EBP-14]
016F:0040195D BA02000000 MOV EDX,02
016F:00401962 E8A13F3500 CALL 00755908
016F:00401967 FF4DE0 DEC
DWORD [EBP-20]
016F:0040196A 8D45F8 LEA
EAX,[EBP-08]
016F:0040196D BA02000000 MOV EDX,02
.................
不知道,大家看了上面的代码,有什么感觉。给我的第一个感觉就是[00895600]地址有问题。眼睛尖的朋友会注意到,程序在很多地方都调用了[00895600]这个地址的数值。而且在[00895600]这个地址后面几乎都有比较、跳转指令。难道这个[00895600]这个地址真有问题?为了证明我的想法是正确的。这需要来通过调试来验证。
首先,看一下什么地方可以跳过016F:00401942 E849E50100 CALL
0041FE90 子程序。向上找发现最近一处在:
016F:0040190C 803D0056890000 CMP BYTE [00895600],00
//比较[00895600]和00的值
016F:00401913 7452 JZ
00401967 //改为jnz.
可以跳过016F:00401942 E849E50100 CALL 。
通过修改,程序在启动时。对话框不见了 ,但是在启动画面中还有“试用版”三个字。这是一个不错的现象哦!虽然,我跳过了对话框,可以估计软件其他地方还需要调用加密狗的标记,因为我是用强制手段跳过检查加密狗对话框的,所以还有“试用版”的文字。
在看看016F:0040190C 803D0056890000 CMP BYTE
[00895600],00 是比较[00895600]和00的值.
实际上00895600=1。同00不相等,用 E 命令强制把00895600=1改为=0。走到016F:00401913 7452
JZ 00401967 时自然就跳过016F:00401942 E849E50100
CALL处。按X键退出调试状态。通过以上修改,程序在启动时,不但对话框不不见了,连启动画面中的“试用版”三个字也不见了。如果我没有猜错的话,00895600=0应该是软件检查已经安装加密狗的标记。
下面我们来分析软件是如何加解密的过程吧。
第一步:锁住加密的软件。
...........
016F:0040183E C6050056890000 MOV BYTE [00895600],00
//将00传送008995600地址中。
016F:00401845 803D0056890000 CMP BYTE [00895600],00
//比较00和008995600的值。
016F:0040184C 0F852B010000 JNZ NEAR 0040197D
//不相等就跳。
016F:00401852 C6050056890001 MOV BYTE [00895600],01
//将01传送008995600地址中。
. .
. .
用狗锁住软件。
. .
. .
第二步:调用子程序检查是否安装了加密狗。
016F:004018A2 E861403500 CALL 00755908
//检查狗。
016F:004018A7 59 POP
ECX
//出栈。
016F:004018A8 84C9 TEST
CL,CL //CL是否等于1。<CL=1表示安装了狗>
016F:004018AA 7412 JZ
004018BE //没安狗,跳到004018BE。
016F:004018AC E83F373500 CALL `SD3000!@Dogtestpro@_GoldenSoftCheckdlgDan$qqrv`
//看函数名就明白了吧。
016F:004018B1 84C0 TEST
AL,AL //al是否等于1。<AL=1表示安装了狗>
016F:004018B3 7457 JZ
0040190C //没安狗,跳到0040190C。
016F:004018B5 C6050056890000 MOV BYTE [00895600],00
<<--把狗处于待解开的状态!!!
016F:004018BC EB4E JMP
SHORT 0040190C //无条件跳到0040190C
. .
. .
. .
. .
第三步:解开狗。
016F:0040190C 803D0056890000 CMP BYTE [00895600],00
//比较00895600和00。
016F:00401913 7452 JZ
00401967 //00895600=0
就跳到00401967。
.............
好的! 狗被解开了
同过上面的调试和分析,我们只要使 [00895600] 的值等于 0 ,就可以把狗解开! 我改。
016F:004018A2 E861403500 CALL 00755908
016F:004018A7 59 POP
ECX
016F:004018A8 84C9 TEST
CL,CL
016F:004018AA 7412 JZ
004018BE <<--改为jnz
016F:004018AC E83F373500 CALL `SD3000!@Dogtestpro@_GoldenSoftCheckdlgDan$qqrv`
016F:004018B1 84C0 TEST
AL,AL
016F:004018B3 7457 JZ
0040190C <<--改为jnz
016F:004018B5 C6050056890000 MOV BYTE [00895600],00
//将00传送008995600地址中
016F:004018BC EB4E JMP
SHORT 0040190C
用UltraEdit打开Sd3000.exe
找到:74 12 E8 3F 37 35 00 84 C0 74 57
修改:75 -- -- -- -- -- -- -- -- 75 --
改了两个字节,就把加密狗给解开了。
现在给你的软件打上补丁,运行试试看!
正好应了牧童兄的话:“有些软件作者可是非常想信软件狗的保护能力,在软件中其它保护做得很少,甚至拦出错消息框就能解决问题。” 《速达3000
pro》就是这句话的真实写照。
- 标 题:破解《速达3000 Pro》 正式版的加密狗 (16千字)
- 作 者:xiaqin[CCG]
- 时 间:2001-3-16 9:26:27
- 链 接:http://bbs.pediy.com