资源预览内容
第1页 / 共7页
第2页 / 共7页
第3页 / 共7页
第4页 / 共7页
第5页 / 共7页
第6页 / 共7页
第7页 / 共7页
亲,该文档总共7页全部预览完了,如果喜欢就下载吧!
资源描述
近日对Armadillo 壳很感兴趣,缘于它的多种组合的变化,但认真看来,其保护的解决方法又有相对固定。方法无外乎那么几种脱壳方法固然排解有key 和 cc),本人在本论坛已对标准壳的脱壳方法发贴,但后来有所更,干脆总结在一块吧,以便利大家。大家可以复制 下来,放在手边,脱壳时按步骤来。我还是一小鸟,同大家一样在渐渐成长中,有不对的地方和不成熟的地方,望大家批判指正,共同进步。一、根本学问: 该壳有如下保护:(1) Debug-Blocker(阻挡调试器)-解决方法就是无视全部特别,隐蔽好 OD,假设加载时,老出错,就多换几个OD 试试。(2) CopyMem-II(双进程保护)-解决方法是:用手动或者脚本使双变单。(3) Enable Import Table Elimination(IAT 保护) 解决方法是用工具 ArmaDetach 再次载入加壳程序,登记子进程ID,用另一OD 载入,利用断点GetModuleHandleA,找到Magic J ump,修改Magic Jump,得到正确的IAT。(4) Enable Strategic Code Splicing(远地址跳) ,解决方法就是用Arminline 工具。(5) Enable Nanomites Processing(简称 CC),就是把一些retn 代码变成CC(INT 型),解决方法:用Arminline 工具或Enjoy 工具。(6) Enable Memory-Patching Protections(内存保护)二、脱此类壳常用的断点:1、WaitForDebugEvent(用于查找非标准OEP 和做补丁用) 2、WriteProcessMemory(用于查找非标准OEP)3、DebugActiveProcess(找子程) 4、OpenMutexA(双进程转单进程) 5、GetSystemTime(补丁KEY)6、VirtualProtect(用于 5.x)7、CreateFileMappingA(用于 5.x)8、GetModuleHandleA/LoadLibraryA (用于找 Magic Jump) 9、CreateThread(查找OEP)三、种类及脱壳方法说明:对于此壳一般要隐蔽OD。假设按以下方法下断OD 断不下来,出错,就多换几个OD 试试,在我脱壳中,就有个状况,下断点后,老断不下来,多换了几个OD 就成功了。一单线程标准方式具体方法:2 次断点法加修改Magic Jump。1、找Magic Jump方法有二:方法一、下断点 Bp GetModuleHandleA/he GetModuleHandleA/bp GetModuleHandleA+5/ he GetModuleHandleA+5,按 shift+f9 运行,当经过一个 call 缓冲有点大时,一般是在堆栈窗口消灭ASCII “kernel32.dll“和ASCII “VirtualFree后“,再运行一次,消灭“kernel32.dll“,就是返回时机,取消断点,按alt+f9 执行到返回。方法二、也可以下bp LoadLibraryA 断点,当在堆栈窗口消灭MSVBVM60.Dll 函数时,返回时机,在kernel32.LoadLibraryA 下面有一个跳转,一般状况下,这个跳转比较大的话, 就改为jmp,而跳转比较小的话,就改nop)。注:下此断点的目的是找到Magic Jump, 修改 Magic Jump 目的是避开的IAT 的加密。2、找 OEP下断点bp GetCurrentThreadId/bp CreateThread,shift+f9 运行,中断后,取消断点,Alt+ F9 返回,单步执行,看到一个call edi 之类的。F7 进入,即到oep。OD 不要关!翻开im port-选择进程-OEP 输入va-自动搜寻 IAT-猎取输入表-显示无效函数-CUT!(二) 双线程的标准壳总体步骤:1、要双变单;2、处理IAT,修改 Magic Jump; 3、查找OEP;4、修复1、双变单,方法有三。方法一:PATCH 代码法下断 bp OpenMutexA,断下后,ctrl+g 到 00401000,将空数据改为如下代码:0040100060pushad004010019Cpushfd0040100268 A0FD1200push xxxx 注:此处的 xxxx 为断下后mutex name 前的数值。0040100733C0xor eax,eax 0040100950push eax0040100A50push eax0040100BE8 E694A677call KERNEL32.CreateMutexA 004010109Dpopfd0040101161popad00401012- E9 8F9FA777jmp KERNEL32.OpenMutexA点右键选择重建eip,f9 运行,断下后,取消断点, ctrl+g 到 00401000,恢复修改。方法二,下断点:bp OpenMutexA,SHIFT+F9,断下后, ALT+F9 返回,返回后,将返回代码下面的第一个跳转改为相反跳转,再次SHIFT+F9,断下后,ALT+F9 返回,再次将返回代码下面的第一个跳转改为相反跳转。然后再一次SHIFT+F9,取消断点,至此,同样,双进 程转单进程完毕!方法三、除了用双变单的脚本外,还可以用一个工具ARMADETACH,将带壳的程序拖入, 登记子进程的ID。2、处理IAT,修改Magic Jump。用 OD 附加该子进程,加载后,ALT+F9 返回,修改前两个字节为加壳程序载入时的前两个字节。下断点bp GetModuleHandleA, Shift+F9 运行,一般是在堆栈窗口消灭ASCII “kernel32. dll“和ASCII “VirtualFree后“,再运行一次,消灭“kernel32.dll“,就是返回时机,中断后 alt+f9 返回,在KERNEL32.LoadLibraryA 下面找到M agic Jump!修改为jmp。再下断点bp GetCurrentThreadId/bp CreateThread或往下拉找到两个salc,在其上面的jmp 上下断,Shift+F9,断下!假设文件有校验,则要撤消Magi c Jump 处的修改!翻开内存镜像,在 00401000 段下断。运行,中断后,删除断点,alt+f 9 返回,F8 单步走,到第一个CALL ECX 之类的东西时,F7 进入。到oep。注:对于有些OD 有一个字符串溢出漏洞,尽量用一些修正些错误的OD,有些程序需要处理Anti,方法如下:下断点he OutputDebugStringA断下后,选中%s%之类的字符,在数据窗口跟随,点右键二进制使用 00 填充,中断 2 次!都如上修改,删除此断点!3、修复。三CopyMem-ll +Debug-Blocke 保护方式1、先找OEP,两个断点。1断点bp WaitForDebugEvent,运行,中断后看堆栈,在一行有“pDebugEvent”字样的那一行右键点击“数据窗口跟随”,取消断点。2bp WriteProc essMemory,运行,中断后,在数据窗口要地址显示觉察oep。2、patch 代码,解码。方法:重载入,bp WaitForDebugEvent,运行,中断,取消断点, alt+f9 返回,CTRL+F 搜寻命令:or eax,0FFFFFFF8,找到后,先往上看,可以看到两个CMP,一个是“cmp dword ptr ss:XXXX,0”在这里下硬件执行断点,Shift+F9 运行,中断后取消断点。这时看信息窗口:SSXXXXX=00000000,假设这个值不为 0 的话,需要将其清 0,假设为 0 就不用了。其次个CMP,cmp ecx,dword ptr ds:XXXX,下面开头解码。在这里要登记几个地址:1cmp dword ptr ss:XXXX,0 前的地址和内的值。2其次个 CMP 中中的值。接着or eax,0FFFFFFF8 处往下,可以找到一处为and eax,0FF 的代码,从这里开头Patch,代码如下:inc dword ptr ds: /第一个 CMP 内的值mov dword ptr ds:XXXX+4,1 /XXXX 为其次个CMP内的值jmp XXXX /第一个 CMP 前的地址修改好后,去掉全部断点,向下找到第一个 CMP 下面的跳转所跳到的地址,来到这个地址, 下硬件执行断点,Shift+F9 运行,此时代码解压完毕,可以脱壳。3、脱壳。运行LordPE,将子进程dump 出来,这里的子进程就是LordPE 第 2 个进程(有 2个同名进程)。Dump 后用LordPE 修改入口点为在第一步中查到的OEP。4、修复输入表、IAT 的查找脱壳后不要急着去修复输入表,得先把RVA 数据猎取,用OD 载入Dump 出来的程序,右键搜寻二进制字符串,输入FF25,找到一个函数,在数据窗口跟随,在数据窗口向上找到 全是 0 的地方,登记地址,再向下找到全是0 的地方,登记地址。5、加载子程序。(1) 找子程序pid 的方法有二:方法一:用OD 载入原程序脱壳前的程序,下断点:bp DebugActiveProcess,中断后看堆栈,登记Processid 后面的值这个值不是每次都一样的。OD 不要关。其次种方法就是用工具ArmaDetach,将加壳程序拖入。登记子程序的pid 和前两个字节。(2) 另开一个 OD,附加Processid 后面的值进程或用工具ArmaDetach 所登记的进程 id,附加后,ALTF9 返回程序,将前两个字节改为原程序载入时的前两个字节。6、下面的做法就和标准壳的一样了,在附加的OD 中: 双变单:方法有二。其一:patch 法。其二修改跳转法。方法一:下断点BP OpenMutexA双变单,F9 运行,断下后,ctrl+g 到 00401000,将空数据改为如下代码:0040100060pushad004010019Cpushfd00401002 68 A0FD1200 push xxxx 注:此处的 xxxx 为断下后name 前的数值。 00401007 33C0xor eax,eax00401009 50push eax0040100A50push eax0040100BE8 E694A677call KERNEL32.CreateMutexA004010109Dpopfd0040101161popad00401012- E9 8F9FA777jmp KERNEL32.OpenMutexA点右键选择重建eip,f9 运行,断下后,取消断点, ctrl+g 到 00401000,恢复修改。方法二:下断点BP OpenMutexA,SHIFT+F9 运行,断下后,ALTF9 返回,返回后,将返回代码下面的第一个跳转改为相反跳转,再次SHIFT+F9,断下后,ALT+F9 返回,再次将返回代码下面的第一个跳转
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号