<
壳及脱壳的一些基本办法(二)
>
上一篇

前端的初步学习
下一篇

花指令(一)
反Dump技术的绕过,重建输入表

上一篇的一些技巧在加密壳面前大概率得扑QAQ 跟个这篇就不会扑了样的

Anti-Dump的绕过

纠正SizeOfImage

​ 有些程序dump出来后完全废了比如这个亚子

Y2ljHK.png

​ 在Dump文件时,一些关键参数是通过MODULEENTRY32结构的快照获得的,因此,可以在 modBaseSize和modBaseAddr字段中填入错误的值,让Dump软件无法正确读取进程中的数据。经测 试发现,如果修改系统中modBaseAddr的值,会使系统出现问题,所以只能修改modBaseSize的值。

​ 如此,使得使用MODULEENTRY32函数得到的进程映像大小改变,让Dump软件得到无用的文件。

​ 解决方法:利用LordPE内置的‘correct ImageSize’解决。

Y2tHI0.png

​ 找到进程-右键-correct Image

修改内存属性

​ 有些软件使用VirtualProtect函数将PE文件头设为不可读。运行 后,用LordPE进行Dump操作会报错(Couldn’t grab process memory.)

​ 解决方法:用OD在PE头设置为完整权限。

​ OD载入-alt+m打开内存镜像-找到PE头

Y21zq0.png

​ 右键-set access-full accesss

Y23lJe.png

​ 绿了就OK

重建输入表

原理

​ 加密外壳绝大部分会破坏原程序的输入表,因此脱壳过程中重建输入表很重要。

​ 本来程序的PE 文件运行时将初始化输入表,初始化完后整个输入表结构是这个样子的:

Y23Dzj.png

​ 初始化完后,IAT结构用于保存API的实际地址,所以其他结构不再重要,于是加壳时候把除了IAT之外的全部删掉,重建输入表就是根据IAT来还原整个输入表。

步骤

有的时候,Dump出来的时候不能正常运行,是因为还有一个输入表没有进行处理,一些加密壳会在IAT加密上面大做文章,用HOOK - API的外壳地址来代替真是的IAT的地址,让脱壳者无法正确的还原程序的原始IAT,使得程序不能被破解,所以我们处理这些被加密IAT的地址的办法是找到加密这些IAT的地址的跳转(就是Magic Jump),将它修改为强制跳转(JMP),使之无法加密IAT,从而达到脱壳修复的目的。

先找IAT

一般程序的IAT是连续排列的,以一个DWORD字的0 作为结束,因此,只要确定IAT的一个点,就能获得整个IAT的地址和大小。

​ 程序中的每一个API函数在IAT里都有自己的位置,这样,无论在代码中调用一个输入函数多 少次,都会通过IAT中的同一个函数指针来完成。要确定IAT的地址,就要先看看程序是怎样调用 输入函数的。一种情况是像下面这样,直接调用[405028]中的函数,地址405028h位于IAT中,指 向 GetVersion 函数。

00401156 FF15 28504000 call dword ptr [405028];kernel32.GetVersion

​ 另一种API调用像下面这样,通过call指令把控制权转交给一个子程序,由子程序中的jmp指令跳转到IAT中的0050D330h处。

0040109D E8 F4DF0A00 call 004AF096

004AF096 FF25 48D35000 jmp dword ptr [50D330];kernel32.GetProcessHeap

​ 一般利用OD找IAT. 找到以上句式-右键follow in dump-memory address-翻数据窗口

-IAT起始地址00结束,IAT末端数据00 00 00 00.

​ 记录起止地址。

再利用ImportREC修复

​ 利用ImportREC输入程序的OEP和刚刚得到RVA和大小,点击获取输入信息,修复转存,抓取DUMP的程序,进行修复。

Y2yb2n.png

​ 注意:目标文件已被Dump,且另存为另一个文件,而且目标文件在运行。

Top
Foot