Armadillo壳标准方式的脱壳方法
Armadillo壳不当今的猛壳,其加壳方式多种多样,非常强劲,并且版本也不断升级,本总结也只能是一些常规的思路希望对我们这些“小虾”有所裨益。一、单线程标准方式(脱壳方法是两次断点加一个修改Magic Jump)过程如下:
1、首先od的设置:OD设置忽略所有的异常,用隐藏插件隐藏OD!
2、下断点Bp GetModuleHandleA/he GetModuleHandleA/bp GetModuleHandleA+5/he GetModuleHandleA+5
以上几种断点都行,但:Armadillo对断点的检测非常严格,设置断点的时候要尽量多用“硬件执行”断点,)按shift+f9运行,当经过一个call缓冲有点大时,这时在寄存器窗口一般出现两个kernel32.dll,这是正是返回的好时机,取消断点,按alt+f9执行到返回。
(*注也可以直接下bp LoadLibraryA/he LoadLibraryA 断点,当在堆栈窗口出现MSVBVM60.Dll函数时,为返回时机。)
3、返回后我们会发现在一个kernel32.LoadLibraryA下面有一个长跳,我们要将此长跳改成jmp。
4、再下断点bp CreateThread/bpGetCurrentThreadId,中断后,取消断点,Alt+F9返回,单步执行,看到第一个call edi或call ecx之类call时。F7进入,即到oep。
5、打开import修复,如显示无效函数--CUT就可以了。
二、双线程的标准壳
双线程的要复杂一些。首先要把线程变单,再避开anti,余下的就和单线程标准方式差不多了,但是记得要将Magic Jump恢复。方法如下:
1、双线程变单线程,下断bp OpenMutexA,断下后,记下堆栈窗口中name前的数值。ctrl+g到00401000,将空数据改为如下代码:
0040100060 pushad
004010019C pushfd
00401002 push xxxx(注:此处的xxxx为记下的断下后name前的数值。)
0040100733C0 xor eax,eax
0040100950 push eax
0040100A50 push eax
0040100BE8 E694A677call KERNEL32.CreateMutexA
004010109D popfd
0040101161 popad
00401012- E9 8F9FA777jmp KERNEL32.OpenMutexA
点右键选择重建eip,f9运行,断下后,取消断点, ctrl+g到00401000,恢复修改。
2: 避开Anti
下断点he OutputDebugStringA
断下后,在堆栈窗口出现类似于%s%之类的字符,选中这些字符,在数据窗口跟随,点右键->二进制->使用00填充,中断2次!都如上修改,删除此断点!
3、Magic Jump,避开IAT加密
下断点,bp GetModuleHandleA/he GetModuleHandleA,运行,一般是在堆栈窗口出现ASCII "kernel32.dll"和ASCII "VirtualFree(释放内存的一个函数)后,再运行一次,就是返回时机,中断后alt+f9返回,在KERNEL32.LoadLibraryA下面找到Magic Jump!修改为jmp。往下找到两个salc,在其上面的jmp上下断,Shift+F9,断下!撤消Magic Jump处的修改!打开内存镜像,在00401000段下断,Shift+F9,当出现call edi或call ecx时,f7进入直达OEP。
4、打开import修复,如显示无效函数--CUT就可以了。 天草方法啊...
不过收藏了 支持LZ...
总结得很好 要是能更详细的讲解方便新手就好了... 太复杂,新手不好学 支持下LZ吧 收下这个了 路过!!!!!!!!!!!!!!!!路过!!!!!!!!!!!!!!!!路过!!!!!!!!!!!!!!!! 这么多的好东西,收藏了! 嗯,好东西!
支持顶你一下!
呵呵!
呵呵,学习了 很好.学习了,