加密金剛鎖V3.00註冊演算法----(上集) (7千字)

看雪資料發表於2001-11-09

“加密金剛鎖”的前身就是“fedt for windows”,是一款專業的檔案加密解密工具。它適用於windows9x/me/nt/2000/XP 等操作平臺。

這個軟體的加密有一點過份,如果你暴破得不徹底的話,它會很不禮貌的說你的解密水平很差等等啦,我看到這些東西就他媽的反胃了,呵呵,所以破它是天經地義的啦。

工具:
    trw2000
    hview
    w32dasm

破解:crackjack[CCG]

好,我們看看他是用什麼樣的保護方式,以至作者那麼的囂張。用fi245檢查,發現它是用aspack V2.11加的殼,呵呵,這個殼是很溫柔的呵,解它就隨便在網上拉一個工具下來就可以解它了,我們今天要研究它的加密方法。這個軟體採取動態註冊的方法,如果輸入的註冊碼不正確,註冊按鈕就不可用。破解這類軟體一般用的中斷是bpx hmemcpy,我們先輸入名字,名字不小於4個字元,並且輸入7個註冊碼,然後切換到TRW,下斷點bpx hmemcpy,然後輸入第八個字元,程式被中點了,如下:

:0041175B 8B4DFC                  mov ecx, dword ptr [ebp-04]  <====返回到這裡
:0041175E 85C9                    test ecx, ecx
:00411760 7408                    je 0041176A
:00411762 8B45FC                  mov eax, dword ptr [ebp-04]
:00411765 8B50FC                  mov edx, dword ptr [eax-04]  <=====取註冊使用者名稱長度過
:00411768 EB02                    jmp 0041176C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411760(C)
|
:0041176A 33D2                    xor edx, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411768(U)
|
:0041176C 83FA04                  cmp edx, 00000004  <=====比較使用者名稱長度,如果小於4則註冊失敗
:00411775 33C0                    xor eax, eax
:00411777 8945F8                  mov dword ptr [ebp-08], eax
:0041177A 8D55F8                  lea edx, dword ptr [ebp-08]
:0041177D FF45E4                  inc [ebp-1C]
:00411780 8B83EC020000            mov eax, dword ptr [ebx+000002EC]
:00411786 E839B70400              call 0045CEC4
:0041178B 8B4DF8                  mov ecx, dword ptr [ebp-08]
:0041178E 85C9                    test ecx, ecx
:00411790 7408                    je 0041179A
:00411792 8B45F8                  mov eax, dword ptr [ebp-08]
:00411795 8B50FC                  mov edx, dword ptr [eax-04] <====取註冊碼長度
:00411798 EB02                    jmp 0041179C

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411790(C)
|
:0041179A 33D2                    xor edx, edx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:00411798(U)
|
:0041179C 83FA08                  cmp edx, 00000008  <====比較註冊碼長度,如果小於8則註冊失敗

然後按f10,來到下面的地方:

:004117D8 33C0                    xor eax, eax
:004117DA 8D4DEC                  lea ecx, dword ptr [ebp-14]
:004117DD 8B12                    mov edx, dword ptr [edx]
:004117DF 8945EC                  mov dword ptr [ebp-14], eax
:004117E2 A1446E4C00              mov eax, dword ptr [004C6E44]
:004117E7 FF45E4                  inc [ebp-1C]
:004117EA 8B00                    mov eax, dword ptr [eax]
:004117EC E8EFBDFFFF              call 0040D5E0            <=====註冊演算法
:004117F1 8D55EC                  lea edx, dword ptr [ebp-14]  <====真正的註冊碼地址
:004117F4 33C9                    xor ecx, ecx
:004117F6 52                      push edx
:004117F7 894DF4                  mov dword ptr [ebp-0C], ecx

:0041176F 0F8CDD000000            jl 00411852

好,我們追進4117ec的CALL,看它的註冊演算法是怎麼樣的:

程式將使用者名稱和機器碼連線在一起做為註冊碼的運算常數,如使用者名稱是linjie,機器碼是3CG5A3D8,則運算碼為linjie3CG5A3D8(0),注意,還要在運算碼最後加一個0H

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D69A(U)
|
:0040D6A1 021C01                  add bl, byte ptr [ecx+eax]  <=====累加運算碼,取結果的一個位元組(total)
:0040D6A4 40                      inc eax

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D68E(U)
|
:0040D6A5 8B55F8                  mov edx, dword ptr [ebp-08]
:0040D6A8 85D2                    test edx, edx
:0040D6AA 7408                    je 0040D6B4
:0040D6AC 8B55F8                  mov edx, dword ptr [ebp-08]
:0040D6AF 8B4AFC                  mov ecx, dword ptr [edx-04]
:0040D6B2 EB02                    jmp 0040D6B6

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D6AA(C)
|
:0040D6B4 33C9                    xor ecx, ecx

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D6B2(U)
|
:0040D6B6 3BC1                    cmp eax, ecx
:0040D6B8 7CD6                    jl 0040D690
:0040D6BA 8B45F8                  mov eax, dword ptr [ebp-08]  <====取運算碼地址



:0040D6CB 8B45A4                  mov eax, dword ptr [ebp-5C]  <====取運算碼地址
:0040D6CE 8A0C02                  mov cl, byte ptr [edx+eax]  <====取運算碼第N位
:0040D6D1 8BC6                    mov eax, esi                <====運算碼的位置
:0040D6D3 02C8                    add cl, al                  <====cl=運算碼ASCII值+運算碼位置(fx1)
:0040D6D5 8BD6                    mov edx, esi                <====運算碼位置
:0040D6D7 02DA                    add bl, dl                  <====累加總數(total)+運算碼(fx2)位置
:0040D6D9 32CB                    xor cl, bl                  <=====cl(fx)=fx1 xor fx2
:0040D6DB 8B45F8                  mov eax, dword ptr [ebp-08]
:0040D6DE 85C0                    test eax, eax
:0040D6E0 7408                    je 0040D6EA
:0040D6E2 8B55F8                  mov edx, dword ptr [ebp-08]
:0040D6E5 8B42FC                  mov eax, dword ptr [edx-04]
:0040D6E8 EB02                    jmp 0040D6EC
.
.
.
:0040D702 8A0402                  mov al, byte ptr [edx+eax]  <====取運算碼的最後一位
:0040D705 8BD6                    mov edx, esi  <=====要計算的註冊碼位置regcode(第一位註冊碼是0,第二位是1,其它的類推)
:0040D707 02C2                    add al, dl    <=====運算碼+運算碼位置
:0040D709 8BD6                    mov edx, esi
:0040D70B 0FAFD6                  imul edx, esi  <=====regcode*regcode
:0040D70E 02C2                    add al, dl    <=====(運算碼+運算碼位置)+(regcode*regcode)
:0040D710 8B55A0                  mov edx, dword ptr [ebp-60]  <=====迴圈變數
:0040D713 0FAF55A0                imul edx, dword ptr [ebp-60] <=====迴圈變數*迴圈變數
:0040D717 2AC2                    sub al, dl        <=====相減(fy)
:0040D719 8B55F8                  mov edx, dword ptr [ebp-08]
:0040D71C 85D2                    test edx, edx
:0040D71E 7408                    je 0040D728
:0040D720 8B55F8                  mov edx, dword ptr [ebp-08]
:0040D723 8B52FC                  mov edx, dword ptr [edx-04]
:0040D726 EB02                    jmp 0040D72A
.
.
.
:0040D72A 66C745C82000            mov [ebp-38], 0020
:0040D730 2AC2                    sub al, dl    <====fy-0E(運算碼長度)
:0040D732 8D55F0                  lea edx, dword ptr [ebp-10]
:0040D735 32C8                    xor cl, al    <====fx xor (fy-0E)結果作為第一個註冊碼運算函式的引數
:0040D737 33C0                    xor eax, eax
:0040D739 8945F0                  mov dword ptr [ebp-10], eax
:0040D73C 8BD9                    mov ebx, ecx
:0040D73E FF45D4                  inc [ebp-2C]
:0040D741 8B45B4                  mov eax, dword ptr [ebp-4C]
:0040D744 E887FCFFFF              call 0040D3D0
:0040D749 8B4DF0                  mov ecx, dword ptr [ebp-10]
:0040D74C 85C9                    test ecx, ecx
:0040D74E 7405                    je 0040D755
:0040D750 8B4DF0                  mov ecx, dword ptr [ebp-10]
:0040D753 EB05                    jmp 0040D75A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D74E(C)
|
:0040D755 B90A7F4B00              mov ecx, 004B7F0A

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0040D753(U)
|
:0040D75A 8BD3                    mov edx, ebx
:0040D75C 8B45B4                  mov eax, dword ptr [ebp-4C]
:0040D75F E81CE0FFFF              call 0040B780    <====第一個註冊碼運算函式

(未完待續)
:0040D764 8B55A0                  mov edx, dword ptr [ebp-60]

相關文章