; ---------------------------------------------------------------------------
;     eXPressor v1.1 脱壳
; ---------------------------------------------------------------------------

; ---------------------------------------------------------------------------
;     寻找恰当时机 Dump 文件
; ---------------------------------------------------------------------------
OllyDbg 载入, 

00438019 > $ /E9 15130000   jmp     00439333
0043801E   . |E9 F0120000   jmp     00439313
00438023   . |E9 58120000   jmp     00439280
00438028   $ |E9 AF0C0000   jmp     00438CDC
0043802D   $ |E9 AE020000   jmp     004382E0
00438032   $ |E9 B40B0000   jmp     00438BEB
00438037   $ |E9 E00C0000   jmp     00438D1C

运行起来有个 NAG,拦截 MessageBoxA 试试:

77D5050B >  8BFF            mov     edi, edi
77D5050D    55              push    ebp
77D5050E    8BEC            mov     ebp, esp
77D50510    833D 1C04D777 0>cmp     dword ptr [77D7041C], 0
77D50517    74 24           je      short 77D5053D
77D50519    64:A1 18000000  mov     eax, fs:[18]
77D5051F    6A 00           push    0
77D50521    FF70 24         push    dword ptr [eax+24]
77D50524    68 F40AD777     push    77D70AF4
77D50529    FF15 1812D177   call    [<&KERNEL32.InterlockedCompareEx>; kernel32.InterlockedCompareExchange
77D5052F    85C0            test    eax, eax
77D50531    75 0A           jnz     short 77D5053D
77D50533    C705 F00AD777 0>mov     dword ptr [77D70AF0], 1
77D5053D    6A 00           push    0
77D5053F    FF75 14         push    dword ptr [ebp+14]
77D50542    FF75 10         push    dword ptr [ebp+10]
77D50545    FF75 0C         push    dword ptr [ebp+C]
77D50548    FF75 08         push    dword ptr [ebp+8]
77D5054B    E8 2D000000     call    MessageBoxExA
77D50550    5D              pop     ebp
77D50551    C2 1000         retn    10                               ; Breakpoint

在 retn 上设置一个断点,运行程序,出现:

---------------------------
Nfo
---------------------------
This program was packed with a demo version of eXPressor
---------------------------
确定   
---------------------------

关闭 NAG,返回到程序领空:


004393A8   > /8B85 34FEFFFF mov     eax, [ebp-1CC]
004393AE   . |0FBE08        movsx   ecx, byte ptr [eax]
004393B1   . |83F9 5C       cmp     ecx, 5C
004393B4   . |74 11         je      short 004393C7
004393B6   . |8B95 34FEFFFF mov     edx, [ebp-1CC]

为了找到处理输入表的地方,拦截 LoadLibraryA ,然后 Alt+F9 返回程序:

004396A5   .  8985 58FEFFFF mov     [ebp-1A8], eax                   ;  comdlg32.76320000
004396AB   >  83BD 58FEFFFF>cmp     dword ptr [ebp-1A8], 0
004396B2   .  75 37         jnz     short 004396EB
004396B4   .  8B4D F8       mov     ecx, [ebp-8]
004396B7   .  51            push    ecx                              ; /<%hs>
004396B8   .  68 78814300   push    00438178                         ; |Format = "A required .DLL file, %hs, was not found."
004396BD   .  8D95 60FEFFFF lea     edx, [ebp-1A0]                   ; |
004396C3   .  52            push    edx                              ; |s
004396C4   .  FF15 2CE14300 call    [<&USER32.wsprintfA>]            ; \wsprintfA

明显开始装载引入表了,向上回溯:

00439636   .  8B95 ECFEFFFF mov     edx, [ebp-114]
0043963C   .  0315 88F04300 add     edx, [43F088]
00439642   .  8995 38FEFFFF mov     [ebp-1C8], edx
00439648   >  8B85 38FEFFFF mov     eax, [ebp-1C8]
0043964E   .  8378 0C 00    cmp     dword ptr [eax+C], 0
00439652   .  0F84 65020000 je      004398BD

[ebp-1C8] 应该就是引入表了,运行到这里可能已经修改,重新来,直达 00439642;

在命令行输入 dd edx,看看引入表 IID 有多大:

004231F8  00023350
004231FC  00000000
00423200  00000000
00423204  00023EDC
00423208  0001F0B8

0042320C  00023520
00423210  00000000
00423214  00000000
00423218  000245FC
0042321C  0001F288

00423220  000232B4
00423224  00000000
00423228  00000000
0042322C  0002482E
00423230  0001F01C

00423234  00023710
00423238  00000000
0042323C  00000000
00423240  0002485C
00423244  0001F478

00423248  00023700
0042324C  00000000
00423250  00000000
00423254  000248A0
00423258  0001F468

0042325C  00023298
00423260  00000000
00423264  00000000
00423268  000248F0
0042326C  0001F000

00423270  000232AC
00423274  00000000
00423278  00000000
0042327C  0002490A
00423280  0001F014

00423284  00000000
00423288  00000000
0042328C  00000000
00423290  00000000
00423294  00000000

8 组 IID,RVA 是231F8,大小为8*4*5=160=0A0h,现在把文件 Dump 出来,保存为 dumped.exe

; ---------------------------------------------------------------------------
;     众里寻他千百度
; ---------------------------------------------------------------------------

别忙关闭调试器,接着找 OEP,向下翻页,找可疑指令:

00439ABA   .  0315 80F04300 add     edx, [43F080]
00439AC0   .  8B45 F4       mov     eax, [ebp-C]
00439AC3   .  0350 34       add     edx, [eax+34]
00439AC6   .  2B95 ECFEFFFF sub     edx, [ebp-114]
00439ACC   .  8995 50FEFFFF mov     [ebp-1B0], edx
00439AD2   .  FFA5 50FEFFFF jmp     [ebp-1B0]                        ;  !!!
00439AD8   >  5F            pop     edi
00439AD9   .  5E            pop     esi
00439ADA   .  5B            pop     ebx
00439ADB   .  8BE5          mov     esp, ebp
00439ADD   .  5D            pop     ebp
00439ADE   .  C3            retn

上面都是填充 IAT 的,直觉这里比较像,F4 过去再 F7 跟入,柳暗花明又一村:

00407A23    55              push    ebp
00407A24    8BEC            mov     ebp, esp
00407A26    6A FF           push    -1
00407A28    68 D00B4200     push    00420BD0
00407A2D    68 1CB74000     push    0040B71C
00407A32    64:A1 00000000  mov     eax, fs:[0]
00407A38    50              push    eax
00407A39    64:8925 0000000>mov     fs:[0], esp
00407A40    83EC 58         sub     esp, 58
00407A43    53              push    ebx
00407A44    56              push    esi
00407A45    57              push    edi
00407A46    8965 E8         mov     [ebp-18], esp
00407A49    FF15 DCF14100   call    [41F1DC]                         ; kernel32.GetVersion
00407A4F    33D2            xor     edx, edx
00407A51    8AD4            mov     dl, ah
00407A53    8915 04D24200   mov     [42D204], edx

; ---------------------------------------------------------------------------
;     优化文件
; ---------------------------------------------------------------------------

不言而喻 OEP = 7A23,现在可以让 OllyDbg 休息一下了.

LordPE 上阵,打开 dumped.exe,修改入口点为 7A23,在数据目录里修改引入表项,RVA = 231F8,Size = A0

重定位是给外壳用的,可以清掉,不过可以让LordPE 替我们做。IAT项似乎是原程序的,可以不修改了。

打开区段表,清除 .ex_cod .ex_id .ex_dat

然后 PE Rebuilder 选上清除重定位表和有效化 PE,对齐文件,重建一下。

似乎完成了,但是资源不可修改,用 ResFixer Method I 重建一个 .rsrc,进入 LordPE 删除原来的 .ex_rsc 重建,

然后从磁盘载入区段,选择刚才的 .rsrc,再次重建,用ResHacker打开看看,资源正确了。

以前 heXer 发给我一个 ResFixer 一直没用,今天试试,也可以用 FreeRes 代替,大小差不多。