-
-
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,我们可以利用壳的代码,效果还是不错的...,错误之处请大家指正。
【软件名称】:见附件
【调试环境】: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,我们可以利用壳的代码,效果还是不错的...,错误之处请大家指正。
赞赏
他的文章
- [原创]码海迷踪-简单linux64下小虚拟机 6823
- python八进制字符串的转化 8852
- 各位大牛 下面是什么解压缩算法 5585
- 各位大侠 下面是什么算法 3601
- [求助]求解啊 求解 4836
赞赏
雪币:
留言: