手脱PowerPoint to Flash 1.6.7的Armadillo
 
破文作者: 幽谷客
发表时间: 2007-5-5 01:51
链接地址: http://www.unpack.cn/viewthread.php?tid=12453
在刚开始学脱壳的时候,在相关论坛看到过有人脱过这个软件的壳,外加破解,
但是照着那篇文章练了3个晚上脱壳后的软件并没有像作者说的——“运行ImportREC 1.6,选择这个进程。
把OEP改为00038570,点IT AutoSearch,函数全部有效。FixDump,正常运行!”
运行起来,3个月后的今天,才知道那篇文章并不完整,今天我用和那篇文章的作者不太一样的方法来脱这个软件的壳。
这是我的处女作,写得好请大家鼓励,写得不好请大家多提宝贵意见。


PEID查壳:Armadillo 1.xx - 2.xx -> Silicon Realms Toolworks
Armadillo find:
★ 目标为Armadillo保护
★ 特征识别 = DC2CE414
保护系统级别为 (标准版)
◆所用到的保护模式有◆
屏蔽调试器
【备份密钥设置】
无任何注册表操作
【程序压缩设置】
最好/最慢地压缩方式
【其它保护设置】
★分离子进程★ 
子进程标识号为 : 00000924 
入口点为 : 0052A914  
原始字节为 : 558B 

OD载入,忽略所有异常,隐藏OD

0052A914 >/$  55            push    ebp              载入后停在这里
0052A915  |.  8BEC          mov     ebp, esp
0052A917  |.  6A FF         push    -1
0052A919  |.  68 D0455300   push    005345D0
0052A91E  |.  68 34A45200   push    0052A434             ;  SE 处理程序安装
0052A923  |.  64:A1 0000000>mov     eax, dword ptr fs:[0]
0052A929  |.  50            push    eax
0052A92A  |.  64:8925 00000>mov     dword ptr fs:[0], esp
0052A931  |.  83EC 58       sub     esp, 58
0052A934  |.  53            push    ebx
0052A935  |.  56            push    esi
0052A936  |.  57            push    edi
0052A937  |.  8965 E8       mov     dword ptr [ebp-18], esp

*******************************************************************************************

分离父进程,使程序把自己当成子进程运行

在命令行下断:BP OpenMutexA   F9运行

7C80EA1B >  8BFF            mov     edi, edi         断在这里
7C80EA1D     55              push    ebp
7C80EA1E     8BEC            mov     ebp, esp
7C80EA20     51              push    ecx
7C80EA21     51              push    ecx

断下来后暂时不要取消断点,ALT+F9返回

0052585D   .  85C0          test    eax, eax         返回到这里
0052585F   .  74 04         je      short 00525865   在这里将 0052585F 这一行的 JE改成它的相反JNZ 
0052585D   .  85C0          test    eax, eax
0052585F      75 04         jnz     short 00525865

改完后F9运行,断在了刚才的断点上

7C80EA1B >  8BFF            mov     edi, edi         断在这里
7C80EA1D     55              push    ebp
7C80EA1E     8BEC            mov     ebp, esp
7C80EA20     51              push    ecx
7C80EA21     51              push    ecx

ALT+F9再次返回

00525C4D   .  85C0          test    eax, eax          返回到这里
00525C4F   .  0F85 82010000 jnz     00525DD7  在这里将 00525C4F 这一行的 JNZ改成它的相反JZ
00525C4D   .  85C0          test    eax, eax
00525C4F      0F84 82010000 je      00525DD7

改完后F9运行,断在了刚才的断点上,现在取消断点。此时父进程分离完毕.

**************************************************************************************************

寻找Magic Jump,避开IAT加密

CTRL+G ——输入 GetModuleHandleA——确定

7C80B6A1 >  8BFF            mov     edi, edi                  来到这里
7C80B6A3    55              push    ebp
7C80B6A4    8BEC            mov     ebp, esp
7C80B6A6    837D 08 00      cmp     dword ptr [ebp+8], 0
7C80B6AA    74 18           je      short 7C80B6C4          在这里下硬件执行断点
7C80B6AC    FF75 08         push    dword ptr [ebp+8]

在7C80B6AA一行下硬件执行断点,然后F9运行N次,注意看堆栈窗口,寻找合适的返回时机

