【文章标题】: RLPack 加壳的 Armadillo find protected 1.8
【文章作者】: CCDebuger
【下载地址】: 自己搜索下载
【作者声明】: 只是调试时的笔记,权当灌水。
--------------------------------------------------------------------------------
【详细过程】
原版加了 RLPack Full Edition 的壳,啥版本我不大清楚。在我的 Symantec AntiVirus 企业版下会报毒,只好脱掉。
虽然 RLPack Full Edition 应该是个压缩壳,不过这个 Armadillo Find Protected 1.8 加的壳在 OD 里跑的话还会出错,原来是检测到了调试器。来看看怎么把这个壳去掉吧。这玩意我还试用了 Syser Debugger 来脱的,本来也想把用 Syser Debugger 脱的过程加进去,不过嫌烦,就没写了。改天有空再写吧。
一、寻找 OEP
先用 OD 载入程序看看,因为是压缩壳,OEP应该很好找,根据成对的 PUSHAD、POPAD,上下翻翻就行了:
--------------------------------------------------------------------------------------------------
二、干掉调试器检测
程序检测到调试器时应该有个对话框,不过这个对话框你看不到,只听见一声响,就是个系统常见的应用程序错误,然后退出。现在重新载入程序,设断 BP MessageBoxA,F9 运行,会被断下,看堆栈:
我们在汇编窗口中转到 004167F0 处,往上看看,很容易就知道哪里能跳过这个对话框:
到这壳的调试器检测应该就解决了。
检测调试器的代码:
--------------------------------------------------------------------------------------------------
三、去除输入表加密
这个壳还会加密输入表,我们先去掉调试器检测,跑到 OEP 去看看:
我们在数据窗口中转到 00406110 处,上下翻翻,就知道输入表是从 00406000 处开始的。现在用 OD 重新载入程序,在数据窗口中转到 00406000,设内存写入断点,F9运行,会被断下:
继续 F9,输入表会解开,跑到了前面我们设的检测调试器的那个硬件断点那。修改一下标志位,不让壳检测到调试器,继续 F9:
这时候有两种方法:
1、知道了加密输入表 CALL 的位置,重新用 OD 载入程序,NOP掉加密的 CALL,就可以得到完整的输入表,然后到 OEP dump,用 ImportREC 重建输入表。不过这种方法我不大推荐,我推荐下面第二种方法。
2、当我们断在 004156C7 处时,我们在数据窗口中看一下 00406000 处的内容,查看方式选“长型->地址”:
这个一看就是原始的输入表,那还等啥?直接用 LordPE 修正镜像大小,然后 dump。用 PETools 的编辑工具把 dump 程序的 OEP 改成 00034DC,再用 010editor 之类的16进制编辑工具定位到偏移 6000 处,根据 IAT 最后以20个0结束,就可以确定输入表的开始地址和大小了。往下搜索有二十个 HEX 值 0,根据找到的最近位置,很容易就确定了 IAT 的 RVA 是 000093AC,大小是 50。在PE 编辑工具中填上我们上面得到的值,现在输入表就修复好了,根本不需要使用 ImportREC。同样发现输入表都解开后才检测调试器的,这样一来,连避开调试器检测都不需要了,到检测调试器前就可以 dump 来修正了。
--------------------------------------------------------------------------------------------------
三、脱壳后的优化
要了解一下原来没加壳的程序有几个区段的话,只要重新载入程序,BP VirtualProtect,F9 运行,注意看堆栈就可以了:
剩下其他的都是垃圾了,按上面显示的重建一下各个区段,按 1000 对齐,偏移 F000 后面的都可以删掉。附上脱壳后的程序,界面处理了一下,使字体显得好看点。
--------------------------------------------------------------------------------
【版权声明】: 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!