脱壳与加壳-加壳-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;