第一次 0012E008  /0012E044
       0012E00C  |00C060DB  返回到 00C060DB 来自 kernel32.GetModuleHandleA
       0012E010  |00C1B808  ASCII "kernel32.dll"
       0012E014  |00565E94  PowerPoi.00565E94
       0012E018  |00565E94  PowerPoi.00565E94

第二次0012E008  /0012E044
      0012E00C  |00C060DB  返回到 00C060DB 来自 kernel32.GetModuleHandleA
      0012E010  |00C1B7FC  ASCII "user32.dll"
      0012E014  |00565E94  PowerPoi.00565E94
      0012E018  |00565E94  PowerPoi.00565E94

第三次0012E044  /0012F44C
      0012E048  |00C10375  返回到 00C10375 来自 kernel32.GetModuleHandleA
      0012E04C  |00C91FE8  ASCII "KERNEL32.dll"
      0012E050  |00565E94  PowerPoi.00565E94
      0012E054  |00565E94  PowerPoi.00565E94
第四次0012E028  /0012E040
      0012E02C  |00C0653E  返回到 00C0653E 来自 kernel32.GetModuleHandleA
      0012E030  |00000000
      0012E034  |00565E94  PowerPoi.00565E94
      0012E038  |00565E94  PowerPoi.00565E94

第四次就是最佳返回时机,还有一个特征就是 7C80B6AA一行的JE跳转是实现的

取消硬件执行断点,ALT+F9返回 

00C0653E    8B4D 08              mov     ecx, dword ptr [ebp+8]    返回到这里
00C06541    3BC8                 cmp     ecx, eax
00C06543    75 07                jnz     short 00C0654C
00C06545    B8 A8B3C100          mov     eax, 0C1B3A8
00C0654A    EB 2F                jmp     short 00C0657B
00C0654C    393D D8B7C100        cmp    dword ptr [C1B7D8], edi
00C06552    B8 D8B7C100          mov     eax, 0C1B7D8
00C06557    74 0C                je      short 00C06565           这里就是Magic Jump
00C06559    3B48 08              cmp     ecx, dword ptr [eax+8]
00C0655C    74 1A                je      short 00C06578
00C0655E    83C0 0C              add     eax, 0C
00C06561    3938                 cmp     dword ptr [eax], edi
00C06563  ^ 75 F4                jnz     short 00C06559      

将Magic Jump处的JE改成JMP

***************************************************************************************************

到达OEP

按M打开内存,在00401000上F2下断,F9运行

00442B52    6A 60           push    60        这里就是OEP
00442B54    68 782A4B00     push    004B2A78
00442B59    E8 32190000     call    00444490
00442B5E    BF 94000000     mov     edi, 94
00442B63    8BC7            mov     eax, edi
00442B65    E8 E6F6FFFF     call    00442250
00442B6A    8965 E8         mov     dword ptr [ebp-18], esp
00442B6D    8BF4            mov     esi, esp
00442B6F    893E            mov     dword ptr [esi], edi
00442B71    56              push    esi

在这里脱壳修复(ImportREC显示所有的函数都有效)转存。

优化:删除区段“.text1”、“.data1”、“.pdata”然后“重建PE”!程序由脱壳后的2.07MB变为1.32MB.

******************************************************************************************************

去掉程序错误检测

运行脱壳修复后的程序,提示错误。这应该是程序检测的问题。OD载入优化过的文件,在命令行下断 

bp MessageBoxA,F9运行

77D5058A >  8BFF            mov     edi, edi      ; dumped3_.004E3BAC    中断在这里 
77D5058C    55              push    ebp
77D5058D    8BEC            mov     ebp, esp
77D5058F    833D BC04D777 0>cmp     dword ptr [77D704BC], 0

中断后取消断点,ALT+F9返回,此时程序运行时那个提示框出现了,点击确定

