破解《速達3000 Pro》 正式版的加密狗 (16千字)

看雪資料發表於2001-03-16

破解《速達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》就是這句話的真實寫照。

相關文章