PE压缩壳学习~~~

本文详细介绍了PE文件加壳技术,特别是如何利用Windows PE装载器的方式将PE文件加载到内存。主要内容包括:判断PE文件、清除重定位信息、压缩各个节数据、创建新导入表、处理资源节和配置信息节、修正PE头等步骤。文章通过C++和汇编代码的配合,讲解了外壳代码如何解压、填充IAT、恢复资源目录和修正重定位数据。

各处转载 ,只是学习,没有其他意思~~~~~~

PE文件内容装在进内存的方式有两种: 

1)直接将整个文件读入内存/

2)根据 Windows PE 装载器载入PE文件的方式将PE文件载入内存

这里采用 2 方法。


创建一个CPack类,

1)封装 LoadPE 函数:1 判断文件是否存在  2 判断文件是否为PE文件  3)文件内容读入内存  4 保存附加数据

2)判断文件是否为 DLL文件(只对exe进行加壳 压缩)

3)清除重定位 信息 (ClearReloc) 1 重定位表数据  2数据目录表中 重定位项数据

(对于EXE文件来说,实际载入基址 与优先载入基址通常是相同的,所有重定位信息是没有用的,为了达到更大的

压缩效果可以将其去除,通常编译器将重定位信息单独设为一个节,所有清除这样的重定位信息,我们只要把这个

节整体删除即可,但对于DLL文件,实际载入基址和优先载入基址很可能是不同的,这一久需要对全局数据或者函

数等信息进行重定位,所以不可以清除重定位信息。然而重定位信息已经被压缩了,所以原来应该由PE加载器完成

的重定位工作,现在应该由外壳代码在完成解压后完成。而避免PE加载器对加壳文件进行重定位工作而引发错误,

我们需要把重定位目录删除,因此把重定位目录中保存的重定位表信息保存起来,以便外壳代码进行重定位。)

4)压缩各个节数据 

压缩引擎: 

JCALG1 适合大文件压缩   2 LZMA 是 7-Zip 程序默认算法,很高的压缩比  3选择aPlib,使用时包含h文件,导入lib

 1)压缩各个节时需要同时保存被压缩节解压后的内存RVA 2)压缩节的内存RVA 3 )压缩数据指针+大小 4)注意是否压缩资源节

封装 void CompressSections() 

压缩功能函数:  

PVOID CompressData(PVOID pSource, long lInLength, OUT long &lOutLenght);

pSource -> 待压缩数据所在内存地址  lInLength压缩后大小  lOutLenght

参考: http://bbs.pediy.com/showthread.php?t=131361

如果有资源节,不压缩资源节的话,被压缩节的数量减一

5) 打造导入表

我们已经将导入表给压缩了,所以要给加壳后的文件重新创建新的导入表,该导入表包含外壳代码锁使用的API函数信息。

void BuildImportTable(DWORD awRva, pImportInfo pImport PBYTE  pMem);

6) 封装 ERRORIN CPack::GetFile(TCHAR *pPathName)

参数 pPathName 表示要生成的文件名的字符串指针,返回值为枚举类型

1)判断是否可以生成加壳文件 1 被加壳文件是否成功加载  2判断目标文件是否已经加壳

2)处理重定位信息

3)对目标程序的各个节进行压缩

4)创建加壳文件并写入临时PE头 (不是最终,最后还要修改,写入的是加壳前的PE头,主要是占位,从而方便后面写)

5)修正刚写入的 PE头中的节表头

根据是否压缩资源节加壳后的文件的节表层次结构分为两种情况:

* 不压缩资源节的情况:第一个是占位节,第二个是资源节,其后市各个压缩节,最后是配置信息节

* 压缩资源节的情况:    第

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值