004A2665    FF15 5CB44A00   call    dword ptr [<&user32.MessageBoxA>>; USER32.MessageBoxA
004A266B    85FF            test    edi, edi                         ; dumped3_.004E3BAC
中断在这里

可以看出应该是004A2665 一行出现错误提示框的,往上翻一下,在这一段的断首F2下断

004A2577    55              push    ebp                      在这里F2下断
004A2578    8DAC24 68FFFFFF lea     ebp, dword ptr [esp-98]
004A257F    81EC 18010000   sub     esp, 118
004A2585    A1 A0DF4C00     mov     eax, dword ptr [4CDFA0]

            ..........................................
            ..........................................
            ..........................................

004A2665    FF15 5CB44A00   call    dword ptr [<&user32.MessageBoxA>>; USER32.MessageBoxA
004A266B    85FF            test    edi, edi                         ; dumped3_.004E3BAC

下好断后,点快捷工具栏上的 X 关闭程序,然后在重新载入程序,F9运行

004A2577    55              push    ebp                    断在这里
004A2578    8DAC24 68FFFFFF lea     ebp, dword ptr [esp-98]
004A257F    81EC 18010000   sub     esp, 118
004A2585    A1 A0DF4C00     mov     eax, dword ptr [4CDFA0]
004A258A    53              push    ebx

此时注意看堆栈窗口

0012BC5C   0043B268  返回到 dumped3_.0043B268 来自 dumped3_.004A26AA
CTRL+G输入0043B268,确定
0043B263    E8 42740600     call    004A26AA              
0043B268    8D46 F0         lea     eax, dword ptr [esi-10]   来到这里

应该是0043B263处的CALL调用,往上翻一下,看有没有跳转能跳过这个CALL

0043B22C   /74 30           je      short 0043B25E
0043B22E   |48              dec     eax
0043B22F   |74 22           je      short 0043B253
0043B231   |51              push    ecx
0043B232   |8D46 F0         lea     eax, dword ptr [esi-10]
0043B235   |896424 0C       mov     dword ptr [esp+C], esp
0043B239   |8BFC            mov     edi, esp
0043B23B   |50              push    eax
0043B23C   |E8 CF8FFCFF     call    00404210
0043B241   |83C0 10         add     eax, 10
0043B244   |83C4 04         add     esp, 4
0043B247   |8907            mov     dword ptr [edi], eax
0043B249   |E8 72FDFFFF     call    0043AFC0
0043B24E   |83C4 04         add     esp, 4
0043B251   |EB 15           jmp     short 0043B268      这个可以跳过
0043B253   |56              push    esi
0043B254   |E8 1B860000     call    00443874
0043B259   |83C4 04         add     esp, 4
0043B25C   |EB 0A           jmp     short 0043B268      这个可以跳过
0043B25E   \6A 00           push    0
0043B260    6A 10           push    10
0043B262    56              push    esi
0043B263    E8 42740600     call    004A26AA
0043B268    8D46 F0         lea     eax, dword ptr [esi-10]

这两个跳转都可以跳转,但都没有实现,那么应该是上面的跳转问题了,通过修改上面个两个跳转还是不能使下面的两个跳转实现。

在0043B22C一行F2下断,关闭程序,然后在重新载入程序,F9运行

0043B22C   /74 30           je      short 0043B25E    断在这里 
0043B22E   |48              dec     eax
0043B22F   |74 22           je      short 0043B253

此时注意对占窗口

0012BC84   0043B313  返回到 dumped3_.0043B313 来自 dumped3_.0043B200
CTRL+G输入0043B313,确定

0043B304    68 48F04A00     push    004AF048  ; ASCII "System fault, the application will be shut down immediately!" 程序启动时的错误提示
0043B309    E8 02AFFCFF     call    00406210
0043B30E    E8 EDFEFFFF     call    0043B200
0043B313    83C4 04         add     esp, 4       中断在这里

此时我们很清楚的在上面几行的注释栏中看到程序启动时的错误提示,往上翻可以看到,只要0043B2FB一行的这个跳转能跳走,
就不会出现错误提示了,将0043B2FB一行的JNZ改成JMP然后保存修改程序此时就可以正常运行了。

0043B2FB    75 21           jnz     short 0043B31E  将这里的JNZ改成JMP
0043B2FD    51              push    ecx
0043B2FE    8BCC            mov     ecx, esp
0043B300    896424 24       mov     dword ptr [esp+24], esp
0043B304    68 48F04A00     push    004AF048                   ; ASCII "System fault, the application will be shut down immediately!"
0043B309    E8 02AFFCFF     call    00406210
0043B30E    E8 EDFEFFFF     call    0043B200
0043B313    83C4 04         add     esp, 4

程序采用了Armadillo的注册模块,脱壳后自然就不必注册了,30次的试用限制也不存在了。经过上面的修改,和破解版的一样。



附件下载:http://www.unpack.cn/attachment.php?aid=8145
上一篇   下一篇