下下雪 发表于 2006-12-9 19:44:50

脱2次加壳程序

【文章标题】: 脱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,
   00C4D078    8BF7            mov   esi, edi
   00C4D07A    AC            lods    byte ptr
   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:
   00C4D73F    64:8920         mov   fs:, 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,
   00401014    2D CE2D3C58   sub   eax, 583C2DCE
   00401019    696B 3B 4DC459F>imul    ebp, , F659C44D
   00401020    6F            outs    dx, dword ptr es:
   00401021    79 29         jns   short 0040104C
   看上面的代码感觉是asp的壳,然后在od里取消内存访问异常选项。
   shift+F9大约16次后来到
   016439EC    3100            xor   , eax
   016439EE    64:8F05 0000000>pop   dword ptr fs:
   016439F5    58            pop   eax
   016439F6    833D B07E6401 0>cmp   dword ptr , 0

   016439FD    74 14         je      short 01643A13
   016439FF    6A 0C         push    0C
   01643A01    B9 B07E6401   mov   ecx, 1647EB0
   01643A06    8D45 F8         lea   eax,
   01643A09    BA 04000000   mov   edx, 4
   01643A0E    E8 2DD1FFFF   call    01640B40
   01643A13    FF75 FC         push    dword ptr
   01643A16    FF75 F8         push    dword ptr
   01643A19    8B45 F4         mov   eax,
   01643A1C    8338 00         cmp   dword ptr , 0
   01643A1F    74 02         je      short 01643A23
   01643A21    FF30            push    dword ptr
   01643A23    FF75 F0         push    dword ptr
   01643A26    FF75 EC         push    dword ptr
   01643A29    C3            retn   
   在01643A29按F2下断 shift+F9来到该断点,这时看堆栈

   0012FF5C   0165654C
   0012FF60   00400000cabalmai.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   , al
   01656633   |00B9 00000000   add   , bh
   01656639   |F3:AA         rep   stos byte ptr es:
   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   , 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   
   01655808    69F0 0F9AF217   imul    esi, eax, 17F29A0F
   0165580E    58            pop   eax
   0165580F    65:0169 E9      add   gs:, 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 , 3B5B
   01655833    F2:             prefix repne:
   F7进入call
   继续F8n次 后来到
   0064DBB8    BF 94000000   mov   edi, 94

   0064DBBD    8BC7            mov   eax, edi
   0064DBBF    E8 2C2A0000   call    006505F0
   0064DBC4    8965 E8         mov   , esp
   0064DBC7    8BF4            mov   esi, esp
   0064DBC9    893E            mov   , edi
   0064DBCB    56            push    esi
   0064DBCC    FF15 78E16A00   call   
在命令行输入d 6AE178 看内存
006AE178016506F8
006AE17C01650704
006AE18001650710
006AE1840165071C
006AE18801650728
006AE18C0165073C
006AE19001650748
006AE19401650754
006AE19801650760
006AE19C0165076C
006AE1A001650778
006AE1A401650788
往上拖动滚动条一直到
006AE00077DA7883ADVAPI32.RegQueryValueExA
006AE00477DA761BADVAPI32.RegOpenKeyExA
006AE00877DA6BF0ADVAPI32.RegCloseKey
006AE00C77DAEBE7ADVAPI32.RegSetValueExA
006AE01000000000
006AE0147C123AE9atl71.AtlUpdateRegistryFromResourceD
006AE0187C1212D8atl71.AtlWinModuleTerm
006AE01C7C123AC7atl71.AtlCreateRegistrar
006AE0207C121800atl71.AtlCallTermFunc
006AE0247C12A5D7atl71.AtlAxWinInit
006AE0287C124982atl71.AtlAxGetControl
006AE02C7C123F27atl71.AtlComQIPtrAssign
006AE0307C121277atl71.AtlWinModuleInit
006AE03400000000
006AE038736EFC55ddraw.DirectDrawCreate
006AE03C00000000
006AE0406D18D926dinput8.DirectInput8Create
006AE04400000000
006AE04873E96D55dsound.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能自动修复.

glts 发表于 2006-12-10 00:07:50

支持~~~~版本低点可能好脱下,2.X的有点难

78785651 发表于 2006-12-10 21:16:34

这个壳有点难,学习了

wyh1983 发表于 2006-12-10 21:36:25

版主对壳的分析够深的啊,值得学习1!!!

afen 发表于 2006-12-10 22:03:46

有点难度 收藏一个先 呵呵 !

月之精灵 发表于 2007-1-5 13:24:51

这个壳好像有点难度,学习了。
页: [1]
查看完整版本: 脱2次加壳程序