Armadillo脱壳练习笔记(二)--Import Table Elimination+Strategic Code Splicing

加壳工具:Armadillo_Custom4.40.0250
脱壳工具:armadillo-fp壳分析,ICEODBG.exe,ArmInLine,ImportRec16f.exe
目标程序:CrackMe.exe(看雪论坛上的一个练习注册码的程序,极为简单)

目标程序下载地址: 点击到看雪下载

目标程序运行效果:

 

 

CrackMe v3.0

 

加壳过程:


 

Project ID and Version:  myCrackMe 1.00
Files to Protect:        CrackMe3IatCode.exe
Language:                -Default-
Splash Screen 1:         No splash screen
Enter Key Dialog Options:Two-Line Text Enter Kdy Dialog(default)
Protection Options:      Standard protection only 
                         Enable Import Table Elimination
                         Enable Strategic Code Splicing
Backup Key Options:      Fixed Backup Keys
Compression Options:     Better/Slower Compression
SoftICE Detection:       Standard SoftICE Detection
Data-After-Program Options:Protect and leave at end of file
Interception Options:    Intercept Selected DLLs
std Hardware Locking:
Enh Hardware Locking:
Certificates:            XXX[Default Certificate]



 

 

查壳情况:(armadillo-fp壳分析)


 

<------- 05-08-2008 19:39:13 ------->
C:\cffo-3\CrackMe3IatCode.exe
!- Protected Armadillo
Version 4.40.0250 (Custom Build)
Protection system (Professional)
!- 
<Protection Options>
Standard protection or Minimum protection
Enable Import Table Elimination
Enable Strategic Code Splicing
!- 
<Backup Key Options>
Fixed Backup Keys
!- 
<Compression Options>
Better/Slower Compression
!- 
<Other Options>

 


脱壳过程:

 

1、设置OD异常参数: 菜单--》选项--》调试设置-->异常--》全勾选;
2、载入CrackMe3IatCode.exe (经过上述加壳后生成的程序)
3、隐藏OD:菜单--》插件--》HideOD-->Hide

 

 

0049D000 C>  60                  pushad ;<----开始停这里了
0049D001     E8 00000000         call CrackMe3.0049D006
0049D006     5D                  pop ebp
0049D007     50                  push eax

 

4、Ctrl+G跟随 输入:GetModuleHandleA
 

7C82474A k>  8BFF                mov edi,edi ;<----这下停这里了
7C82474C     55                  push ebp
7C82474D     8BEC                mov ebp,esp
7C82474F     837D 08 00          cmp dword ptr ss:[ebp+8],0
7C824753     74 18               je short kernel32.7C82476D  ;<--下硬件断点
7C824755     FF75 08             push dword ptr ss:[ebp+8]
7C824758     E8 C2040000         call kernel32.7C824C1F
7C82475D     85C0                test eax,eax
7C82475F     74 08               je short kernel32.7C824769
7C824761     FF70 04             push dword ptr ds:[eax+4]

 

5、Shift+F9 一下一下按,注意堆栈窗口,当看到如下内容时留意

 

00129500   |00DE7105  返回到 00DE7105 来自 kernel32.GetModuleHandleA
00129504   |00DFBC1C  ASCII "kernel32.dll"
00129508   |00DFCEC4  ASCII "VirtualAlloc"

 

 


6、Shift+F9 再按一下,如我们期望的,不远了

 

001294FC   /0012EC44
00129500   |00DE7122  返回到 00DE7122 来自 kernel32.GetModuleHandleA
00129504   |00DFBC1C  ASCII "kernel32.dll"
00129508   |00DFCEB8  ASCII "VirtualFree"

 

 

 

7、Shift+F9再一下一下按,好了到返回时机了,如下

 

00129260   /00129500
00129264   |00DD5FC9  返回到 00DD5FC9 来自 kernel32.GetModuleHandleA
00129268   |001293B4  ASCII "kernel32.dll"

 

 

5、6、7步小结

 

 

 

8、删除硬件断点,Alt+F9返回,我们看看代码窗口


 

00DD5FC9     8B0D AC40E000       mov ecx,dword ptr ds:[E040AC]
00DD5FCF     89040E              mov dword ptr ds:[esi+ecx],eax
00DD5FD2     A1 AC40E000         mov eax,dword ptr ds:[E040AC]
00DD5FD7     391C06              cmp dword ptr ds:[esi+eax],ebx
00DD5FDA     75 16               jnz short 00DD5FF2
00DD5FDC     8D85 B4FEFFFF       lea eax,dword ptr ss:[ebp-14C]
00DD5FE2     50                  push eax
00DD5FE3     FF15 BC62DF00       call dword ptr ds:[DF62BC]                      ; kernel32.LoadLibraryA
00DD5FE9     8B0D AC40E000       mov ecx,dword ptr ds:[E040AC]
00DD5FEF     89040E              mov dword ptr ds:[esi+ecx],eax
00DD5FF2     A1 AC40E000         mov eax,dword ptr ds:[E040AC]
00DD5FF7     391C06              cmp dword ptr ds:[esi+eax],ebx
00DD5FFA     0F84 2F010000       je 00DD612F                          ;
<--把Je改为Jmp(修改Magic Jump)改好后回车
00DD6000     33C9                xor ecx,ecx

 

 

9、 回车后

 

00DD612F     83C7 0C             add edi,0C ;<--停这里了
00DD6132     89BD 78FDFFFF       mov dword ptr ss:[ebp-288],edi
00DD6138     83C6 04             add esi,4
00DD613B     395F FC             cmp dword ptr ds:[edi-4],ebx
00DD613E   ^ 0F85 49FEFFFF       jnz 00DD5F8D
00DD6144     EB 03               jmp short 00DD6149 ;<--这里下F2断点
00DD6146     D6                  salc

 

 

 

