軟體: netsuper
版本: 2002-4-23
破解者: 火翼[CCG]
組織 :
[CCG] (China Cracking Group)
使用軟體: w32dasm+trw2000
軟體沒有加殼,trw2000載入,選註冊
使用者名稱:firewings
註冊碼:78787878
設BPX hmemcpy(或者getwindowtexta),點選確定後斷下來
bd *
pmodule
返回在 call getwindowtexta的下一行
一直向下,注意在每個call前都壓入了什麼和各個暫存器得值和指向的記憶體地址
直到看到下面的程式碼
:004049B5 E80BB90100
call 004202C5
:004049BA 8B4660
mov eax, dword ptr [esi+60]
:004049BD 8378F819
cmp dword ptr [eax-08], 00000019
//輸入的註冊碼是否
//大於25位,下於則
//彈出錯誤對話方塊
:004049C1 7C50
jl 00404A13
:004049C3 50
push eax
:004049C4 B9C8174400
mov ecx, 004417C8
:004049C9 E872750100
call 0041BF40 //具體比較的call
:004049CE 83F8FF
cmp eax, FFFFFFFF
:004049D1 7440
je 00404A13
在 004049c1處 r fl o (改變比較結果),繼續進入0041bf40
:0041BF40 6A00
push 00000000
:0041BF42 FF742408
push [esp+08]
:0041BF46 E803000000
call 0041BF4E
:0041BF4B C20400
ret 0004
繼續進入0041bf4e
* Referenced by a CALL at Address:
|:0041BF46
|
:0041BF4E
56
push esi
:0041BF4F 8BF1
mov esi, ecx
:0041BF51 8B4C240C
mov ecx, dword ptr [esp+0C]
:0041BF55 8B06
mov eax, dword
ptr [esi]
:0041BF57 3B48F8
cmp ecx, dword ptr [eax-08]
:0041BF5A 7F12
jg 0041BF6E
:0041BF5C FF742408
push [esp+08]
:0041BF60
03C1 add
eax, ecx
:0041BF62 50
push eax
:0041BF63 E8902BFFFF
call 0040EAF8 //這裡是關鍵
:0041BF68 59
pop ecx
:0041BF69
85C0 test
eax, eax
:0041BF6B 59
pop ecx
:0041BF6C 7505
jne 0041BF73
繼續進入40eaf8
關鍵比較在0040eb30到0040EB61處
有點複雜的迴圈,很多語句寫的不間接,看上去很亂,其實
是在判斷記憶體中的密碼錶裡是否包含輸入的註冊碼
:0040EB30 381E
cmp byte ptr [esi],
bl//esi是指向密碼錶的指標,開始時指向第一個字元
//判斷密碼錶是否結束
:0040EB32 7433
je 0040EB67// 結束則跳
:0040EB34 3BF7
cmp esi, edi //edi為密碼錶結尾減去輸入的註冊碼的字元數
:0040EB36
772F ja 0040EB67 //如果當前密碼錶指標超過EDI則跳出
:0040EB38 381E
cmp byte ptr [esi], bl //沒用的一句,前面比較過了
:0040EB3A 8B450C
mov eax, dword ptr [ebp+0C]//把輸入的密碼的第一個字元的
//地址賦給EAX
:0040EB3D 7415
je 0040EB54 //沒用的,永遠也不會跳
:0040EB3F 8BD6
mov edx, esi //把地址運算了一下
:0040EB41 2BD0
sub edx, eax //用EAX+EDX代替了ESI
//使INC
EAX時,指向密碼錶的指標(EAX+EDX)也增加
* Referenced by a (U)nconditional or (C)onditional
Jump at Address:
|:0040EB52(C)
|
:0040EB43 8A08
mov cl, byte ptr [eax]//把俄EAX指向的字元賦給CL
:0040EB45 3ACB
cmp cl, bl //cl是否為0
:0040EB47
740B je 0040EB54
//為0則跳
:0040EB49 380C02
cmp byte ptr [edx+eax], cl //比較和EAX+EDX指向的密碼錶裡的
//那個字元是否相等
:0040EB4C 7506
jne 0040EB54
//不等則跳
:0040EB4E 40
inc eax//相等, 指標EAX加1
:0040EB4F 381C02
cmp byte ptr [edx+eax], bl//密碼錶是否結束
:0040EB52 75EF
jne 0040EB43//沒結束則跳
* Referenced by a (U)nconditional or (C)onditional
Jump at Addresses:
|:0040EB3D(C), :0040EB47(C), :0040EB4C(C)
|
:0040EB54 3818
cmp byte ptr [eax], bl//輸入的密碼是否結束
:0040EB56 740B
je 0040EB63//結束則跳
:0040EB58 56
push esi//把指向密碼錶的指標壓入
:0040EB59 E883FFFFFF call
0040EAE1//密碼錶的指標加1,返回在EAX裡
:0040EB5E 59
pop ecx
:0040EB5F
8BF0 mov
esi, eax//把指標傳給ESI
:0040EB61 EBCD
jmp 0040EB30//返回30處重新比較
演算法整理&爆破
取密碼錶第一位和使用者輸入密碼第一位比較,相同,則比較下一位,直到使用者輸入的密碼結束,不同,則
比較密碼錶的第二位和使用者輸入密碼第一位,相同,就繼續比較,直到使用者輸入的密碼結束。
如此迴圈,直到密碼錶指標指向的位置到密碼錶尾部不足使用者輸入的密碼字元數。
密碼錶如下
{D8E353B0-4202-457d-0CB3-82C1A86AC2AC}
{D8E353B0-4202-457d-1CB3-82C1A86AC2AC}
{D8E353B0-4202-457d-2CB3-82C1A86AC2AC}
{D8E353B0-4202-457d-3CB3-82C1A86AC2AC}
{D8E353B0-4202-457d-4CB3-82C1A86AC2AC}
{D8E353B0-4202-457d-5CB3-82C1A86AC2AC}
{D8E353B0-4202-457d-6CB3-82C1A86AC2AC}
{D8E353B0-4202-457d-7CB3-82C1A86AC2AC}
{D8E353B0-4202-457d-8CB3-82C1A86AC2AC}
{D8E353B0-4202-457d-9CB3-82C1A86AC2AC}
密碼和使用者名稱無關
只要密碼大於25位並且包含於密碼錶中任意一個就可以
爆破方法如下
關鍵call
0041bf40
有三處呼叫
40159a
4015c5
4049c9
爆破
004015a4 setne cl // 改為 sete cl
0040a5cd jne 00401672
//改為jmp 00401672
004049d1 je 00404a13 //改為 nop,nop