【文章标题】: 脱2次加壳程序
【文章作者】: ldsjlm
【软件名称】: 某游戏exe
【软件大小】: 1.24MB
【下载地址】: 自己搜索下载
【加壳方式】: yoda's cryptor 1.x / modified+ASProtect 1.23RC4
【使用工具】: 0llydbg1.10 Peid importRec loadPE
【操作平台】: xp
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
首先peid查程序文件显示yoda's cryptor 1.x / modified.
用od载入后弹出“是压缩代码――要继续进行分析吗?”,点“否”, 然后在od的调试异常了设置忽略全部异常.
00C4D060 > 60 pushad
00C4D061 E8 00000000 call 00C4D066
00C4D066 5D pop ebp
00C4D067 81ED 0F1E4000 sub ebp, 00401E0F
00C4D06D B9 57090000 mov ecx, 957
00C4D072 8DBD 571E4000 lea edi, [ebp+401E57]
00C4D078 8BF7 mov esi, edi
00C4D07A AC lods byte ptr [esi]
F8走到00C4D06D看esp=0012FFA4,在命令输入hr 0012FFA4,然后shift+F9来到
00C4D739 50 push eax ; cabalmai.00C4D6E8
00C4D73A 33C0 xor eax, eax
00C4D73C 64:FF30 push dword ptr fs:[eax]
00C4D73F 64:8920 mov fs:[eax], esp
00C4D742 EB 01 jmp short 00C4D745
命令输入hd 0012FFA4 取消硬件断点,跟着alt+M在代码段按F2下断,shift+F9执行来到
00401000 68 0190C300 push 00C39001
00401005 E8 01000000 call 0040100B
0040100A C3 retn
0040100B C3 retn
0040100C B0 7F mov al, 7F
0040100E 0AB1 6B03389C or dh, [ecx+9C38036B]
00401014 2D CE2D3C58 sub eax, 583C2DCE
00401019 696B 3B 4DC459F>imul ebp, [ebx+3B], F659C44D
00401020 6F outs dx, dword ptr es:[edi]
00401021 79 29 jns short 0040104C
看上面的代码感觉是asp的壳,然后在od里取消内存访问异常选项。
shift+F9大约16次后来到
016439EC 3100 xor [eax], eax
016439EE 64:8F05 0000000>pop dword ptr fs:[0]
016439F5 58 pop eax
016439F6 833D B07E6401 0>cmp dword ptr [1647EB0], 0
016439FD 74 14 je short 01643A13
016439FF 6A 0C push 0C
01643A01 B9 B07E6401 mov ecx, 1647EB0
01643A06 8D45 F8 lea eax, [ebp-8]
01643A09 BA 04000000 mov edx, 4
01643A0E E8 2DD1FFFF call 01640B40
01643A13 FF75 FC push dword ptr [ebp-4]
01643A16 FF75 F8 push dword ptr [ebp-8]
01643A19 8B45 F4 mov eax, [ebp-C]
01643A1C 8338 00 cmp dword ptr [eax], 0
01643A1F 74 02 je short 01643A23
01643A21 FF30 push dword ptr [eax]
01643A23 FF75 F0 push dword ptr [ebp-10]
01643A26 FF75 EC push dword ptr [ebp-14]
01643A29 C3 retn
在01643A29按F2下断 shift+F9来到该断点,这时看堆栈
0012FF5C 0165654C
0012FF60 00400000 cabalmai.00400000
0012FF64 BEA1DBE2
0012FF68 0012FFA4 //这里很重要
在命令行输入hr 0012FF68下硬件断点后shift+F9来到
01656626 /EB 44 jmp short 0165666C
01656628 |EB 01 jmp short 0165662B
0165662A |9A 51579CFC BF0>call far 00BF:FC9C5751
01656631 |0000 add [eax], al
01656633 |00B9 00000000 add [ecx], bh
01656639 |F3:AA rep stos byte ptr es:[edi]
0165663B |9D popfd
0165663C |5F pop edi
0165663D |59 pop ecx
0165663E |C3 retn
命令行输入hd 0012FF68取消硬件断点,然后按F8来到
01655778 03C3 add eax, ebx ; cabalmai.00400000
0165577A BB 1B030000 mov ebx, 31B //注意这个值,等下修复程序我们用得上。
0165577F 0BDB or ebx, ebx
01655781 75 07 jnz short 0165578A
01655783 894424 1C mov [esp+1C], eax
01655787 61 popad
01655788 50 push eax
01655789 C3 retn
0165578A E8 00000000 call 0165578F // 0165578A动态地址必须记住,等一下用得着,这个地
址是动态生成的,以你机器的地址为准。
现在开始dump文件
打开loadpe选择目标进程然后鼠标右键选者correct imagesize,然后在右键菜单选择dump full 保存文件为dump.exe,下面还要dump出区域代码
地址01650000,大小C000.保存文件01650000.dmp
现在开始重建PE
在loadpe里打开dump.exe后选者sections,在弹出的窗口中右键菜单中选者load section from disk选者01650000.dmp
然后在修改该区段的virtualAddress为01250000,关闭该窗口,在loadpe主窗口里单击options在弹出窗口右下角名字为rebuilder
的那块区域中选中validate PE,其他几个选项取消,然后在loadpe中单击Rebulid PE,选者dump.exe重建PE.
现在开始dump IAT,
回到od里F8来到
01655805 FF53 16 call [ebx+16]
01655808 69F0 0F9AF217 imul esi, eax, 17F29A0F
0165580E 58 pop eax
0165580F 65:0169 E9 add gs:[ecx-17], ebp
01655813 E8 E8E99A5B call 5D004200
01655818 36:EB 01 jmp short 0165581C
0165581B - 0F81 C3D30D50 jno 51732BE4
01655821 91 xchg eax, ecx
01655822 5B pop ebx
01655823 6A 60 push 60
01655825 68 E86A6C00 push 6C6AE8
0165582A 66:8105 3458650>add word ptr [1655834], 3B5B
01655833 F2: prefix repne:
F7进入call [ebx+16]
继续F8n次 后来到
0064DBB8 BF 94000000 mov edi, 94
0064DBBD 8BC7 mov eax, edi
0064DBBF E8 2C2A0000 call 006505F0
0064DBC4 8965 E8 mov [ebp-18], esp
0064DBC7 8BF4 mov esi, esp
0064DBC9 893E mov [esi], edi
0064DBCB 56 push esi
0064DBCC FF15 78E16A00 call [6AE178]
在命令行输入d 6AE178 看内存
006AE178 016506F8
006AE17C 01650704
006AE180 01650710
006AE184 0165071C
006AE188 01650728
006AE18C 0165073C
006AE190 01650748
006AE194 01650754
006AE198 01650760
006AE19C 0165076C
006AE1A0 01650778
006AE1A4 01650788
往上拖动滚动条一直到
006AE000 77DA7883 ADVAPI32.RegQueryValueExA
006AE004 77DA761B ADVAPI32.RegOpenKeyExA
006AE008 77DA6BF0 ADVAPI32.RegCloseKey
006AE00C 77DAEBE7 ADVAPI32.RegSetValueExA
006AE010 00000000
006AE014 7C123AE9 atl71.AtlUpdateRegistryFromResourceD
006AE018 7C1212D8 atl71.AtlWinModuleTerm
006AE01C 7C123AC7 atl71.AtlCreateRegistrar
006AE020 7C121800 atl71.AtlCallTermFunc
006AE024 7C12A5D7 atl71.AtlAxWinInit
006AE028 7C124982 atl71.AtlAxGetControl
006AE02C 7C123F27 atl71.AtlComQIPtrAssign
006AE030 7C121277 atl71.AtlWinModuleInit
006AE034 00000000
006AE038 736EFC55 ddraw.DirectDrawCreate
006AE03C 00000000
006AE040 6D18D926 dinput8.DirectInput8Create
006AE044 00000000
006AE048 73E96D55 dsound.DirectSoundCreate8
记录rva=006AE000-400000=002AE000
然后在打开importRec选者目标进程
设置RVA=002AE000 size=1000 然后Get imports,在单击show invalid
选者一个非法的地址右键菜单选者trace level1(disasm),完成后在单击show invalid显示非法地址,
然后选者一个非法地址在右键菜单plugin Tracers选者asprotect1.22修复无效的地址,完成后在单击show invalid
然后cut 所有无效的地址,在OEP处输入01250000 后fix dump
最后修复脱壳后的文件。
用od 载入脱壳后的文件dump_.exe
入口代码修改成
01650000 > BB 1B030000 mov ebx, 31B
01650005 E9 146C0000 jmp 0165578A
保存到文件,运行脱壳文件,正常启动
--------------------------------------------------------------------------------
【经验总结】
经验都是前人的,我只是学习后做的一次实践
参考教程:
1:两步快速脱yoda's cryptor 1.2壳--esp定律和内存断点完美组合应用
2:菜鸟也脱ASProtect 1.23RC4 这篇文章就能脱asprotect1.23 rc4的壳,
3:Asprotect1.23的iat修复
注意:
脱壳后修复IAT的时候,作者用的AsprDbgr v1.0beta ,在我机器上用不起,只能手工dump IAT,在修复IAT的时候
我失败了很多次,最后终于在看了Asprotect1.23的iat修复后手工修复成功,后来又发现在importrec中用插件
asprotect1.22能自动修复.
--------------------------------------------------------------------------------
2006年12月06日 12:28:29
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)