PE脱壳后,文件长度一般会增大,原因有以下几点:
1、脱壳后,壳的尸体依然存在;
2、脱壳后,重新建立了新的Import节、Reloc节等;
3、有些加壳程序,将原程序的某些节跟外壳增加的某些节合并后,搬移到了其他位置。
4、脱壳时候,因为采用的是dump内存,所以,在内存中对齐的PE镜象一般也会大于原始的PE文件,各个节的dump实际尺寸也会较原始PE文件的实际尺寸大。
解决方案:
(1) 脱壳后,将各个有效的节分别转存到临时文件中。如:将“.text节,单独转存到一个text_tem.bin中”,其它节也是同样暂存到各个文件中,没有用的节(如壳尸体),抛弃掉。
(2) 首先将text_tmp.bin等节中没有用的多余部分去掉,一般是最后对齐的内存镜象的多余部分。可以通过2进制编辑器,查看最后部分,一般是全00的部分。
(3) 对应有多少个有效section,重新构造PE头,尽量做到最小。
(4)
重新构造PE:将新的PE头、.text、.Import、.Export、.Data、..reloc等一次连接起来到一个新的PE文件。如果为了尽量
缩小PE尺寸,连接前还可以考虑将某些节合并成一个节(如:将.Data,.Import,.Export,.Reloc等合并到一个节中)。
(5) 按照PE格式,调整新的PE文件。这个过程比较复杂,包括:
1、按照新的PE头中节的队齐要求对齐各个节的起始RVA
2、对于各个节中RVA相关的地方,根据新的PE头重新计算并调整。如
资源节中的各个RVA,Reloc中对应的重定位项,import和export中
的某些地址指针等。
3、按照文件对齐要求对齐新的PE文件。
(6) 测试新的PE,如果有错误,通过跟踪调试,重新执行第(5)步骤,直到正常运行。
对于(5)中调整相关的RVA,可以通过写一个工具完成,如计算调整资源节、Reloc节等,如果调整的比较好,新的PE一般跟原来的几乎一样,甚至会更
小。我曾经作过一些调整工具,可以将:资源节、Reloc节等自动调整,并可以搬移到新的PE的任何可用的节空余部分,这些工具写起来很简单,可以根据需
要自行编写,同时通过编写这些工具,可以大大增加对PE格式的认识。需要说明的是:大部分表(节)的起始地址一般要求双字边界的地址(即起始地址为4的整
数倍,如0x634b4有效,0x634b1-0x634b3无效),如资源表、Reloc表等。其他没有什么可注意的,只要细心就完全可以做到。