脱壳后的文件一般都要比原来肥了不少,给文件减肥其实就是把壳和一些垃圾数据切除掉。在yesky1的《脱壳后软件减肥大法》启发下,得出减肥的一般步骤:
1.找出多余的区块
2.利用PE工具,如Peditor,删除多余区块
3.利用Hex编辑器,如Hex Workshop,删除多余区块在文件所对应的部分
4.修正区块表属性和数据目录表
a.修正区块表属性原则:要保持各个区块虚地址和文件偏移与上一个区段虚地址和文件偏移首尾相连,否则会弹出非法PE文件的警告。
b.数据目录表的修正要看需要而定,比如,我们把重定向区块删除了,就要相应把数据目录的重定向数据清零。
上面的都是个人对yesky1方法的总结,具体原理请看原文。在这里我要介绍的方法是利用LordPE的split/unsplit功能给文件减肥。
废话少说,马上进入主题。在这里我们拿win2000下面的notepad.exe开刀,首先用Armadillo v3.75给它加个标准壳,然后把它脱掉(Armadillo标准壳脱文随处可找,熟手的话一两分钟就搞定)。这是原文件的区块表:
这是脱壳后的区块表:
前后比较一下可以看到文件肥了差不多13倍!其中.text1 .adata .data1 .pdata 都是多余区块(.mackt是ImportREC修复IAT产生的)。在这里我们有原文作比较当然一目了然就知道那些区块是多余的,但是往往我们搞crack哪可能有原文件(废话,有了还要脱壳干嘛~~)。
其实要判断某个区块是否多余很简单:用OllyDbg加载脱壳文件后对该区块下访问中断(在“内存”窗口选上该区块,然后按F2)
然后按F9运行,如果程序没有中断,并运行正常,就说明该区块是多余的。
找到了所有多余区块后,就可以开刀切了。我们用LordPE的PE Editor打开脱壳文件,进入区块表窗口,右键点split:
这样LordPE就把文件按区块切成一个个单独文件:
其中0header.LPE是文件头,1_text.LPE是区块.text,2_data.LPE是区块.data ...
接下来我们把之前找到的多余区块所对应的.LPE文件清零,结果如下:
清除了多余数据后我们需要做的只是把这些切割的文件组装回PE文件:同样的用LordPE打开脱壳文件,进入区块表窗口,这回我们右键点unsplit,选择上面split.ini文件,这时生成的文件就是减肥后的文件,看看:
只有68k,与原来的49.7k相比已经比较接近了。
这是减肥后的区块表:
当然如果我们不想看到那些Rsize == 0的区块.text1 .adata .data1 .pdata,大可以把它们删掉,然后按首尾相连的原则修复区块表。
在这里我们不但可以把split后多余区块文件清零,还可把一些区块尾部的空隙给切掉,进一步减少文件大小。注意,只能是切掉尾部的空隙,对于文件头部和中间空隙的切除需要调整整个程序的参考地址,工作量大,需要专门设计的程序来完成。
后记:该方法没什么技术含量,原理是yesky1的《脱壳后软件减肥大法》,只是操作起来比较方便简单而已。这些东西在各大侠眼里也许是不值一提的东西,所以没有写成教程的必要,小弟捡漏把它成文,希望对入门的人有点用处。
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)