Jian丶ylt 发表于 2015-11-21 20:39

手脱ASProtect v1.23 RC1(有Stolen Code)

本帖最后由 Jian丶ylt 于 2015-11-21 20:43 编辑

声明:

       1.只为纪录自己成长历程,高手勿喷
       2.您的热心是新手持续发帖的动力

1.载入PEID

    ASProtect v1.23 RC1
   
常见ASprotect版本壳:

    ASProtect 1.23 RC4   按shift+f9键26次后来到典型异常
    ASProtect 1.31 04.27 按shift+f9键36次后来到典型异常
    ASProtect 1.31 05.18 按shift+f9键40次后来到典型异常
    ASProtect 1.31 06.14 按shift+f9键38次后来到典型异常

2.载入OD,不勾选内存访问异常,其他异常全部勾选,然后使用最后一次异常法,应该是第26次,第27次就会跑飞

00401000 >68 01C06D00   push SoWorker.006DC001                   ; //入口点
00401005    E8 01000000   call SoWorker.0040100B
0040100A    C3            retn
0040100B    C3            retn
0040100C    74 23         je short SoWorker.00401031
0040100E    C039 74         sar byte ptr ds:,74
00401011    0FD19CA4 0599E0>psrlw mm3,qword ptr ss:
00401019    AA            stos byte ptr es:

3.落脚点在这个位置,还是像之前脱ASProtect一样,往下拉找到最近的一个retn,然后让程序运行过去

00C339EC    3100            xor dword ptr ds:,eax               ; //落脚点
00C339EE    64:8F05 0000000>pop dword ptr fs:
00C339F5    58            pop eax
00C339F6    833D B07EC300 0>cmp dword ptr ds:,0
00C339FD    74 14         je short 00C33A13
00C339FF    6A 0C         push 0C
00C33A01    B9 B07EC300   mov ecx,0C37EB0
00C33A06    8D45 F8         lea eax,dword ptr ss:
00C33A09    BA 04000000   mov edx,4
00C33A0E    E8 2DD1FFFF   call 00C30B40
00C33A13    FF75 FC         push dword ptr ss:
00C33A16    FF75 F8         push dword ptr ss:
00C33A19    8B45 F4         mov eax,dword ptr ss:
00C33A1C    8338 00         cmp dword ptr ds:,0
00C33A1F    74 02         je short 00C33A23
00C33A21    FF30            push dword ptr ds:
00C33A23    FF75 F0         push dword ptr ss:
00C33A26    FF75 EC         push dword ptr ss:
00C33A29    C3            retn                                     ; //最近的tetn
00C33A2A    5F            pop edi
00C33A2B    5E            pop esi
00C33A2C    5B            pop ebx

4.程序运行到最近的retn后,我们就可以开始寻找丢失的代码了。不过这里可以先给大家看下假的OEP,打开内存窗口,在401000处下段然后shift+F9运行一次就来到假的OEP,落点处就是假的OEP,代码往上拉可以看到很多空的位置,这里就是待会找回丢失的代码后需要补充的位置了。

004F27A7^\EB F8         jmp short SoWorker.004F27A1
004F27A9    0000            add byte ptr ds:,al
004F27AB    0000            add byte ptr ds:,al
004F27AD    0000            add byte ptr ds:,al
004F27AF    0000            add byte ptr ds:,al
004F27B1    0000            add byte ptr ds:,al
004F27B3    0000            add byte ptr ds:,al
004F27B5    0000            add byte ptr ds:,al
004F27B7    0000            add byte ptr ds:,al
004F27B9    0000            add byte ptr ds:,al
004F27BB    0000            add byte ptr ds:,al
004F27BD    0000            add byte ptr ds:,al
004F27BF    0000            add byte ptr ds:,al
004F27C1    0000            add byte ptr ds:,al
004F27C3    0000            add byte ptr ds:,al
004F27C5    0000            add byte ptr ds:,al
004F27C7    0000            add byte ptr ds:,al
004F27C9    0000            add byte ptr ds:,al
004F27CB    0000            add byte ptr ds:,al
004F27CD    0000            add byte ptr ds:,al
004F27CF    FF15 9CC25200   call dword ptr ds:               ; //假的OEP
004F27D5    33D2            xor edx,edx
004F27D7    8AD4            mov dl,ah
004F27D9    8915 34306900   mov dword ptr ds:,edx
004F27DF    8BC8            mov ecx,eax
004F27E1    81E1 FF000000   and ecx,0FF
004F27E7    890D 30306900   mov dword ptr ds:,ecx
004F27ED    C1E1 08         shl ecx,8
004F27F0    03CA            add ecx,edx
004F27F2    890D 2C306900   mov dword ptr ds:,ecx
004F27F8    C1E8 10         shr eax,10
004F27FB    A3 28306900   mov dword ptr ds:,eax
004F2800    6A 01         push 1
004F2802    E8 933B0000   call SoWorker.004F639A

