TDMD軟體狗破解方法(帶狗殺狗) (6千字)

看雪資料發表於2001-10-25

TDMD軟體狗破解方法(帶狗殺狗)

工具:TRW2000
      Hview

這次殺狗還是用帶狗殺狗方法,破解狗的常用斷點:bpio 378,bpx deviceiocontrol,bpx environmentstringa(聽說對HASP狗有效,我沒有試過),今天我們用bpx deviceiocontrol這個斷點來破它。

一般TDMD狗的呼叫形式是:

:0057C054 53                      push ebx
:0057C055 56                      push esi
:0057C056 57                      push edi
:0057C057 56                      push esi
:0057C058 57                      push edi
:0057C059 52                      push edx
:0057C05A 51                      push ecx
:0057C05B 53                      push ebx
:0057C05C 50                      push eax
:0057C05D E82C020000              call 0057C28E    <=====判斷狗的CALL
:0057C062 85C0                    test eax, eax    <=====有狗就返回0
:0057C064 7405                    je 0057C06B      <=====有狗就跳到正常的程式,否則就退出程式
:0057C066 E989000000              jmp 0057C0F4

好了,下斷點後程式會被中斷在狗驅動中,從TRW2000中我們知道這個狗是金天地的TDMD,中斷後我們用F10和F12返回到主程式中,如下:

:0057C7B0 50                      push eax
:0057C7B1 FF15AC815D00            call dword ptr [005D81AC]    <====第一次讀狗,在TRW2000中應該是call KERNEL32!Deviceiocontrol,這個CALL是判斷埠上有沒有活動的印表機和加密狗
:0057C7B7 8945F8                  mov dword ptr [ebp-08], eax    <=====返回到這裡
:0057C7BA 837DF800                cmp dword ptr [ebp-08], 00000000
:0057C7BE 7421                    je 0057C7E1                    <=====不跳
:0057C7C0 83BD20FFFFFF00          cmp dword ptr [ebp+FFFFFF20], 00000000
:0057C7C7 7416                    je 0057C7DF                    <=====不跳
:0057C7C9 81BD20FFFFFF00300000    cmp dword ptr [ebp+FFFFFF20], 00003000
:0057C7D3 740A                    je 0057C7DF                    <======不跳
:0057C7D5 818520FFFFFF00005000    add dword ptr [ebp+FFFFFF20], 00500000

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:0057C7C7(C), :0057C7D3(C)
|
:0057C7DF EB0A                    jmp 0057C7EB

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0057C7BE(C)
|
:0057C7E1 C78520FFFFFF00005200    mov dword ptr [ebp+FFFFFF20], 00520000

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0057C7DF(U)
|
:0057C7EB EB01                    jmp 0057C7EE
:0057C7ED E8                      BYTE E8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0057C7EB(U)
|
:0057C7EE 83BD20FFFFFF00          cmp dword ptr [ebp+FFFFFF20], 00000000    <====第一次判斷狗
:0057C7F5 7427                    je 0057C81E      <====沒有狗就不跳,所以我們這裡要把它改為Jmps 0057C81E
:0057C7F7 EB01                    jmp 0057C7FA
:0057C7F9 E8                      BYTE E8


看一下0057C81E的程式碼:

:0057C81E 8B8530FEFFFF            mov eax, dword ptr [ebp+FFFFFE30]
:0057C824 A3A0705D00              mov dword ptr [005D70A0], eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0057C77F(C)
|
:0057C829 EB01                    jmp 0057C82C
:0057C82B E8                      BYTE E8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0057C829(U)
|
:0057C82C E8C8F8FFFF              call 0057C0F9    <=====計算密碼的CALL
:0057C831 0FB7D8                  movzx ebx, ax
:0057C834 C1E310                  shl ebx, 10
:0057C837 E8BDF8FFFF              call 0057C0F9    <=====計算密碼的CALL
:0057C83C 0FB7C0                  movzx eax, ax
:0057C83F 0BD8                    or ebx, eax
:0057C841 899D38FEFFFF            mov dword ptr [ebp+FFFFFE38], ebx
:0057C847 EB01                    jmp 0057C84A
:0057C849 E8                      BYTE E8

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0057C847(U)
|
:0057C84A A168705D00              mov eax, dword ptr [005D7068]
:0057C84F 50                      push eax
:0057C850 E883FAFFFF              call 0057C2D8
:0057C855 83C404                  add esp, 00000004
:0057C858 898540FEFFFF            mov dword ptr [ebp+FFFFFE40], eax
:0057C85E EB01                    jmp 0057C861

然後就是按F10一直向下走了,直到出現第二個CALL KERNEL32!Deviceiocontrol時:

:0057C8E1 50                      push eax
:0057C8E2 FF15AC815D00            call dword ptr [005D81AC]    <=====第二次讀狗(Call KERNEL32!Deviceiocontrol)
:0057C8E8 8945F8                  mov dword ptr [ebp-08], eax
:0057C8EB 8B45FC                  mov eax, dword ptr [ebp-04]
:0057C8EE 50                      push eax
:0057C8EF FF1558815D00            call dword ptr [005D8158]
:0057C8F5 8B8528FEFFFF            mov eax, dword ptr [ebp+FFFFFE28]
:0057C8FB 50                      push eax
:0057C8FC E85DFBFFFF              call 0057C45E
:0057C901 83C404                  add esp, 00000004
:0057C904 837DF800                cmp dword ptr [ebp-08], 00000000
:0057C908 7434                    je 0057C93E
:0057C90A 83BD20FFFFFF00          cmp dword ptr [ebp+FFFFFF20], 00000000  <=====第二次判斷狗,如果沒有狗,這裡的記憶體地址[81FD08]是一個非0的數,同時這個記憶體地址也是加密狗的重要記憶體地址,所以我們要把這個地址的內容改為0,我的改法是:and dword prt [ebp+ffffff20],00000000,剛好是一樣的程式碼長度
:0057C911 7513                    jne 0057C926
:0057C913 8B8524FFFFFF            mov eax, dword ptr [ebp+FFFFFF24]    <====取從狗中讀出的資料
:0057C919 338538FEFFFF            xor eax, dword ptr [ebp+FFFFFE38]    <====與另外的一個資料異或,將結果賦給EAX
:0057C91F A3D8705D00              mov dword ptr [005D70D8], eax        <=====將結果賦給記憶體地址[005D70D8],我們先帶狗執行程式,可知執行到這裡的時候,EAX的值是5CCAB580,所以我們必須把這個記憶體地址的內容賦為5CCAB580
:0057C924 EB16                    jmp 0057C93C   

我的改法是:

:0057C90A 83A520FFFFFF00          and dword ptr [ebp+FFFFFF20], 00000000
:0057C911 7513                    jne 0057C926
:0057C913 8B8524FFFFFF            mov eax, dword ptr [ebp+FFFFFF24]
:0057C919 B880B5CA5C              mov eax, 5CCAB580    <=====將EAX賦予5CCAB580
:0057C91E 90                      nop           
:0057C91F A3D8705D00              mov dword ptr [005D70D8], eax    <======將5CCAB580賦給記憶體地址[005D70D8]
:0057C924 EB16                    jmp 0057C93C

至此,TDMD狗就被我們破掉了

相關文章