标题:对PECompact加壳的DLL脱壳的一点分析 (7千字)发信人:ljttt时间:2000-8-17 8:49:23详细信息:对PECompact加壳的DLL脱壳的一点分析【声明】我写文章以交流为主,希望大家在转载时能保持文章的完整性。
【前言】目前,我对DLL的脱壳的了解也不多,相信有些地方会和对EXE的脱壳大致相同。
现在我知道的主要不同是必须要在DLL的空间开始跟踪。
否则从EXE开始跟踪,那还不把人累死。
另外 ProcDump 和 PEditor 之类的工具好象还无法自动修复DLL的import table。
唉,又是手动,什么时候有个DLL的脱壳机出现呢?ou,别看我!我编程的水平三流,写不出那些好东东。
样例文件: dlcsp32.dll (DynaDoc Reader v3.01所带动态链接库文件,这个程序就是看.wdl电子图书文件的那个)加壳方式: PECompact v1.41b1加壳检测工具:和尚头上的虱子-----明摆着的嘛调试工具: SoftICE v4.05,PEditor v1.5,Hex WorkShop 2.10目标:脱壳作者: ljttt写作日期: 2000-08-161、首先当然要分析基本信息了。
用PEditor打开动态链接库文件,得到如下信息Entry Point: 00024000Image Base: 10000000Size of Image: 00029000Section Virtual Size Virtual Offsetpec1 00020000 00001000pec2 00003000 00021000.pec 00004000 00024000.rsrc 00001000 00028000再来看看import table和export table的情况,export table没有改变。
问我怎么知道?有未加壳的DLL 嘛。
西西。
2、现在我们要想办法在动态链接库的入口点 10024000 处中断,当然方法很多了,这里介绍两种办法。
①、第一种方法一、首先,用PEditor打开DLL文件,然后单击 FLC 按钮(这个功能是帮你计算Virtual Address转换为Offset的)输入 10024000 ,单击 DO! 按钮,得到 Offset[hex] 为 B000。
二、然后,用Hex WorkShop打开DLL文件,定位到 B000,记下此处字节的值 EB。
三、然后,用PEditor打开Dlview32.EXE(主程序文件)。
单击 break'n enter 按钮(这个功能是帮你在程序的某个地址空间设下int 3中断),在 Virtual Address 中输入 10024000。
四、Ctrl-D中断进入SoftICE,设断点 bpint 3。
五、F5回到Windows,单击break'n enter窗口中 RUN 按钮。
这样我们将在动态链接库的第一条指令处中断。
②、第二种方法一、同第一种方法二、同第一种方法三、然后,用Hex WorkShop把 B000 处的字节 EB 改为 CC。
四、同第一种方法五、运行程序。
这样我们也可以在动态链接库的第一条指令处中断。
这里,我用第一种方法。
我们现在中断在第一条指令处。
但是还不能继续跟踪。
要把 CC (即int 3指令)改为原来程序的代码。
(简称说明: EP: Entry Point, OEP: Orginal Entry Point, RVA: Relative Virtual Address )代码窗口显示如下:015F:10024000 CC INT 3 <---中断在此,这就是我们要改回的字节015F:10024001 06 PUSH ES015F:10024002 6810DE0000 PUSH 0000DE10 <---有点奇怪哦? DE10 不是我们要找的 OEP 吗,怎么在这里就出现了?难道不用找了?015F:10024007 C3 RET015F:10024008 9C PUSHFD015F:10024009 60 PUSHAD015F:1002400A E802000000 CALL 10024011015F:1002400F 33C0 XOR EAX,EAX015F:10024011 8BC4 MOV EAX,ESP015F:10024013 83C004 ADD EAX,04下指令eb eip EB (修改当然 IP 所在地址的字节为 EB)好,代码显示成原来的模样了。
015F:10024000 EB06 JMP 10024008 <---代码复原后015F:10024002 6810DE0000 PUSH 0000DE10 <---奇怪?015F:10024007 C3 RET==> 10024008 9C PUSHFD015F:10024009 60 PUSHAD015F:1002400A E802000000 CALL 10024011015F:1002400F 33C0 XOR EAX,EAX015F:10024011 8BC4 MOV EAX,ESP015F:10024013 83C004 ADD EAX,043、这样代码就复原了。
不过你发现一点问题没有? DLL的 OEP 怎么会在这里就出现了?好奇怪?!先不管它,设个断点留着看看。
设断点bpx 100240024、设断点bpx loadlibrarya do "dd esp->4" (老一套了)5、按 F5 继续,又中断在我们新设的断点。
我们来看一下数据窗口显示如下:015F:1002041A 4E52454B 32334C45 6C6C642E 00000000 KERNEL32.dll....-015F:1002042A 656C6552 44657361 00000043 44746547 ReleaseDC...GetD015F:1002043A 53550043 32335245 6C6C642E 00000000 ER32.dll....015F:1002044A 656C6544 624F6574 7463656A 00000000 DeleteObject....哦,这里看来就是我们要找的import table的一部分了。
6、继续搜索,下指令s 30:10000000 l ffffffff 1A,04,02,00 (这里就不多说了,和《脱壳----对用Petite2.2加壳的程序进行手动脱壳的一点分析》一文中所说的情况相同,所以搜索方法也一样了。
以后几步同理)搜索结果显示如下:Pattern found at 0030:1002000C (0002000C)7、下指令dd 1002000C-C数据窗口显示如下:0030:10020000 000200DC 00000000 00000000 0002041A ................-0030:10020010 00020270 000201D8 00000000 00000000 p...............0030:10020020 0002043C 0002036C 00020050 00000000 <...l...P.......8、这样到了import table的起始处了。
现在开始保存import table。
/dump 10020000 1000 c:\temp\dump.bin (1000 的长度是根据 00 字节的位置来确定的)9、下指令 BD 2 禁止 bpx loadlibrarya 中断,继续跟踪。
到如下015F:10025335 51 PUSH ECX015F:10025336 53 PUSH EBX015F:10025337 6A00 PUSH 00015F:10025339 FFD0 CALL EAX015F:1002533B FFA55E854000 JMP [EBP+0040855E]015F:10025341 8BB54E854000 MOV ESI,[EBP+0040854E]015F:10025347 8BBD52854000 MOV EDI,[EBP+00408552]015F:1002534D E82E0C0000 CALL 10025F80015F:10025352 61 POPAD015F:10025353 9D POPFD015F:10025354 50 PUSH EAX015F:10025355 6810DE0010 PUSH 1000DE10 <--- 1000DE10 - 10000000 = DE10 就是 OEP 了015F:1002535A C20400 RET 0004 <--- 这里就要到回到真正的入口处了,在此停下。
保存映象10、记下 OEP 为 DE10。
下指令保存整个DLL内存映象。
/dump 10000000 29000 c:\temp\dump.dll11、按 F5 继续,没有中断在我们在步骤 3 处设下中断。
关闭主程序时,中断。
正好在此处中断。
显示如下:015F:10024000 EB06 JMP 10024008015F:10024002 6810DE0000 PUSH 1000DE10 <---开始中断时的 0000DE10 这时已经变成 1000DE10 了。
015F:10024007 C3 RET==> 10024008 9C PUSHFD015F:10024009 60 PUSHAD015F:1002400A E802000000 CALL 10024011015F:1002400F 33C0 XOR EAX,EAX015F:10024011 8BC4 MOV EAX,ESP015F:10024013 83C004 ADD EAX,04看来此处的几条指令的用处PECompact是别有用意安排的,可能是为了方便去卸载动态链接库吧。
12、开始修补工作。
用PEditor打开dump.dll文件,选择sections,右键打开菜单,选择dumpfixer。
OK!一次完成所有Section的RVA、Size的转换工作。
再修改Entry Point为 DE10,单击apply changes保存,选择directory,修改其中的Import Table的RVA为 20000,Size为1000。
单击保存。
13、用Hex WorkShop打开dump.dll和dump.bin,定位dump.dll位置到 20000,选择 1000 个字节。