5.然后重新载入程序,运行完步骤1-3的操作,也就是让程序运行到最近的一个retn处。然后看堆栈窗口第四行(也就是程序名下面第二行)的值"0012ffa4"

0012FF5C   00C45A1C//第一行
0012FF60   00400000SoWorker.00400000
0012FF64   E3DE7228
0012FF68   0012FFA4
0012FF6C   00C20000

6.命令行下硬件访问断点"hr 0012ffa4"然后shift+F9运行一次,落脚后先F8单步跟一会。

00C45C07   /26:EB 01      jmp short 00C45C0B                     ; //落脚点
00C45C0A   |C7            ???                                    
00C45C0B   \EB 02         jmp short 00C45C0F
00C45C0D    CD20 83EC372E   vxdjump 2E37EC83
00C45C13    EB 01         jmp short 00C45C16
00C45C15- E9 8D642479   jmp 79E8C0A7
00C45C1A    64:EB 01      jmp short 00C45C1E

7.一直到程序运行到这里,之前应该是没有call的,下面开始可能就会有call了。ASProtect的call可能会经常跑飞,所以我们遇到call就F7跟进去,没有call还是可以使用F8,当然你也可以一直使用F7,效果是一样的。

00C45C3B    BD 415CC400   mov ebp,0C45C41                        ; //到这里
00C45C40    FF55 03         call dword ptr ss:             ; //这里就F7跟进
00C45C43    E8 4D5CC400   call 0188B895
00C45C48    9A E969F29A 5DF>call far F35D:9AF269E9
00C45C4F    EB 02         jmp short 00C45C53
00C45C51    CD20 1BE9EB02   vxdjump 2EBE91B
00C45C57    CD20 33E8EB02   vxdjump 2EBE833
00C45C5D    CD20 EB010F8D   vxdcall 8D0F01EB

8.F7跟进后我们继续往下走,寻找丢失的代码,走到下面代码的位置的时候我们可以看到有好几个jmp,并且从第一个jmp后面的代码就比较熟悉了push ebp...其实这就是我们要寻找的丢失的代码了,每两个jmp中间除去问号剩下的就是我们应该要寻找的丢失的代码了。直到两个jmp中间只剩下问号为止,仔细看下下面的代码,总共是5段,我们再分别把5段代码连同二进制代码复制下来

00C45C66    5D            pop ebp
00C45C67    EB 01         jmp short 00C45C6A               ;//jmp
00C45C69    C7            ???                                    
00C45C6A    55            push ebp                                 ; //第一段
00C45C6B    8BEC            mov ebp,esp                              ; //第一段
00C45C6D    6A FF         push -1                                  ; //第一段
00C45C6F    68 78E35300   push 53E378                              ; //第一段
00C45C74    68 407B4F00   push 4F7B40                              ; //第一段
00C45C79    64:A1 00000000mov eax,dword ptr fs:               ; //第一段
00C45C7F    EB 01         jmp short 00C45C82               ;//jmp
00C45C81    C7            ???                                    
00C45C82    50            push eax                                 ; //第二段
00C45C83    64:8925 0000000>mov dword ptr fs:,esp               ; //第二段
00C45C8A    83EC 58         sub esp,58                               ; //第二段
00C45C8D    EB 01         jmp short 00C45C90               ;//jmp
00C45C8F    C7            ???                                    
00C45C90    53            push ebx                                 ; //第三段
00C45C91    EB 01         jmp short 00C45C94               ;//jmp
00C45C93    C7            ???                                    
00C45C94    56            push esi                                 ; //第四段
00C45C95    EB 01         jmp short 00C45C98               ;//jmp
00C45C97    C7            ???                                    
00C45C98    57            push edi                                 ; //第五段
00C45C99    8965 E8         mov dword ptr ss:,esp            ; //第五段
00C45C9C    26:EB 01      jmp short 00C45CA0               ;//jmp
00C45C9F    C7            ???                                    
00C45CA0    EB 02         jmp short 00C45CA4               ;//jmp
00C45CA2    CD20 68CF274F   vxdjump 4F27CF68


第一段:

00C45C6A    55            push ebp                                 ; //第一段
00C45C6B    8BEC            mov ebp,esp                              ; //第一段
00C45C6D    6A FF         push -1                                  ; //第一段
00C45C6F    68 78E35300   push 53E378                              ; //第一段
00C45C74    68 407B4F00   push 4F7B40                              ; //第一段
00C45C79    64:A1 00000000mov eax,dword ptr fs:               ; //第一段

