各处转载 ,只是学习,没有其他意思~~~~~~
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头中的节表头
根据是否压缩资源节加壳后的文件的节表层次结构分为两种情况:
* 不压缩资源节的情况:第一个是占位节,第二个是资源节,其后市各个压缩节,最后是配置信息节
* 压缩资源节的情况: 第

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

4122

被折叠的 条评论
为什么被折叠?



