cnpaf.net - 中国协议分析网

投递文章 投稿指南 RSS订阅 网站通告:
搜索: 您的位置主页>网络安全>工具使用>阅读文章

对PECompact.exe v1.34的手动脱壳(1)

12-20 13:45 来源: 作者: 【 评论:0 浏览:
目标程序:PECompact.exe 35,840 v1.34 脱壳
程序下载:http://www.cnvnet.com/download/d/pecsetup.exe
使用工具:SoftICE 4.00; ProcDump 1.6.2; IceDump 6.0.1.5; HexWorkShop;

(补充一句:以下Import table我称作输入表,可能说法不规范,不过我打习惯了,大家原谅一下)
(注:以下文中数字为十六进制)
分析:
运行ProcDump,点击Pe-Editor按钮,选中PECompact.exe,得到程序内存映象大小:Size of Image为 00031000和基地址Image Base为0040000。然后点击Sections,没有发现.idata这样容易识别的输入表Section,
看来找输入表的地址和大小也将成为重点了。

首先我们来抓取Import table
1、先装载IceDump。到IceDump目录中运行相应SoftICE版本的icedump.exe。(比如我用的SoftICE版本为4.00就到win9x/400目录下运行icedump.exe)
2、运行SoftICE的Loader,加载PECompact.exe。
3、Ctrl-D进行SoftICE,如下设置断点
bpx loadlibrarya do "dd esp->4"
(注:在没有明确的输入表地址的情况下,这不失为找输入表地址的一种好办法)
4、按F5回到Windows中,单击Loader中的Load按钮。程序中断在第一条指令处。进入了SoftICE。
(看来PECompact.exe不象受Asprotect保护的程序那样。无法用SoftICE自动中断在第一条指令处)
5、按F5运行程序。又中断在我们设下的中断Loadlibrarya处。看看数据窗口。显示如下:

0030:004171AE 4E52454B 32334C45 4C4C442E 4C000000 KERNEL32.DLL...L
0030:004171BE 4C64616F 61726269 00417972 65470000 oadLibraryA...Ge
0030:004171CE 6F725074 64644163 73736572 56000000 tProcAddress...V
0030:004171DE 75747269 6C416C61 00636F6C 69560000 irtualAlloc...Vi
0030:004171EE 61757472 6572466C 00000065 74697845 rtualFree...Exit
0030:004171FE 636F7250 00737365 72460000 694C6565 Process...FreeLi
0030:0041720E 72617262 00000079 4D746547 6C75646F brary...GetModul
0030:0041721E 6E614865 41656C64 47000000 6F4D7465 eHandleA...GetMo
0030:0041722E 656C7564 656C6946 656D614E 9D8B0041 duleFileNameA...
0030:0041723E 004020A6 20AA9D3B 01750040 0CB58BC3 . @.;.. @.u.....

6、根据经验,一般第一次是脱壳代码自己的函数库的加载。并不是我们需要的输入表。因此,按F5继续执行程序。程序又一次中断,这一次数据窗口显示如下:

0030:0040D4A0 4E52454B 32334C45 6C6C642E 49444700 KERNEL32.dll.GDI
0030:0040D4B0 642E3233 55006C6C 33524553 6C642E32 32.dll.USER32.dl
0030:0040D4C0 4441006C 49504156 642E3233 49006C6C l.ADVAPI32.dll.I
0030:0040D4D0 4547414D 2E504C48 006C6C64 646D6F63 MAGEHLP.dll.comd
0030:0040D4E0 3233676C 6C6C642E 45485300 32334C4C lg32.dll.SHELL32
0030:0040D4F0 6C6C642E 41434A00 2E31474C 006C6C64 .dll.JCALG1.dll.
0030:0040D500 696C7061 6C642E62 00F4006C 4C746547 aplib.dll...GetL
0030:0040D510 45747361 726F7272 01A70000 65766F4D astError....Move
0030:0040D520 656C6946 01160041 50746547 41636F72 FileA...GetProcA
0030:0040D530 65726464 00007373 655201CB 6F436461 ddress....ReadCo

可以看到偏移地址为40D4A0,根据我们对输入表的知识,(具体原理说明可以看看雪教学中的"脱壳高级篇"中的文章,那里面比我说得清楚多了)我们可以搜索内存映象中的字节A0,D4,00,00。(即00D4A0=40D4A0-400000)来确定输入表的位置。下指令

s 30:400000 l ffffffff A0,D4,00,00

7、搜索的结果显示

Pattern found at 0030:0040D00C (0000D00C)

我们用如下指令来定位到输入表的起始位置(当然目前还不能确定就是输入表)

dd 0040D00C-C

如下为数据窗口的显示结果。

0030:0040D000 0000D0C8 00000000 00000000 0000D4A0 ................
0030:0040D010 0000D2B4 0000D1A0 00000000 00000000 ................
0030:0040D020 0000D4AD 0000D38C 0000D1CC 00000000 ................
0030:0040D030 00000000 0000D4B7 0000D3B8 0000D260 ............`...

现在我们来看看到底是否我们要找的输入表。下指令
dd 40D0C8

显示结果如下:
0030:0040D0C8 0000D50A 0000D51A 0000D526 0000D538 ........&...8...
0030:0040D0D8 0000D548 0000D556 0000D564 0000D57A H...V...d...z...
0030:0040D0E8 0000D58C 0000D59E 0000D5B4 0000D5C2 ................
0030:0040D0F8 0000D5D2 0000D5DE 0000D5F4 0000D5FE ................

继续追踪,下指令
db 40D50A

显示结果如下:
0030:0040D50A F4 00 47 65 74 4C 61 73-74 45 72 72 6F 72 00 00 ..GetLastError..
0030:0040D51A A7 01 4D 6F 76 65 46 69-6C 65 41 00 16 01 47 65 ..MoveFileA...Ge
0030:0040D52A 74 50 72 6F 63 41 64 64-72 65 73 73 00 00 CB 01 tProcAddress....
0030:0040D53A 52 65 61 64 43 6F 6E 73-6F 6C 65 41 00 00 31 00 ReadConsoleA..1.

(以上说这么多,只是为了说明找输入表的方法的具体实现过程,原理在各位高手的"脱壳高级篇"已经说得很详细了)
OK,符合输入表的规范。看来这就是我们要找的输入表了。我们还要确定一下输入表的长度,在数据窗口中向下翻页。直到发现大量的0x00字节。确定一下长度为C40字节。(这次就不Dump窗口看了,写到这里我开始怀疑我这篇又臭又长的文章不知道要写多长,大家还没有看着看着睡着了吧 :-) )

收藏此篇文章内容到:
Tags:
责任编辑:
  • 请文明参与讨论,禁止漫骂攻击。 用户名:新注册) 密码: 匿名:
    评论总数:0 [ 查看全部 ] 网友评论
    关于我们 - 广告合作 - 网站地图 - 版权说明 - 网站历史 - 世界排名 - 加入收藏 - 设为首页 - 返回顶部