脫Crunch/PE -> BitArts的殼。 (3千字)

看雪資料發表於2002-05-03

脫Crunch/PE -> BitArts的殼。
這個殼不難,我沒有發現他有反跟蹤的功能,不如軟體的作者以前給他的作品加的PEcompact修改版的殼難!
為了遵守論壇上的約定,我不說軟體的名字。
其實這個殼挺簡單的,好了,開始吧!
執行trw,載入程式。
BitArts:005A2000 start          proc near
BitArts:005A2000                push    ebp
BitArts:005A2001                call    5A2006 <---這要按F8,因為並不是真正的call,只是jmp的變形。在脫aspr的殼是也會經常的碰到這種情況,那麼要如何來判斷什麼時候按F8什麼時候按F10呢?我發現,如果這個call是呼叫很近的地址的時候,比如上面的call 5A2006,這個5A2006就是下面的地址,所以要按F8,否則程式就會執行了,達不到跟蹤的目的。相反的如果呼叫是比較遠的地址時可以用F10代過,但是也要看情況而定。
BitArts:005A2006                pop    ebp
BitArts:005A2007                sub    ebp, 6
BitArts:005A200A                mov    eax, ebp
BitArts:005A200C                push    ebp
BitArts:005A200D                pusha
BitArts:005A200E                mov    [ebp+348Ah], ebp
BitArts:005A2014                sub    eax, [ebp+3465h]
BitArts:005A201A                mov    [ebp+2519h], eax
BitArts:005A2020                push    ebp
BitArts:005A2021                mov    ebx, 1ECDh
BitArts:005A2026                add    ebx, ebp
BitArts:005A2028                push    ebx
BitArts:005A2029                push    dword ptr fs:0
BitArts:005A202F                mov    fs:0, esp
BitArts:005A2035                cmp    byte ptr [ebp+3690h], 0
BitArts:005A203C                jnz    short loc_5A2047
BitArts:005A203E                mov    byte ptr [ebp+3690h], 1
BitArts:005A2045                jmp    short loc_5A205C
下面就一直按F10,不過你要注意看ECX裡面的資料,因為通常都是ECX在做記數器,看著ECX用F7來跳過一段一段的解壓過程。這裡有個小技巧,假設你現在的位置是:
5A611C:jmp005A6074  <-----你現在的位置。
5A6121: mov ecx,13
你會看到這個jmp是向前跳轉的,這時按F6,然後把光棒放到5A6121的位置上,按F7。通常的情況下你會安全著陸的,在脫aspr的殼時用這樣的方法也可以跳過重複的步驟。
從5A6121這開始再跳過一個jmp就很快的來到了程式真正的入口了,有個jmp eax
好了,用命令makepe dump.exe就行了,到此脫殼結束。
執行一下dump.exe,發現logo出現後就馬上推出了,用trw分別載入dump.exe和未脫殼的程式跟蹤對比後發現:
:004C9C05 BA9CA64C00              mov edx, 004CA69C
:004C9C0A 8B45FC                  mov eax, dword ptr [ebp-04]
:004C9C0D E8CAA10100              call 004E3DDC
:004C9C12 8B45A4                  mov eax, dword ptr [ebp-5C]
:004C9C15 50                      push eax
:004C9C16 8D559C                  lea edx, dword ptr [ebp-64]
:004C9C19 A1787C4E00              mov eax, dword ptr [004E7C78]
:004C9C1E 8B00                    mov eax, dword ptr [eax]
:004C9C20 E8A78BF8FF              call 004527CC
:004C9C25 8B459C                  mov eax, dword ptr [ebp-64]
:004C9C28 8D55A0                  lea edx, dword ptr [ebp-60]
:004C9C2B E878ECF3FF              call 004088A8
:004C9C30 8B55A0                  mov edx, dword ptr [ebp-60]
:004C9C33 58                      pop eax
:004C9C34 E86BA5F3FF              call 004041A4
:004C9C39 85C0                    test eax, eax
:004C9C3B 7F05                    jg 004C9C42    <-----這裡要跳過才行。
:004C9C3D E81E9EF3FF              call 00403A60  <-----這兒會退出的,我沒有試全nop後行不行。

* Referenced by a (U)nconditional or (C)onditional Jump at Address:
|:004C9C3B(C)
|
:004C9C42 6A00                    push 00000000
:004C9C44 6880000000              push 00000080
:004C9C49 6A03                    push 00000003
:004C9C4B 6A00                    push 00000000
:004C9C4D 6A03                    push 00000003
:004C9C4F 68000000C0              push C0000000
:004C9C54 8D4D98                  lea ecx, dword ptr [ebp-68]


好了,修改後,執行一下,沒有發現有什麼問題。算是脫殼成功吧!


                            小球
                            2002.5.4

相關文章