| 
注册时间2006-10-1
阅读权限20
最后登录1970-1-1UID23416 以武会友  
 
 该用户从未签到 | 
 
| 【文章标题】: 脱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能自动修复.
 | 
 |