一個區域網工具的註冊演算法分析 (5千字)

看雪資料發表於2015-11-15

軟體:  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

相關文章