首页
社区
课程
招聘
asprotect 复古篇
发表于: 2009-8-14 08:18 3566

asprotect 复古篇

2009-8-14 08:18
3566
【作者声明】:以前分析的,出来灌灌水,大牛们经常告诫菜菜们,搞一个壳要先搞低版本的,然后再弄高版本的,偶也很认可,于是就弄来了一个asprotect1.00加壳的记事本来弄,没想到这个壳的iat加浪费了我一下午的时间,弄之前试了下skylly的aspr 1.0脚本,没有跑成功,决定还是自己来,下面记录一下过程,算是给一个修复iat的思路吧
【软件名称】:见附件
【调试环境】:WinXP、OD、LordPE、ImportREC 
【分析过程】: 
od载入,EP:
0040D001 <>  60                  pushad
0040D002     E8 01000000         call chap708.0040D008
0040D007     90                  nop
0040D008     5D                  pop ebp
0040D009     81ED BFAF4500       sub ebp,45AFBF
0040D00F     BB B8AF4500         mov ebx,45AFB8
0040D014     03DD                add ebx,ebp
0040D016     2B9D 91C34500       sub ebx,dword ptr ss:[ebp+45C391]
0040D01C     83BD 8CC24500 00    cmp dword ptr ss:[ebp+45C28C],0
0040D023     899D F5BF4500       mov dword ptr ss:[ebp+45BFF5],ebx
0040D029     0F85 CE100000       jnz chap708.0040E0FD
0040D02F     8D85 94C24500       lea eax,dword ptr ss:[ebp+45C294]
0040D035     50                  push eax
0040D036     FF95 D0C34500       call dword ptr ss:[ebp+45C3D0]
0040D03C     8985 90C24500       mov dword ptr ss:[ebp+45C290],eax

先到oep看看,忽略所有异常,指定异常范围也打钩,然后填上00000000-ffffffff,f9跑,程序运行起来了,然后看记录,

0040D001   Main thread with ID 000002E4 created
00400000   Module C:\Documents and Settings\Administrator\桌面\asprotect1.0\chap708.exe
             Code section extended to include self-extractor
             CRC changed, discarding .udd data
5D170000   Module C:\WINDOWS\system32\COMCTL32.dll
76320000   Module C:\WINDOWS\system32\comdlg32.dll
77BE0000   Module C:\WINDOWS\system32\msvcrt.dll
77D10000   Module C:\WINDOWS\system32\USER32.dll
             CRC changed, discarding .udd data
77DA0000   Module C:\WINDOWS\system32\ADVAPI32.dll
             CRC changed, discarding .udd data
77E50000   Module C:\WINDOWS\system32\RPCRT4.dll
77EF0000   Module C:\WINDOWS\system32\GDI32.dll
77F40000   Module C:\WINDOWS\system32\SHLWAPI.dll
7C800000   Module C:\WINDOWS\system32\kernel32.dll
             CRC changed, discarding .udd data
7C920000   Module C:\WINDOWS\system32\ntdll.dll
             CRC changed, discarding .udd data
7D590000   Module C:\WINDOWS\system32\shell32.dll
76300000   Module C:\WINDOWS\system32\IMM32.DLL
62C20000   Module C:\WINDOWS\system32\LPK.DLL
73FA0000   Module C:\WINDOWS\system32\USP10.dll
0040D001   Program entry point
             IsDebugPresent hidden
001917DC   INT3 command at 001917DC
00181BCB   Access violation when reading [FFFFFFF4]
7C812A7B   Exception 0EEDFACE
7C812A7B   Exception 0EEDFACE
7C812A7B   Exception 0EEDFACE
77180000   Module C:\WINDOWS\WinSxS\x86_Microsoft.Windows.Common-Controls_6595b64144ccf1df_6.0.2600.2982_x-ww_ac3f9c03\comctl32.dll
5ADC0000   Module C:\WINDOWS\system32\uxtheme.dll
74680000   Module C:\WINDOWS\system32\MSCTF.dll
73640000   Module C:\WINDOWS\system32\msctfime.ime

好了,我们用最后一次异常发到达oep,重新载入,忽略所有异常,把指定异常的钩钩去掉,shift+f9三次,然后code段下访问断点,f9一下来到oep:

