基础脱壳教程23:手脱ASProtect1.23 RC4

版本的判断:

PEiD 查壳 : ASProtect 1.23 RC4 - 1.3.08.24 -> Alexey Solodovnikov

发现这期间有 4 个版本, 判断方法如下

判断版本:

ASProtect 1.23 RC4 按 shift+f9 键 26 次后来到典型异常,在最近处的 retn 处设断,跳过异常,f8 单步跟就会来到 foep。

ASProtect 1.31 04.27 按 shift+f9 键 36 次后来到典型异常,在最近处的 retn 处设断,跳过异常,f8 单步跟就会来到 foep。

ASProtect 1.31 05.18 按 shift+f9 键 40 次后来到典型异常,在最近处的 retn 处设断,跳过异常,f8 单步跟就会来到 foep。

ASProtect 1.31 06.14 按 shift+f9 键 38 次后来到典型异常,在最近处的 retn 处设断,跳过异常,f8 单步跟就会来到 foep。

我们也可以用 PEiD 的 VerA 插件查看, 显示是上面第一个版本

插件查壳

1、忽略除内存访问的所有异常,隐藏一下 OD,SHIFT+F9 26 次后来到最后一次异常

就是只取消 非法访问内存 的勾勾

26 次之后来到最后一次异常

00C739EC    3100                xor dword ptr ds:[eax],eax        //断在这
00C739EE    64:8F05 00000000    pop dword ptr fs:[0]
00C739F5    58                  pop eax
00C739F6    833D B07EC700 00    cmp dword ptr ds:[C77EB0],0
00C739FD    74 14               je short 00C73A13
00C739FF    6A 0C               push 0C
00C73A01    B9 B07EC700         mov ecx,0C77EB0
00C73A06    8D45 F8             lea eax,dword ptr ss:[ebp-8]
00C73A09    BA 04000000         mov edx,4
00C73A0E    E8 2DD1FFFF         call 00C70B40
00C73A13    FF75 FC             push dword ptr ss:[ebp-4]
00C73A16    FF75 F8             push dword ptr ss:[ebp-8]
00C73A19    8B45 F4             mov eax,dword ptr ss:[ebp-C]
00C73A1C    8338 00             cmp dword ptr ds:[eax],0
00C73A1F    74 02               je short 00C73A23
00C73A21    FF30                push dword ptr ds:[eax]
00C73A23    FF75 F0             push dword ptr ss:[ebp-10]
00C73A26    FF75 EC             push dword ptr ss:[ebp-14]
00C73A29    C3                  retn

2、在 retn 处下断,SHIFT+F9,取消断点

现在打开内存窗口, 直接在 00401000 处下断就可以来到假的 OEP

3、在堆栈窗口找显示程序名的下面 2 行,下 HR 12FFA4

就是图片中黄色部分, 下硬件断点, 运行

就是黄色部分这里下硬件断点

4、一直 F8,到这里

我这里和视频中有些区别, 见图

不过后续步骤是一样的
00C85C47    BD 4D5CC800         mov ebp,0C85C4D
00C85C4C    FF55 03             call dword ptr ss:[ebp+3]          //到这F7跟
00C85C4F    E8 595CC800         call 0190B8AD
00C85C54    9A E969F29A 5DF3    call far F35D:9AF269E9
00C85C5B    EB 02               jmp short 00C85C5F
00C85C5D    CD20 1BE9EB02       vxdjump 2EBE91B
00C85C63    CD20 33E8EB02       vxdjump 2EBE833
00C85C69    CD20 EB010F8D       vxdcall 8D0F01EB
00C85C6F    6C                  ins byte ptr es:[edi],dx
00C85C70    75 37               jnz short 00C85CA9
00C85C72    5D                  pop ebp
00C85C73    EB 01               jmp short 00C85C76
00C85C75    C7                  ???                                     ; 未知命令

5、一直F7跟,找抽取代码

注意一下, ACProtect 壳我们一般见 call 就进, 不然程序一不小心就跑飞了

到这里就 F7 跟了

(1)

