用DeDe v2.5破Dephi程式Fast Browser (7千字)

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

Fast Browser 是一個非常棒的多執行緒瀏覽器,它讓你的網上衝浪變得更加簡單和方便,極大地擴充了瀏覽器的功能。介紹和下載地址:http://download.pchome.net/internet/browser/browser/875.html

我個人很喜歡它,但是要註冊才無功能限制。而且註冊方式比較特別,輸入username後,要上網檢驗是否合法,如果沒有你名字的定單,那麼username是非法的。
先用fi看一下FastBrowser.exe是PECompact v1.40的殼。很好脫,衝擊波2k查到OEP是503254,用trw2k載入執行到503254後,下makepe命令即可。
執行脫殼後的程式……ok!挺正常,慢……居然沒有skin(“皮膚”)*@!#%$#^&#$(……
看來它在OEP之前就載入skin了。看看原始目錄發現有個skindll.dll挺可疑。把它改名,再執行原始的FastBrowser.exe,果然“皮膚”不見了。好,下斷點bpx loadlibrarya;重新執行,在loadlibrarya處停下,看一下引數:d *(esp+4) ,果然是skindll.dll!F12回到FastBrowser.exe領空:
======================================================================================
:005034C0 55                      push ebp
:005034C1 8BEC                    mov ebp, esp
:005034C3 83C4F8                  add esp, FFFFFFF8

* Possible StringData Ref from Code Obj ->"skindll.dll"
                                  |
:005034C6 68F4345000              push 005034F4

* Reference To: KERNEL32.LoadLibraryA, Ord:0000h
                                  |
:005034CB E8E0FFFFFF              Call 005034B0
:005034D0 8945FC                  mov dword ptr [ebp-04], eax <==停在這
:005034D3 6A0A                    push 0000000A
:005034D5 8B45FC                  mov eax, dword ptr [ebp-04]
:005034D8 50                      push eax

* Reference To: KERNEL32.GetProcAddress, Ord:0000h
                                  |
:005034D9 E8DAFFFFFF              Call 005034B8 
:005034DE 8945F8                  mov dword ptr [ebp-08], eax
:005034E1 837DF800                cmp dword ptr [ebp-08], 00000000
:005034E5 7403                    je 005034EA

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:0050349F(C)
|
:005034E7 FF55F8                  call [ebp-08]

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:005034E5(C)
|
:005034EA E8B9FFFFFF              call 005034A8
:005034EF 59                      pop ecx
:005034F0 59                      pop ecx
:005034F1 5D                      pop ebp
:005034F2 C3                      ret
======================================================================================
當函式返回後來到這裡:
* Referenced by a CALL at Address:
|:005034EA 
|
:005034A8 E8A7FDFFFF              call 00503254
:005034AD C3                      ret
=========================================================================================
哈哈……這裡不就是OEP嘛!
往上看,在005034C0處,憑經念此處應該是call開始的第一條指令。 所以冒險把OEP修正為005034C0 ,用peditor改好後,執行,一切ok!
脫殼後的FastBrowser.exe再用fi檢視,居然是dephi寫的!(第一次crack dephi程式,心裡沒底,呵呵……),剛好手頭上有反編譯dephi工具dede v2.5,用dede裝入FastBrowser.exe,點選process按扭開始反編譯……。

趁反編譯的空,先整理一下思路,前面講過FastBrowser.exe加密的特別地方,但種類軟體通常有個弱點,就是用一個bool型的全域性變數來表示是否註冊。所以主要找到它初始化的地方,將它改為01,就變成註冊版了。

現在點選dede中的procedures按扭,可以看到幾個函式,再點選右邊的“Disassemble proc”按扭,輸入503254(即原始的OEP)這是檢視程式的人口函式(相當於主程式):
00503254  55                    push    ebp
00503255  8BEC                  mov    ebp, esp
00503257  83C4EC                add    esp, -$14
0050325A  53                    push    ebx
0050325B  56                    push    esi
0050325C  33C0                  xor    eax, eax
0050325E  8945EC                mov    [ebp-$14], eax
00503261  8945F0                mov    [ebp-$10], eax
00503264  B8CC2E5000            mov    eax, $00502ECC

