【声明】
      我写这篇文章是以技术交流为主,希望大家在转载时能保持文章的完整性。
         
【前言】
    看过牧童兄的《小牧童放牛赶“狗“笨笨招(上)》后,一直想找个加密狗软件学习研究一下。恰好小弟所在公司为了实现会计电算化。购买了正版的《速达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》就是这句话的真实写照。