查看原文
其他

穿山甲的传说

ejamse 看雪学院 2019-05-25

相关阅读:

穿山甲Amardillo保护分析


这一篇是学习chasgone大侠《armadillo中code splicing的几种处理方法》的心得,所不同的是我这里是“一鱼三吃”。对穿山甲采用上文不利的时候,就要拿出集武功之大成的玄门正宗功夫来对付它,以便双杀锁定胜局。谨以此文献给那些跟我一样摸爬滚打、颠簸在路上的新手们,并在此向chasgone大侠致敬!


下面开始:


1、用PEID查壳为:

Armadillo 3.78 - 4.xx -Silicon Realms Toolworks


用ExeinfoPE查壳,显示为:

Armadillo 4.4x ~ 4.62..5.0~7.0 32bit  -  www.siliconrealms.com (60e8)


2、试运行,显示为单进程,有试用提示窗体;


3、OD载入目标GameJack.exe,忽略所有异常,隐藏OD,下HE kernel32.GetModuleHandleA硬件断点,并Shift+F9运行,两次弹窗点OK,断下来后看堆栈:

00129270 00916AFD /CALL 到 GetModuleHandleA 来自 00916AF7

00129274  0092BD6C \pModule = "kernel32.dll"

00129278  0092DDAC  ASCII "VirtualAlloc"


继续F9看堆栈:

00129270 00916B1A /CALL 到 GetModuleHandleA 来自 00916B14

00129274  0092BD6C \pModule = "kernel32.dll"

00129278  0092DDA0  ASCII "VirtualFree"


继续F9看堆栈:

00128FD4 00905A49 /CALL 到 GetModuleHandleA 来自 00905A43

00128FD8  00129124 \pModule = "kernel32.dll"


4、此时到达最佳返回时机,删除断点alt+f9返回,找到魔法跳:

......

00905A63 FF15 B8629200  call dword ptr ds:[9262B8] ; kernel32.LoadLibraryA

......

00905A7A 0F84 2F010000 je 00905BAF;魔法跳


5、改魔法跳为jmp:

00905A7A /E9 30010000 jmp 00905BAF

00905A7F |90 nop


跟随jmp往下找到:

00905BBE ^\0F85 49FEFFFF jnz 00905A0D

00905BC4 EB 03 jmp short 00905BC9


点00905BC4这一行F4,再回头撤销魔法跳的更改;


方法一:先发制人----移花接木法


6、下断HE kernel32.VirtualAlloc并F9运行,断下后alt+f9返回,注意观察EAX的值,若为0则继续F9并alt+f9返回,当第一次出现EAX=03460000(不是定值),打开M镜像观察还没有03460000段,表示壳要开辟新空间03460000了,此时继续F9并alt+f9返回,马上观察M镜像已经有了03460000段,双击它显示全为0,说明火候到了,此时将EAX的值改为.adata段的起始值004F8000,删除断点。


7、下断HE kernel32.SetProcessWorkingSetSize并F9运行,4次弹窗都点OK,先不取消断点,再下断点:HE kernel32.GetCurrentThreadId并F9运行,断下后alt+f9返回:

00325E54  50 push eax

00325E55 FF75 FC push dword ptr ss:[ebp-4]

00325E58 E8 05000000  call 00325E62

00325E5D  83C4 0C  add esp,0C

00325E60 C9 leave

00325E61 C3 retn


8、删除两个断点,单步F8直到返回在:

003402C1 6A 00 push 0


向下找到:

0034039B FFD1  call ecx;段尾最近的CALL

0034039D  8945 FC mov dword ptr ss:[ebp-4],eax

003403A0  8B45 FC mov eax,dword ptr ss:[ebp-4]

003403A3  5F  pop edi

003403A4  5E  pop esi

003403A5 C9 leave

003403A6 C3 retn


9、点0034039B这一行F4,再F7跟入到达OEP=0046F114,此时用LordPE(修正大小)来Dump为dumped.exe,填入OEP:6F114,ImportREC自动方式获取API,剪切多余项,转存为dumped_.exe;


