【文章标题】: 不使用 ImportREC 来脱 PECompact 2.x 版本的壳
【文章作者】: CCDebuger
【下载地址】: 自己搜索下载
【作者声明】: 只是感兴趣,没有其他目的。失误之处敬请诸位大侠赐教!
--------------------------------------------------------------------------------
【详细过程】
写这篇文章主要是看到了这个求助帖:http://bbs.pediy.com/showthread.php?t=81974,就把里面提到的程序拿来看了一下。这里我把不用 ImportREC 来脱 PECompact 2.x 版本壳的过程写下来,再来一个脱壳脚本,简化一下流程。现在进入正题吧。
载入程序后断 BP VirtualAlloc,两次中断后会返回到这里:
一、区段:
跟进 00EA0C5B 的 CALL:
可以直接按 Ctrl+S 搜索以下命令序列:
MOV R32,DWORD PTR [R32-CONST]
MOV R32,DWORD PTR [R32]
ADD R32,R32
区段:
1000
00281000
00315000
0036D000
0037C000
00387000
00389000
0038A000
0038B000
0038C000
0038D000
0038E000
0038F000
二、输入表:
跟进 00EA0C84 那个处理输入表的CALL:
跟进 00EA1302 处的 CALL:
直接按 Ctrl+S 搜索命令序列:
MOV DWORD PTR [R32],R32
MOV DWORD PTR [R32],R32
会搜到这里:
三、OEP
现在设 BP VirtualFree,F9 断下后删除断点,ALT+F9 返回,在一路 F8,会到这里:
在地址 008C1056 上按 F4,再按一下 F7,就到 OEP 了:
四、修正 dump 文件
现在 dump,修正 OEP 和 IAT 的起始 RVA 和大小即可。OEP = 005DC009 - 00400000 = 001DC009。根据输入表的结构(5 个字段组成,最后以 20 个 0 字节结尾),我们用 16 进制工具如 010Editor 在 dump 后的文件第一个区段中搜索 20 个 0 字节,再结合输入表结构,能很快定位的 IAT 的起始 RVA 和 大小:
31:1058h: 70 1A 31 00 00 00 00 00 00 00 00 00 32 1C 31 00 p.1.........2.1.
31:1068h: 88 18 28 00 D8 1A 31 00 00 00 00 00 00 00 00 00 ?(.?1.........
31:1078h: A0 1C 31 00 F0 18 28 00 80 1A 31 00 00 00 00 00 ?1.?(..1.....
31:1088h: 00 00 00 00 8A 1D 31 00 98 18 28 00 78 1B 31 00 ....?1.?(.x.1.
31:1098h: 00 00 00 00 00 00 00 00 96 1D 31 00 90 19 28 00 ........?1.?(.
31:10A8h: E4 1B 31 00 00 00 00 00 00 00 00 00 CA 1D 31 00 ?1.........?1.
31:10B8h: FC 19 28 00 50 13 31 00 00 00 00 00 00 00 00 00 ?(.P.1.........
31:10C8h: 3C 2C 31 00 68 11 28 00 3C 17 31 00 00 00 00 00 <,1.h.(.<.1.....
31:10D8h: 00 00 00 00 70 39 31 00 54 15 28 00 40 12 31 00 ....p91.T.(.@.1.
31:10E8h: 00 00 00 00 00 00 00 00 82 3D 31 00 58 10 28 00 ........?1.X.(.
31:10F8h: 38 12 31 00 00 00 00 00 00 00 00 00 9C 3D 31 00 8.1.........?1.
31:1108h: 50 10 28 00 C8 1A 31 00 00 00 00 00 00 00 00 00 P.(.?1.........
31:1118h: E0 3D 31 00 E0 18 28 00 E8 11 31 00 00 00 00 00 ?1.?(.?1.....
31:1128h: 00 00 00 00 B4 3E 31 00 00 10 28 00 E0 16 31 00 ....?1...(.?1.
31:1138h: 00 00 00 00 00 00 00 00 BC 3F 31 00 F8 14 28 00 ........?1.?(.
31:1148h: 28 12 31 00 00 00 00 00 00 00 00 00 06 40 31 00 (.1..........@1.
31:1158h: 40 10 28 00 18 17 31 00 00 00 00 00 00 00 00 00 @.(...1.........
31:1168h: AE 40 31 00 30 15 28 00 DC 1B 31 00 00 00 00 00 1.0.(.?1.....
31:1178h: 00 00 00 00 C8 40 31 00 F4 19 28 00 88 1B 31 00 ....1.?(.?1.
31:1188h: 00 00 00 00 00 00 00 00 7C 42 31 00 A0 19 28 00 ........|B1.?(.
31:1198h: 7C 16 31 00 00 00 00 00 00 00 00 00 86 42 31 00 |.1.........1.
31:11A8h: 94 14 28 00 48 13 31 00 00 00 00 00 00 00 00 00 ?(.H.1.........
31:11B8h: 52 43 31 00 60 11 28 00 6C 1B 31 00 00 00 00 00 RC1.`.(.l.1.....
31:11C8h: 00 00 00 00 86 43 31 00 84 19 28 00 00 00 00 00 ....1.?(.....
31:11D8h: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
由此我们知道 IAT 的起始地址 RVA 是 00311058,大小是 190。
写个脚本来完成以上工作,同时也兼容一下 DLL 的脱壳。用脚本跑完后查看一下记录窗口,先把整个表复制出来,再去掉无用的内容,剩下的就是这样:
Log data
地址 消息
区段 RVA = 0038F000
区段 RVA = 0038E000
区段 RVA = 0038D000
区段 RVA = 0038C000
区段 RVA = 0038B000
区段 RVA = 0038A000
区段 RVA = 00389000
区段 RVA = 00387000
区段 RVA = 0037C000
区段 RVA = 0036D000
区段 RVA = 00315000
区段 RVA = 00281000
区段 RVA = 001000
IAT 中某函数的 RVA 地址 = 00311C0A
IAT 可能的结束 RVA 地址 = 003111D4
OEP RVA = 001DC009
脚本已经生成了 dump 文件,保存为 Unpacked.exe,并已修正了 OEP。其它的你就自己填了。
附上脱壳脚本。用脚本脱壳后要对 dump 的文件进行修复,要涉及到一些 PE 知识。不了解的话,请自己找一下讲述 PE 格式的文档参考一下。脚本没经过多少测试,如果有问题,不要打我,呵呵
--------------------------------------------------------------------------------
【版权声明】: 本文纯属技术交流, 转载请注明作者并保持文章的完整, 谢谢!