00C84F0A    55                  push ebp
00C84F0B    8BEC                mov ebp,esp
00C84F0D    6A FF               push -1
00C84F0F    68 78E35300         push 53E378
00C84F14    68 407B4F00         push 4F7B40
00C84F19    64:A1 00000000      mov eax,dword ptr fs:[0]
55 8B EC 6A FF 68 78 E3 53 00 68 40 7B 4F 00 64 A1 00 00 00 00
被偷取的代码1

然后我们接着 F7

(2)

00C84F22    50                  push eax
00C84F23    64:8925 00000000    mov dword ptr fs:[0],esp
00C84F2A    83EC 58             sub esp,58
50 64 89 25 00 00 00 00 83 EC 58
被偷取的代码2

(3)

00C84F30    53                  push ebx
53
被偷取的代码3

(4)

00C84F34    56                  push esi
56
被偷取的代码4

(5)

00C84F38    57                  push edi
00C84F39    8965 E8             mov dword ptr ss:[ebp-18],esp
57 89 65 E8
被偷取的代码5

6、把代码汇总一下

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

7、继续F7,来到这,就F8

你必须按 F8, 因为 F7 没反应 233333

00C85B74    51                  push ecx
00C85B75    57                  push edi
00C85B76    9C                  pushfd
00C85B77    FC                  cld
00C85B78    BF B55BC800         mov edi,0C85BB5
00C85B7D    B9 5E140000         mov ecx,145E
00C85B82    F3:AA               rep stos byte ptr es:[edi]
00C85B84    9D                  popfd
00C85B85    5F                  pop edi
00C85B86    59                  pop ecx
00C85B87    C3                  retn

8、一直 F8 到这里,然后向上看

上面的空代码其实就是被抽取的代码

004F27CF    FF15 9CC25200       call dword ptr ds:[52C29C]
004F27D5    33D2                xor edx,edx
004F27D7    8AD4                mov dl,ah
004F27D9    8915 34306900       mov dword ptr ds:[693034],edx
004F27DF    8BC8                mov ecx,eax
004F27E1    81E1 FF000000       and ecx,0FF
004F27E7    890D 30306900       mov dword ptr ds:[693030],ecx
004F27ED    C1E1 08             shl ecx,8
004F27F0    03CA                add ecx,edx
004F27F2    890D 2C306900       mov dword ptr ds:[69302C],ecx
004F27F8    C1E8 10             shr eax,10
004F27FB    A3 28306900         mov dword ptr ds:[693028],eax
004F2800    6A 01               push 1
004F2802    E8 933B0000         call SoWorker.004F639A
空代码

9、

004F27A4    C3                  retn
004F27A5    33C0                xor eax,eax
004F27A7  ^ EB F8               jmp short SoWorker.004F27A1
004F27A9    0000                add byte ptr ds:[eax],al                //这里就是真正的OEP了
004F27AB    0000                add byte ptr ds:[eax],al
004F27AD    0000                add byte ptr ds:[eax],al
004F27AF    0000                add byte ptr ds:[eax],al
004F27B1    0000                add byte ptr ds:[eax],al
004F27B3    0000                add byte ptr ds:[eax],al
004F27B5    0000                add byte ptr ds:[eax],al
004F27B7    0000                add byte ptr ds:[eax],al
004F27B9    0000                add byte ptr ds:[eax],al
004F27BB    0000                add byte ptr ds:[eax],al
004F27BD    0000                add byte ptr ds:[eax],al
004F27BF    0000                add byte ptr ds:[eax],al
004F27C1    0000                add byte ptr ds:[eax],al
004F27C3    0000                add byte ptr ds:[eax],al
004F27C5    0000                add byte ptr ds:[eax],al
004F27C7    0000                add byte ptr ds:[eax],al
004F27C9    0000                add byte ptr ds:[eax],al
004F27CB    0000                add byte ptr ds:[eax],al
004F27CD    0000                add byte ptr ds:[eax],al
004F27CF    FF15 9CC25200       call dword ptr ds:[52C29C]
004F27D5    33D2                xor edx,edx

10、补上代码,脱壳,修复

我 1.7 版本的 ImportREC 必死…… 就这样吧 orz