004010CC     55                  push ebp                                                       ; LoadPE dump 程序
004010CD     8BEC                mov ebp,esp
004010CF     83EC 44             sub esp,44
004010D2     56                  push esi
004010D3     FF15 E4634000       call dword ptr ds:[4063E4]
004010D9     8BF0                mov esi,eax
004010DB     8A00                mov al,byte ptr ds:[eax]
004010DD     3C 22               cmp al,22
004010DF     75 1B               jnz short chap708.004010FC
004010E1     56                  push esi
004010E2     FF15 F4644000       call dword ptr ds:[4064F4]
004010E8     8BF0                mov esi,eax
004010EA     8A00                mov al,byte ptr ds:[eax]
004010EC     84C0                test al,al
004010EE     74 04               je short chap708.004010F4
004010F0     3C 22               cmp al,22

ctrl+g 到4063e4去看看iat的情况,

004062E4  0C 26 DD 00 28 26 DD 00 44 26 DD 00 60 26 DD 00  .&?(&?D&?`&?
004062F4  7C 26 DD 00 00 00 00 00 0E 8C EF 77 7A 5A EF 77  |&?.... 
岋wzZ飛
00406304  E3 E2 EF 77 80 5B EF 77 24 3F F2 77 D1 DA F0 77  汊飛€[飛$?騱掩饂
00406314  6F 6E EF 77 7E F0 F0 77 C9 50 F2 77 41 D8 F0 77  on飛~痧w蒔騱A仞w
00406324  7A DF EF 77 D8 B6 F1 77 44 40 F2 77 EB 5E EF 77  z唢w囟駑D@騱隵飛
00406334  EA 99 EF 77 1F DC EF 77 A5 3A F0 77 4E 3B F0 77  隀飛¬茱w?饂N;饂
00406344  EF D4 EF 77 21 B2 EF 77 89 A0 EF 77 0A 6C EF 77  镌飛!诧w墵飛.l飛
00406354  D1 61 EF 77 00 00 00 00 B0 20 DD 00 BC 20 DD 00  補飛....????
00406364  C8 20 DD 00 D4 20 DD 00 E0 20 DD 00 EC 20 DD 00  ????????
00406374  F8 20 DD 00 04 21 DD 00 10 21 DD 00 1C 21 DD 00  ?? !? !? !?
00406384  28 21 DD 00 34 21 DD 00 40 21 DD 00 4C 21 DD 00  (!?4!?@!?L!?
00406394  58 21 DD 00 64 21 DD 00 70 21 DD 00 7C 21 DD 00  X!?d!?p!?|!?
004063A4  88 21 DD 00 94 21 DD 00 A0 21 DD 00 AC 21 DD 00  ????????
004063B4  B8 21 DD 00 C4 21 DD 00 D0 21 DD 00 DC 21 DD 00  ????????
004063C4  E8 21 DD 00 F4 21 DD 00 00 22 DD 00 0C 22 DD 00  ????."?."?
004063D4  18 22 DD 00 24 22 DD 00 30 22 DD 00 3C 22 DD 00   "?$"?0"?<"?
004063E4  48 22 DD 00 54 22 DD 00 60 22 DD 00 6C 22 DD 00  H"?T"?`"?l"?
004063F4  00 00 00 00 08 20 DD 00 24 20 DD 00 40 20 DD 00  ....  ?$ ?@ ?
00406404  5C 20 DD 00 78 20 DD 00 94 20 DD 00 00 00 00 00  \ ?x ???....
00406414  78 22 DD 00 84 22 DD 00 90 22 DD 00 9C 22 DD 00  x"???????
00406424  A8 22 DD 00 B4 22 DD 00 C0 22 DD 00 CC 22 DD 00  ????????
00406434  D8 22 DD 00 E4 22 DD 00 F0 22 DD 00 FC 22 DD 00  ????????
00406444  08 23 DD 00 14 23 DD 00 20 23 DD 00 2C 23 DD 00   #? #? #?,#?
00406454  38 23 DD 00 44 23 DD 00 50 23 DD 00 5C 23 DD 00  8#?D#?P#?\#?
00406464  68 23 DD 00 74 23 DD 00 80 23 DD 00 8C 23 DD 00  h#?t#?€#???
00406474  98 23 DD 00 A4 23 DD 00 B0 23 DD 00 BC 23 DD 00  ????????
00406484  C8 23 DD 00 D4 23 DD 00 E0 23 DD 00 EC 23 DD 00  ????????
00406494  F8 23 DD 00 04 24 DD 00 10 24 DD 00 1C 24 DD 00  ?? $? $? $?
004064A4  28 24 DD 00 34 24 DD 00 40 24 DD 00 4C 24 DD 00  ($?4$?@$?L$?
004064B4  58 24 DD 00 64 24 DD 00 70 24 DD 00 7C 24 DD 00  X$?d$?p$?|$?
004064C4  88 24 DD 00 94 24 DD 00 A0 24 DD 00 AC 24 DD 00  ????????
004064D4  B8 24 DD 00 C4 24 DD 00 D0 24 DD 00 DC 24 DD 00  ????????
004064E4  E8 24 DD 00 F4 24 DD 00 00 25 DD 00 0C 25 DD 00  ????.%?.%?
004064F4  18 25 DD 00 24 25 DD 00 30 25 DD 00 3C 25 DD 00   %?$%?0%?<%?
00406504  00 00 00 00 48 25 DD 00 64 25 DD 00 80 25 DD 00  ....H%?d%?€%?
00406514  9C 25 DD 00 B8 25 DD 00 D4 25 DD 00 F0 25 DD 00  ????????
00406524  00 00 00 00 6A 00 00 00 00 00 00 00 00 00 00 00  ....j...........

可以看到有的加密了,有的没有,拿出IR,详细看一下,我们可以看到iat加密时一个一个dll整体加密的,想用跟踪等级一修复一下,可以看到修复了一部分,但还有两块没有修复,呵呵,还有一块修复错误

004062E0  00000000
004062E4  00DD260C
004062E8  00DD2628
004062EC  00DD2644
004062F0  00DD2660
004062F4  00DD267C
004062F8  00000000

004063F4  00000000                 这块我的IR识别错误了,变成了同一个一个函数的地址
004063F8  00DD2008
004063FC  00DD2024
00406400  00DD2040
00406404  00DD205C
00406408  00DD2078
0040640C  00DD2094
00406410  00000000

00406504  00000000
00406508  00DD2548
0040650C  00DD2564
00406510  00DD2580
00406514  00DD259C
00406518  00DD25B8
0040651C  00DD25D4
00406520  00DD25F0
00406524  00000000

我们知道几乎所有的iat加密之后它肯定会是取解密的,我们去看看它是怎么解密的,ctrl+g 来到dd260c,新建eip,f7走:

00DD260C     68 1626DD00         push 0DD2616
00DD2611     E8 92EE3AFF         call 001814A8                                                  ; 解密函数,f7进
00DD2616     9F                  lahf

001814A8     55                  push ebp
001814A9     8BEC                mov ebp,esp
001814AB     81C4 F8FEFFFF       add esp,-108
001814B1     53                  push ebx
001814B2     56                  push esi
001814B3     8B5D 08             mov ebx,dword ptr ss:[ebp+8]
001814B6     8B03                mov eax,dword ptr ds:[ebx]
001814B8     8945 F8             mov dword ptr ss:[ebp-8],eax
001814BB     8D85 F8FEFFFF       lea eax,dword ptr ss:[ebp-108]
001814C1     33C9                xor ecx,ecx
001814C3     BA 00010000         mov edx,100
001814C8     E8 CF07FFFF         call 00171C9C
001814CD     8BC3                mov eax,ebx
001814CF     8B50 04             mov edx,dword ptr ds:[eax+4]
001814D2     8A12                mov dl,byte ptr ds:[edx]
001814D4     3A15 6C7B1800       cmp dl,byte ptr ds:[187B6C]
001814DA     74 4D               je short 00181529
001814DC     8B50 04             mov edx,dword ptr ds:[eax+4]
001814DF     8BCA                mov ecx,edx
001814E1     41                  inc ecx
001814E2     8A19                mov bl,byte ptr ds:[ecx]
001814E4     83C2 02             add edx,2
001814E7     8955 FC             mov dword ptr ss:[ebp-4],edx
001814EA     8BF3                mov esi,ebx
001814EC     81E6 FF000000       and esi,0FF
001814F2     8BCE                mov ecx,esi
001814F4     8D85 F8FEFFFF       lea eax,dword ptr ss:[ebp-108]
001814FA     8B55 FC             mov edx,dword ptr ss:[ebp-4]
001814FD     E8 0A26FFFF         call 00173B0C                                                  ; 解出dll名字
00181502     8B45 F8             mov eax,dword ptr ss:[ebp-8]
00181505     E8 8E30FFFF         call 00174598
0018150A     83E8 02             sub eax,2
0018150D     50                  push eax
0018150E     8BD6                mov edx,esi
00181510     8D85 F8FEFFFF       lea eax,dword ptr ss:[ebp-108]
00181516     8B4D F8             mov ecx,dword ptr ss:[ebp-8]
00181519     E8 62E4FFFF         call 0017F980                                                  ; ecx中出现函数名字
0018151E     8D85 F8FEFFFF       lea eax,dword ptr ss:[ebp-108]
00181524     8945 FC             mov dword ptr ss:[ebp-4],eax
00181527     EB 09               jmp short 00181532
00181529     8B40 04             mov eax,dword ptr ds:[eax+4]
0018152C     40                  inc eax
0018152D     8B00                mov eax,dword ptr ds:[eax]
0018152F     8945 FC             mov dword ptr ss:[ebp-4],eax
00181532     FF75 FC             push dword ptr ss:[ebp-4]
00181535     FF75 F8             push dword ptr ss:[ebp-8]
00181538     E8 5BFDFFFF         call 00181298                                                  ; 获取函数地址
0018153D     8945 04             mov dword ptr ss:[ebp+4],eax                                   ; 函数地址放到堆栈中
00181540     5E                  pop esi
00181541     5B                  pop ebx
00181542     8BE5                mov esp,ebp
00181544     5D                  pop ebp
00181545     C2 0400             retn 4                                                         ; 返回到函数地址取执行,也就是执行这个函数

跟踪加密解密iat时要时刻注意iat地址的存放,以便找到方法修复,我们f7到00181545可以看到,再走一步,就执行到函数地址去了,而此时eax中存放的是函数地址,
我打算这样修复,将
0018153D     8945 04             mov dword ptr ss:[ebp+4],eax                                   ; 函数地址放到堆栈中
改成这样:
0018153D     8945 04             mov dword ptr ss:[ebp+8],eax                                   ; 函数地址放到堆栈中
这样的话它就不返回到函数地址处了。

代码如下,code能力太弱让大家见笑了,找片空地,这里我选择的是00404fd8,写入如下代码:

00404FD8     BE 08654000          mov esi,chap708.004062e4                                      ;
00404FDD     90                   nop
00404FDE     90                   nop
00404FDF     90                   nop
00404FE0     90                   nop
00404FE1     AD                   lods dword ptr ds:[esi]                                       ;为下面找参数作准备                                       
00404FE2     56                   push esi
00404FE3     8B70 01              mov esi,dword ptr ds:[eax+1]                                  ;找到解密参数
00404FE6     56                   push esi                                                      ;解密参数入栈
00404FE7     E8 B45AD7FF          call 001814a8                                                 ;上面的解密函数,每次都不一样,要自己找
00404FEC     5E                   pop esi
00404FED     8946 FC              mov dword ptr ds:[esi-4],eax                                  ;正确函数地址写入,方便IR修复
00404FF0     90                   nop
00404FF1     90                   nop
00404FF2     833E 00              cmp dword ptr ds:[esi],0                                      ;判断是否处理完一个dll
00404FF5   ^ 75 E6                jnz short chap708.00404FDD
00404FF7     90                   nop
00404FF8     90                   nop
00404FF9     90                   nop

然后在00404fd8新建eip,F4到00404ff7,一个dll修复完毕;然后将00404fd8处的004062e4改成004063f4,然后此处新建eip,处理方法同上;
再改成00406508,此处新建eip,处理方法同上。

至此所有函数都修复完毕,IR重新获取一次,全部有效,修复,可以正常运行。

脱壳总结:

本打算在oep之前修复的,结果跟了半天没有成功,于是想在oep之后修复,本想不用它的解密函数的,也是跟了半天,功力不够,想出上面比较笨拙的方法,其实有的时候修复iat,我们可以利用壳的代码,效果还是不错的...,错误之处请大家指正。

[培训]科锐逆向工程师培训第53期2025年7月8日开班!

上传的附件:
收藏
免费 0
支持
分享
最新回复 (0)
游客
登录 | 注册 方可回帖
返回