前面发了一篇关于壳的文章,有些网友提出有抄袭涉嫌,其实脱壳中的方法也不外乎那几种,并且所发文章已注明是分享而不是原创,只是自
己看了一些文章和一些视频,当然也包括天草(三人行)等大侠的视频。借用白云大妈在春晚上的一句话:人一出生不是跑步出来的。学习总
是要有一个过程的,大家可能都知道如何找关键跳和关键call,各种语言找的方法也有多种,那你在依据前人总结的方法使用时,是不是也叫抄
袭。一个人的水平是有限的,所谓的创新吾辈是达不到的,本栏目是新兵论坛,高手也不会进来谈论高深的知识,面对如我等的新人,把自己
的一些学习心得与大家分享不易乐乎?要知道独乐乐不如众乐乐。好了,不说废话了,今天谈的是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,将空数据改为如下代码:
00401000 60 pushad
00401001 9C pushfd
00401002 push xxxx (注:此处的 xxxx为记下的断下后name前的数值。)
00401007 33C0 xor eax,eax
00401009 50 push eax
0040100A 50 push eax
0040100B E8 E694A677 call KERNEL32.CreateMutexA
00401010 9D popfd
00401011 61 popad
00401012 - E9 8F9FA777 jmp 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就可以了。
关于非标准的壳及加壳中一些组合因为过程较为复杂,在随后的总结中会与大家共享的。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)