10、Shift+F9断下后,返回上面找到修改处,把我们改的jmp 改回来,CTRL+G  输入CreateThread

 

7C82510F k>  8BFF                mov edi,edi ;<--F2断下来
7C825111     55                  push ebp
7C825112     8BEC                mov ebp,esp
7C825114     FF75 1C             push dword ptr ss:[ebp+1C]
7C825117     FF75 18             push dword ptr ss:[ebp+18]

 

 

11、Shift+F9断下后,取消断点,ALT+F9返回

 

00DDC51E     50                  push eax  ;<---来到这里,F8步进
00DDC51F     FF15 4C629900       call dword ptr ds:[99624C]        ; kernel32.CloseHandle
00DDC525     5F                  pop edi
00DDC526     5E                  pop esi
00DdC527     C9                  leave
00DDC528     C3                  retn

 

 

12、F8步进到此处

 

00DEF9DC     3350 44             xor edx,dword ptr ds:[eax+44]
00DEF9DF     3350 1C             xor edx,dword ptr ds:[eax+1C]
00DEF9E2     2BCA                sub ecx,edx
00DEF9E4     FFD1                call ecx                                        ; CrackMe3.00441270 瞧!又是Call了一个寄存器
00DEF9E6     8945 E4             mov dword ptr ss:[ebp-1C],eax

 

 

再看看寄存器的值: ECX 00441270 和现在的内存地址比,差距好大.F7跟进去!

 

00441270     55                  push ebp ;<-----OEP在这里!
00441271     8BEC                mov ebp,esp
00441273     83C4 F4             add esp,-0C
00441276     B8 60114400         mov eax,CrackMe3.00441160
0044127B     E8 E848FCFF         call CrackMe3.00405B68
00441280     A1 442C4400         mov eax,dword ptr ds:[442C44]
00441285     8B00                mov eax,dword ptr ds:[eax]
00441287     E8 ECBBFFFF         call CrackMe3.0043CE78
0044128C     A1 442C4400         mov eax,dword ptr ds:[442C44]
00441291     8B00                mov eax,dword ptr ds:[eax]
00441293     BA D0124400         mov edx,CrackMe3.004412D0                       ; ASCII "Crackers For Freedom CrackMe v3.0"
00441298     E8 17B8FFFF         call CrackMe3.0043CAB4

 


ctrl+b 输入FF 25(现在来查找IAT的起始地址)


 

004011D8   - FF25 24140601       jmp dword ptr ds:[1061424]                      ; kernel32.CloseHandle 就选它吧,都一样
004011DE     8BC0                mov eax,eax
004011E0   - FF25 001B0601       jmp dword ptr ds:[1061B00]                      ; kernel32.CreateFileA

 

 
在找到的指令处->右键-数据窗口中跟随-内存地址
然后数据窗口中会显示出各个系统API,随便选一个--> 右键-->长型-->地址

 

010613BC  021807B1
010613C0  77BDCD56  GDI32.UnrealizeObject
010613C4  7739D95D  COMCTL_1.ImageList_BeginDrag
010613C8  7739D9D3  COMCTL_1.ImageList_DragMove
010613CC  7C827861  kernel32.InitializeCriticalSection
010613D0  00DD734A

 

好了,向上找,找到前面再没API的地方,就是头了,把这个010613C0地址记下来这就是IAT的起始地址


向下找结束地址,同理。

01061B28  00DD73F5
01061B2C  7C8111E1  kernel32.FindResourceA
01061B30  77E246A6  USER32.ReleaseCapture
01061B34  77BDC7CE  GDI32.RealizePalette
01061B38  ABABABAB

 

 

 

瞧:01061B38  ABABABAB  就这儿吧。这得算算IAT长度:01061B38-010613C0=778;对吧,老母猪不识数啊,先得数数嘛!
对了,还得再看看spliced code的开始地址和长度:
Alt+M
在CrackMe3 .rsrc 下面,另一个进程程序(我这里是COMX3)的pe header上面一行就是了。
地址:02860000 大小:00020000

 

类似于下图的样子(找昨天练习用记事本程序的spliced code):地址:02c10000 大小:00015000

 

 

 


这时打开ArmInLine
选择我们当前调试中的程序的CrackMe3IatCode.exe,它的ID 在OD里打开附加就可查看到

process ID: 5D0
start of Target Code:401000
Leng of Target Code: 41000 

code splicing
star of spliced code:286000   它总能找对 
length of spliced code:20000  这里改成我们找到的长度,它总找不对
点remove splices 修复 在右边窗口可以看到提示:修复成功

import elimination
Base Of Existing IAT:010613C0
Length Of Existing IAT :778
new base VA of IAT :444000
点Rebase IAT 修复 在右边窗口可以看到提示:修复成功


到这里,我们可以用LordPE.EXE进行DUMP了,然后用ImportRec.exe,选择我们的进程CrackMe3IatCode.exe
它显示基址:00400000 大小:00133000

OEP:00441270- 00400000=41270;
点IAT AutoSearch自己找
RVA:00044000(修复时的444000-基址00400000=00044000) Size:000004FC  
然后GetImports得到137个API ,点ShowInvalid 还全是有效的!
那FixDump吧,选我们dump出的文件。


 

 

运行一下,没问题!PEiD看一下:Borland Delphi 4.0 - 5.0,我们的脱壳就完成了。

 

《注:》图片是在练习记事本时抓的,这里只能示意一下,具体的参数已用文字给出。

 

 

 

posted on 2008-08-06 22:48  northstarlight  阅读(1564)  评论(0编辑  收藏  举报

导航