10、运行dumped_.exe提示不是有效的WIN32程序,用LordPE重建验证一下就OK了。



方法二:后发制人----女娲补天法


6、下断HE kernel32.SetProcessWorkingSetSize并F9运行,4次弹窗都点OK,先不取消断点,再下断点:HE kernel32.GetCurrentThreadId并F9运行,断下后alt+f9返回:

00325E54  50 push eax

00325E55 FF75 FC push dword ptr ss:[ebp-4]

00325E58 E8 05000000  call 00325E62

00325E5D  83C4 0C  add esp,0C

00325E60 C9 leave

00325E61 C3 retn


7、删除两个断点,单步F8直到返回在:

003402C1 6A 00 push 0


向下找到:

0034039B FFD1  call ecx;段尾最近的CALL

0034039D  8945 FC mov dword ptr ss:[ebp-4],eax

003403A0  8B45 FC mov eax,dword ptr ss:[ebp-4]

003403A3  5F  pop edi

003403A4  5E  pop esi

003403A5 C9 leave

003403A6 C3 retn


8、点0034039B这一行F4,再F7跟入到达OEP=0046F114,现在对付code splicing:


查找GameJack.exe的进程为1C38,打开M镜像。


a、找到GameJack.text段:

内存映射,项目 25

地址=00402000

大小=00078000 (491520.)

宿主=GameJack 00400000

区段=.text

类型=Imag 01001002

访问=R

初始访问=RWE


b、找到code splicing段:(点类型排序,第一个类型为priv 访问=RWE的项目):

内存映射,项目 30

地址=02C70000

大小=00020000 (131072.)

宿主= 02C70000 (自身)

区段=

类型=Priv 00021020

访问=R E

初始访问=RWE


打开ArmInline,填入相应数值(软件可以自动填,但要手动修正),点remove splicing,修补成功。


9、此时用LordPE(修正大小)来Dump为dumped.exe,填入OEP:6F114,ImportREC自动方式获取API,剪切多余项,转存为dumped_.exe;


10、运行dumped_.exe提示不是有效的WIN32程序,用LordPE重建验证一下就OK了。



方法三:腹黑疗法----宗吾补锅法


重启OD一路狂奔,接方法二的8(注:9修复输入表、10重建PE的顺序可以交换。)


8、点0034039B这一行F4,再F7跟入到达OEP=0046F114,用LordPE(修正大小)来Dump为dumped.exe;


查找GameJack.exe的进程为1E24(重启OD进程已变),打开M镜像找到code splicing段:


(点类型排序,第一个类型为priv 访问=RWE的项目)

内存映射,项目 30

地址=02EF0000(重启OD地址已变)

大小=00020000 (131072.)

宿主= 02EF0000 (自身)

区段=

类型=Priv 00021020

访问=R E

初始访问=RWE


用LordPE区域脱壳code splicing段(大小=00020000)为Region02EF0000-02F10000.dmp,再用PE编辑器(LordPE自带)打开dumped.exe,选区段,右键从磁盘载入Region02EF0000-02F10000.dmp添加了新段Region02,在该段右键编辑区段,虚拟地址改为02EF0000-00400000=2AF0000,确定退出记得保存。


9、填入OEP:6F114,ImportREC自动方式获取API,剪切多余项,转存为dumped_.exe;


10、运行dumped_.exe提示不是有效的WIN32程序,用LordPE重建验证一下就OK了。


- End -




看雪ID:ejamse             

https://bbs.pediy.com/user-528840.htm



本文由看雪论坛ejamse 原创

转载请注明来自看雪社区



热门图书推荐:

立即购买!




热门文章阅读


1、挖掘ruckus路由器漏洞总结的几个点

2、已更新至第8章 | LLVM编译框架详解

3、全面详解 Ghidra

4、简单高效开发你的shellcode不是梦!




公众号ID:ikanxue

官方微博:看雪安全

商务合作:wsc@kanxue.com



点击下方“阅读原文”

    您可能也对以下帖子感兴趣

    文章有问题?点此查看未经处理的缓存