最近拿到一个穿山甲的 程序,需要脱壳,试过以前的脚本出现错误不能脱..只好手动脱,居然瞎猫碰死耗子成功了...
来到论坛显摆一下^
最开始用的 ArmaG3ddon_v2.0 显示如下
OS--> Microsoft Windows 7 Ultimate
Edition, 64-bit Service Pack 1 (build 7601)
<------- 01/29/2013 19:00:02 ------->
Loading target:
Ar.exe
Process ID: 14B0
Processing target...
=================================
Armadillo version: 9.40 《==========这里的版本不知道是否准确,我估计应该没这么高
Exit Process ID: 14B0
以为ArmaG3ddon_v2.0可以自动脱,可是点了半天也不知道怎么用这玩艺儿...只好放弃,有没有 会用的大虾给说说怎么用? 我等菜鸟必感激不尽!
① 用PEID查壳是Armadillo 3.78 - 4.xx -> Silicon Realms Toolworks,运行一下,是单进程。
用ArmadilloFindProtected12检查,结果如下
目标为Armadillo保护
!- 保护系统级别为 (Digital River)
!-<所使用的保护模式>
标准保护 或 最小保护模式
!- <备份密钥设置>
没有发现注册密钥
!- <目标程序压缩设置>
最小 / 最快的压缩方式
!<其它保护设置>
存储外部环境变量
使用 eSellerate 版本密钥
?-错误 (87) GetThreadContext
地址 00401A8B 010AE8AF
?-问题 进程结束
<- 共消耗时间 00时00分02秒263毫秒 ->
②用OD载入 忽略所有异常
(1)下bp GetModuleHandleA+5断点,一直shift+F9,看堆栈,直到出现下面这个,说明快到了,
00188958 /0018E350
0018895C |0328AB2C 返回到 0328AB2C 来自 kernel32.GetModuleHandleA
00188960 |0333E058 ASCII "kernel32.dll"
00188964 |0333FF34 ASCII "VirtualAlloc"
00188968 |730AEA54
0018896C |7822E428
00188970 |01162848 Ar.01162848
在按两下 运行,来到
0018868C /0018895C
00188690 |032660E4 返回到 032660E4 来自 kernel32.GetModuleHandleA
00188694 |0018880C ASCII "kernel32.dll"
00188698 |00000000
0018869C |01162848 Ar.01162848
001886A0 |00000001
001886A4 |01162848 Ar.01162848
001886A8 |00000001
(2)堆栈出现! 来到上面这个地方,取消断点,Ctrl+F9返回,可以看到 kernel32.LoadLibraryA
032660D3 /74 02 je short 032660D7
032660D5 ^|EB 85 jmp short 0326605C
032660D7 \8D8D B0FEFFFF lea ecx, dword ptr [ebp-150]
032660DD 51 push ecx
032660DE FF15 38C33303 call dword ptr [333C338] ; kernel32.GetModuleHandleA
032660E4 8B55 F8 mov edx, dword ptr [ebp-8] <------------ 返回来到这里
032660E7 8B0D 94AC3603 mov ecx, dword ptr [336AC94]
032660ED 890491 mov dword ptr [ecx+edx*4], eax ;dll句柄保存 在 dword ptr [ecx+edx*4]
032660F0 8B55 F8 mov edx, dword ptr [ebp-8]
032660F3 A1 94AC3603 mov eax, dword ptr [336AC94]
032660F8 833C90 00 cmp dword ptr [eax+edx*4], 0 ; 判断句柄 是否 为 NULL
032660FC 75 5C jnz short 0326615A ; 此处 nop 掉,告诉 Armadillo 查找dll库没有成功
032660FE 8B4D FC mov ecx, dword ptr [ebp-4]
03266101 8B51 08 mov edx, dword ptr [ecx+8]
03266104 83E2 02 and edx, 2
03266107 74 38 je short 03266141
03266109 B8 18000000 mov eax, 18
0326610E C1E0 02 shl eax, 2
03266111 8B0D 9C7A3603 mov ecx, dword ptr [3367A9C] ; Ar.01162848
03266117 8B15 9C7A3603 mov edx, dword ptr [3367A9C] ; Ar.01162848
0326611D 8B35 9C7A3603 mov esi, dword ptr [3367A9C] ; Ar.01162848
03266123 8B5E 1C mov ebx, dword ptr [esi+1C]
03266126 335A 18 xor ebx, dword ptr [edx+18]
03266129 331C01 xor ebx, dword ptr [ecx+eax]
0326612C 83E3 10 and ebx, 10
0326612F F7DB neg ebx
03266131 1BDB sbb ebx, ebx
03266133 F7DB neg ebx
03266135 0FB6C3 movzx eax, bl
03266138 85C0 test eax, eax
0326613A 75 05 jnz short 03266141
0326613C ^ E9 1BFFFFFF jmp 0326605C
03266141 8D8D B0FEFFFF lea ecx, dword ptr [ebp-150]
03266147 51 push ecx
03266148 FF15 30C33303 call dword ptr [333C330] ; kernel32.LoadLibraryA
; Armadillo 使用LoadLibraryA加载 dll句柄
0326614E 8B55 F8 mov edx, dword ptr [ebp-8]
03266151 8B0D 94AC3603 mov ecx, dword ptr [336AC94]
03266157 890491 mov dword ptr [ecx+edx*4], eax
0326615A 8B55 F8 mov edx, dword ptr [ebp-8]
0326615D A1 94AC3603 mov eax, dword ptr [336AC94]
03266162 833C90 00 cmp dword ptr [eax+edx*4], 0 ; 判断句柄 是否 为 NULL
03266166 75 05 jnz short 0326616D ; 此处 nop 掉,告诉 Armadillo 加载dll库也没有成功
03266168 ^ E9 EFFEFFFF jmp 0326605C
0326616D C785 A4FEFFFF 0>mov dword ptr [ebp-15C], 0
03266177 C785 A8FEFFFF 0>mov dword ptr [ebp-158], 0
03266181 8B4D FC mov ecx, dword ptr [ebp-4]
03266184 8B51 04 mov edx, dword ptr [ecx+4]
03266187 8995 ACFEFFFF mov dword ptr [ebp-154], edx
0326618D EB 0F jmp short 0326619E
0326618F 8B85 ACFEFFFF mov eax, dword ptr [ebp-154]
(3)避过OD检查
032663CD 8B4D F8 mov ecx, dword ptr [ebp-8]
032663D0 8B15 94AC3603 mov edx, dword ptr [336AC94]
032663D6 33348A xor esi, dword ptr [edx+ecx*4]
032663D9 8B45 F8 mov eax, dword ptr [ebp-8]
032663DC 8B0D 94AC3603 mov ecx, dword ptr [336AC94]
032663E2 893481 mov dword ptr [ecx+eax*4], esi
032663E5 ^ E9 72FCFFFF jmp 0326605C
032663EA EB 03 jmp short 032663EF ;一直往下拉,到这里,按F4
;中断在这里,取消断点,并撤销前面的修改(nop的地方),
032663EC D6 salc
032663ED D6 salc
032663EE 8F ??? ; 未知命令
032663EF 8B15 AC063703 mov edx, dword ptr [33706AC]
(4)下bp CreateThread 断点,shift+F9后,Ctrl+F9返回,用F8单步走,
03270F16 50 push eax ;回到这里
03270F17 FF15 A0C33303 call dword ptr [333C3A0] ; kernel32.CloseHandle
03270F1D 5E pop esi
03270F1E 5B pop ebx
03270F1F 8BE5 mov esp, ebp
03270F21 5D pop ebp
03270F22 C3 retn ;F8 跟着走
然后往下拉找到类似 call 寄存器,下面是代码
...省略若干代码
03297248 8B55 08 mov edx, dword ptr [ebp+8]
0329724B 8B42 04 mov eax, dword ptr [edx+4]
0329724E 50 push eax
0329724F 8B4D 08 mov ecx, dword ptr [ebp+8]
03297252 8B51 08 mov edx, dword ptr [ecx+8]
03297255 52 push edx
03297256 6A 00 push 0
03297258 8B45 08 mov eax, dword ptr [ebp+8]
0329725B 8B48 10 mov ecx, dword ptr [eax+10]
0329725E 51 push ecx
0329725F 8B55 F4 mov edx, dword ptr [ebp-C]
03297262 2B55 D8 sub edx, dword ptr [ebp-28]
03297265 FFD2 call edx ;<=== 这里 F7进入
03297267 8945 FC mov dword ptr [ebp-4], eax
0329726A 8B45 FC mov eax, dword ptr [ebp-4]
0329726D 5E pop esi
0329726E 8BE5 mov esp, ebp
03297270 5D pop ebp
03297271 C3 retn
03297272 CC int3
进去就来到OEP了,接下来的就是Dump 了
(5)打开load pe dump full
(6)打开 ImportREC (用1.7,一开始我用1.6X的折腾半天发现找出来的输入表有问题,改为1.7就正常,怀疑是win7 x64兼容性问题)
1、填入 OEP
2、IAT AutoSearch
3、Get Imports
4、Show Invalid
5、Cut thunks
6、Fix Dump
③ 运行 修正后的文件发现还会出错,载入OD检查,发现数据(.data) 段有问题,造成内存错误
用OD载入 忽略所有异常
直接 bp CreateThread ,然后 Ctrl+G 到OEP 按F4 让程序停在OEP
用loadpe dump 数据段-〉保存为 文件data.dmp
用ultraEdit或者winHex 打开脱壳后的文件 把data.dmp 文件的内容覆盖到 脱壳后文件对应的数据段。。
运行修改后的文件 。。。运行成功。。。
虽然不知道还有没有暗桩,不过已经可以运行。就满足要求!
脱壳方法不知道是否正确,请各位大牛批评指正,谢谢!
(本贴同发 pediy 和 unpack ,转载请保留出处,万分感谢)
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!