脱壳与加壳-加壳-2-加密解密

加壳涉及的两大对象:

1、被加壳的程序

2、壳代码

1 处理被加壳的程序

1 添加区段

2 加密目标程序的区段

3 将壳代码写入新的区段

4 修改模板程序的入口点

上一章我们已经解决了添加区段

 

2 壳代码

2.1壳代码的功能:

2.1.1 解密功能

对加密的代码进行解密处理

2.1.2 保护功能

对程序进行保护

2.2 写壳代码的难点

2.2.1 API调用

API调用,由于壳代码是后期添加到PE文件上的,所以系统是不会为其提供iat表,也就是说系统无法修复壳代码的IAT表,所以这里我们写壳代码后只能动态调用API

2.2.2 全局变量

壳代码如果定义全局变量,会涉及到重定位,需要我们修复壳的重定位表

2.2.3 壳代码以什么形式存在

壳代码,就是一段指令,我们这里将其编写成为一个dll文件,把他的代码段,当成是壳代码

使用link命令将所有区段合并到代码段

加密区段

对写好的程序进行添加区段空间后,再给区段进行加密,然后壳代码再进行解密,以此来保护程序和让程序可以使用

首先加密肯定不能加密PE文件的各种头,因为这样就无法移植无法调用了

所以只能加密PE文件对应的区段

这里选择加密.text也就是代码段区段,vs默认第一个区段是代码段

因为加密别的区段会比较麻烦,比如说数据段会存放一些导入表导出表,PE加载的时候加密了加载不进去

 

    PIMAGE_SECTION_HEADER pSectionHeader = IMAGE_FIRST_SECTION(pNtHeader);
int key = 0x51;
//进行异或来加密
char* pData = FileBuff+(DWORD)pSectionHeader->PointerToRawData;
//pData指向文件偏移中的区段的首地址
//SizeofRawData表示区段在文件中对齐后的大小
for (int i = 0; i < pSectionHeader->SizeOfRawData; i++)
{
pData[i] = pData[i] ^ key;
}
return TRUE;