• 标 题:脱Crunch/PE -> BitArts的壳。 (3千字)
  • 作 者:小球[CCG]
  • 时 间:2002-5-3 15:46:13
  • 链 接:http://bbs.pediy.com

脱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