Armadillo V4.4 Standard的“输入表乱序+策略代码拼接”保护方式脱壳
 

破文作者:machenglin
脱壳软件:用WIN98记事本加壳
作者声明:出于学习目的,失误之处敬请诸位大侠赐教
调试环境:WinXP、OllyDbg、PEiD、LordPE,arminline0.7

fly大侠对“输入表乱序+策略代码拼接”保护方式的解释,我们首先对它的保护方式有个大概的了解。 ============================================================================================
Import Table Elimination一般是把输入表放在壳申请的内存处并且乱序处理。 对于输入表乱序,以前有两种解法: ①、写代码重新排序; ②、直接用ImportRec“创建新的IAT”功能来构造新的输入表。

Code Splicing通常称为远程地址,Armadillo会把程序中的部分代码挪移到壳申请的内存段运行,普通dump会导致此部分代码丢失。以前有两种解法: ①、修改VirtualAlloc返回地址,使其把挪移的代码放到无用的壳区段; ②、Dmp后补上那个包含挪移代码的壳申请的内存段。 ============================================================================================

从魔法跳转、找OEP,这里不再重复。下面是已经中断在OEP,用Arminline修复的过程。

        1、Code Splicing

我们已经找到并中断在OEP处,注意别关OD,开始解决code splicing了。

Alt+M, 打开内存窗口,点访问---->排序,找第一个类型为priv 访问=RWE的项目。

内存映射,项目 8 地址=00401000 大小=00004000 (16384.) 物主=TEST-3 00400000 区段=.text 类型=Imag 01001002 访问=R 初始访问=RWE

内存映射,项目 239 地址=03FF0000 大小=00012000 (73728.) 物主= 03FF0000 (自身) 区段= 类型=Priv 00021020 访问=R E 初始访问=RWE

打开arminline0.7。

[sleiv] process ID = 看文件-->附加-->ID Start Of Target Code = 00401000 Length Of Target Code = 00004000

在ArmInline的Code Splicing选项: Start Of Spliced Code = 03FF0000 Length Of spliced Code = 00012000

点“remove splicing”。patch succesful.修复成功。 -------------------------------------------------------------------------------------------- 2、Import Table Elimination

IAT开始: 00378744 00180772 00378748 7741A237 SHELL32.DragAcceptFiles 0037874C 77F0E45F GDI32.SetViewportExtEx 00378750 77496696 SHELL32.SHGetSpecialFolderPathA 00378754 77D1FC3C USER32.EnableMenuItem 。。。。。。。。 00378B74 00BA7404 00378B78 77D1C5B8 USER32.ScreenToClient 00378B7C 77D360D5 USER32.SetDlgItemTextA 00378B80 00BA749B 00378B84 7C8097F4 kernel32.MulDiv 00378B88 ABABABAB IAT结束

Size=00378744-00378B88=444

在Import Elimination中添入:

Base Of Existing IAT=00378744 Length Of Existing IAT=444 New Base RVA Of IAT=004067A6

点“Rebase IAT”."Process Succesfully patched" 修复成功。

打开loardpe 选择antitracks dump 完整转存。再打开 importrec1.6 选择antitracks

OEP=10CC, 自动搜索IAT,RVA=67A6 Size=444,getimport获取输入表,cut无效函数,有139个指针。

fixdump 修复抓取文件;

用PeiD看为Microsoft Visual C++ 6.0 SPx Method 1

运行成功。 --------------------------------------------------------------------------------------------

为方便和我一样初学脱壳朋友练习,提供一个加壳的记事本。

 

 

附件下载:http://www.unpack.cn/viewthread.php?tid=3116

上一篇   下一篇