55 8B EC 6A FF 68 78 E3 53 00 68 40 7B 4F 00 64 A1 00 00 00 00

第二段

00C45C82    50            push eax                                 ; //第二段
00C45C83    64:8925 0000000>mov dword ptr fs:,esp               ; //第二段
00C45C8A    83EC 58         sub esp,58                               ; //第二段


50 64 89 25 00 00 00 00 83 EC 58

第三段

00C45C90    53            push ebx                                 ; //第三段

53

第四段

00C45C94    56            push esi                                 ; //第四段

56

第五段

00C45C98    57            push edi                                 ; //第五段
00C45C99    8965 E8         mov dword ptr ss:,esp            ; //第五段

57 89 65 E8

9.OK,这样被偷取的代码我们就找回来了,然后你可以选择继续F8走到假的OEP或者是重新载入一下来到假的OEP位置。这个都无所谓的。我们先把程序运行到假的OEP位置,然后把五段被偷取的二进制代码整合一下,然后假的OEP往上拉,把空的代码行选中,二进制把被偷取代码粘贴进去

二进制代码汇总:55 8B EC 6A FF 68 78 E3 53 00 68 40 7B 4F 00 64 A1 00 00 00 00 50 64 89 25 00 00 00 00 83 EC 58 53 56 57 89 65 E8

004F27A7^\EB F8         jmp short SoWorker.004F27A1
004F27A9    0000            add byte ptr ds:,al               ; //从这里开始
004F27AB    0000            add byte ptr ds:,al
004F27AD    0000            add byte ptr ds:,al
004F27AF    0000            add byte ptr ds:,al
004F27B1    0000            add byte ptr ds:,al
004F27B3    0000            add byte ptr ds:,al
004F27B5    0000            add byte ptr ds:,al
004F27B7    0000            add byte ptr ds:,al
004F27B9    0000            add byte ptr ds:,al
004F27BB    0000            add byte ptr ds:,al
004F27BD    0000            add byte ptr ds:,al
004F27BF    0000            add byte ptr ds:,al
004F27C1    0000            add byte ptr ds:,al
004F27C3    0000            add byte ptr ds:,al
004F27C5    0000            add byte ptr ds:,al
004F27C7    0000            add byte ptr ds:,al
004F27C9    0000            add byte ptr ds:,al
004F27CB    0000            add byte ptr ds:,al
004F27CD    0000            add byte ptr ds:,al               ; //到这里结束
004F27CF    FF15 9CC25200   call dword ptr ds:               ; //假的OEP
004F27D5    33D2            xor edx,edx
004F27D7    8AD4            mov dl,ah
004F27D9    8915 34306900   mov dword ptr ds:,edx
004F27DF    8BC8            mov ecx,eax
004F27E1    81E1 FF000000   and ecx,0FF

10.粘贴好的OEP应该是这样子的,我们在粘贴好的代码的第一行,也就是那个push ebp的位置右键--新建EIP

004F27A7^\EB F8         jmp short SoWorker.004F27A1
004F27A9    55            push ebp                                 ; //此处新建OEP
004F27AA    8BEC            mov ebp,esp
004F27AC    6A FF         push -1
004F27AE    68 78E35300   push SoWorker.0053E378
004F27B3    68 407B4F00   push SoWorker.004F7B40
004F27B8    64:A1 00000000mov eax,dword ptr fs:
004F27BE    50            push eax
004F27BF    64:8925 0000000>mov dword ptr fs:,esp
004F27C6    83EC 58         sub esp,58
004F27C9    53            push ebx
004F27CA    56            push esi
004F27CB    57            push edi
004F27CC    8965 E8         mov dword ptr ss:,esp
004F27CF    FF15 9CC25200   call dword ptr ds:               ; //假的OEP
004F27D5    33D2            xor edx,edx
004F27D7    8AD4            mov dl,ah

11.至此我们就可以进行脱壳了,记得脱壳后修复的时候使用插件修复。

12.运行查壳

    运行OK,查壳:Microsoft Visual C++ v6.0

附件较大,没法上传,大家可以在论坛里搜索下ximo大神的教程第23课,自行去下载相应样本或者自己找个对应版本的脱壳机练练手









520_ai_in@sina. 发表于 2015-11-21 20:57

额 简单的壳载入OD直接往下拉 找到 --jmp F4运行到哪里走一步就到oep了

Luminousky 发表于 2015-11-21 21:07

感谢分享,来观摩学习一下{:301_1001:}
页: [1]
查看完整版本: 手脱ASProtect v1.23 RC1(有Stolen Code)