* Reference to: sysinit.@InitExe;
|
00503269  E8823FF0FF            call    004071F0
0050326E  8B1DD4655000          mov    ebx, [$5065D4]
00503274  33C0                  xor    eax, eax
00503276  55                    push    ebp
00503277  687D345000            push    $0050347D

***** TRY
|
0050327C  64FF30                push    dword ptr fs:[eax]
0050327F  648920                mov    fs:[eax], esp
00503282  A13C685000            mov    eax, dword ptr [$50683C]
00503287  C60000                mov    byte ptr [eax], $00
0050328A  A140675000            mov    eax, dword ptr [$506740]
0050328F  C60000                mov    byte ptr [eax], $00
00503292  A16C685000            mov    eax, dword ptr [$50686C]
00503297  C60001                mov    byte ptr [eax], $01

|
0050329A  E80D1BFDFF            call    004D4DAC
0050329F  8B15DC625000          mov    edx, [$5062DC]  <====關鍵!!
005032A5  8802                  mov    [edx], al
005032A7  A1E0655000            mov    eax, dword ptr [$5065E0]
005032AC  803800                cmp    byte ptr [eax], $00
005032AF  740A                  jz      005032BB

|
005032B1  E8EA54FDFF            call    004D87A0
005032B6  E9A7010000            jmp    00503462

|
005032BB  E82C25FDFF            call    004D57EC
005032C0  84C0                  test    al, al
005032C2  0F849A010000          jz      00503462
005032C8  A140675000            mov    eax, dword ptr [$506740]
005032CD  803800                cmp    byte ptr [eax], $00
005032D0  7439                  jz      0050330B
005032D2  A1DC625000            mov    eax, dword ptr [$5062DC]
005032D7  803800                cmp    byte ptr [eax], $00
005032DA  752F                  jnz    0050330B
005032DC  33C9                  xor    ecx, ecx
005032DE  B201                  mov    dl, $01

* Reference to class TRegisterForm  <===註冊視窗!!
|
005032E0  A1C8B14D00            mov    eax, dword ptr [$4DB1C8]

* Reference to: forms.TCustomForm.Create(TCustomForm;boolean;Classes.TComponent);
|          or: forms.TDataModule.Create(TDataModule;boolean;Classes.TComponent);
|
005032E5  E83E92F4FF            call    0044C528

==================================================================
看到TRegisterForm了嗎?呵呵…… 往上看,全域性變數[$506740]和[$5062DC]很可疑,經過測試[$5062DC]就是代表是否註冊的全域性變數。它在哪裡初始化呢?再往上看,0050329F處就是了!我將它改為:
inc al
mov [5062dc],al
nop
再次執行,Mmm……已經是註冊版了,但標題還是未註冊的,真煩!用w32asm黃金版反彙編,查詢字串"(Unregistered Version)"
=============================================================================
:004D4B53 E86CF2F2FF              call 00403DC4
:004D4B58 803D805E500000          cmp byte ptr [00505E80], 00
:004D4B5F 752B                    jne 004D4B8C
:004D4B61 803D745E500000          cmp byte ptr [00505E74], 00
:004D4B68 7522                    jne 004D4B8C  <=======注意
:004D4B6A 84DB                    test bl, bl
:004D4B6C 751E                    jne 004D4B8C
:004D4B6E B80C7D5000              mov eax, 00507D0C

* Possible StringData Ref from Code Obj ->"(Unregistered Version)"
                                  |
:004D4B73 BAF04B4D00              mov edx, 004D4BF0
:004D4B78 E87BF4F2FF              call 00403FF8
:004D4B7D B8107D5000              mov eax, 00507D10

* Possible StringData Ref from Code Obj ->"(Unregistered Version)"
                                  |
:004D4B82 BAF04B4D00              mov edx, 004D4BF0
:004D4B87 E86CF4F2FF              call 00403FF8

* Referenced by a (U)nconditional or (C)onditional Jump at Addresses:
|:004D4B5F(C), :004D4B68(C), :004D4B6C(C)
|
:004D4B8C 33C0                    xor eax, eax
=======================================================================
將004D4B68處jne該為jmp即可。

其實這個軟體應該可以找到註冊碼的,關鍵在50329a處的call;我大概看了一下,它在.\Fast Browser\Pro4目錄下查詢serialcode.key和.\Fast Browser\Pro4\Search\buy兩個keyfile……,不過我一向不喜歡數字遊戲,還是請各位大蝦出馬吧!

相關文章