eXPressor v1.1 脱壳
发表于:
2005-2-7 11:59
12959
; ---------------------------------------------------------------------------
; 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 代替,大小差不多。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!