跳至主要內容

17-有效负载加密 - 异或

Maldevacademy大约 2 分钟安全开发

简介

XOR 加密是最简单、实现最轻量级的加密方式,这使得它成为恶意软件的热门选择。它比 AES 和 RC4 更快,并且不需要任何附加库或使用 Windows API。此外,它是一种双向加密算法,同一函数既可用于加密又可用于解密。

XOR 加密

下面代码片段展示了一个简单的 XOR 加密功能。这个功能简单地通过一个字节的密钥对 shellcode 的每一个字节执行 XOR 运算。

/*
 - pShellcode : 需要加密的有效载荷基址
 - sShellcodeSize : 有效载荷的尺寸
 - bKey : 代表对有效载荷加密的密钥的单个任意字节
*/
void XorByOneKey(PBYTE pShellcode, SIZE_T sShellcodeSize, BYTE bKey) {
 for (size_t i = 0; i < sShellcodeSize; i++) {
  pShellcode[i] = pShellcode[i] ^ bKey;
 }
}

保护加密密钥

一些工具和安全解决方案能通过暴力破解密钥的方式提取解密后的 Shellcode。为了加大这些工具猜测密钥的难度,下面的代码进行了细微的更改,并通过让 i 成为密钥的一部分来增加密钥空间。现在,由于密钥空间变得更大,暴力破解密钥也更加困难。

/*
	- pShellcode : 要加密的 payload 的基地址
	- sShellcodeSize : payload 的大小
	- bKey : 表示用于加密 payload 的密钥的任意单个字节
*/
VOID XorByiKeys(IN PBYTE pShellcode, IN SIZE_T sShellcodeSize, IN BYTE bKey) {
	for (size_t i = 0; i < sShellcodeSize; i++) {
		pShellcode[i] = pShellcode[i] ^ (bKey + i); // 异或(XOR)运算
	}
}

上面的代码片段还可以进一步加强。下面的代码片段使用一个密钥执行加密过程,并重复使用该密钥的每个字节,从而使破解密钥变得更加困难。

/*
	- pShellcode : 要加密的 payload 的基地址
	- sShellcodeSize : payload 的大小
	- bKey : 有一定大小的随机字节数组
	- sKeySize : 密钥的大小
*/
VOID XorByInputKey(IN PBYTE pShellcode, IN SIZE_T sShellcodeSize, IN PBYTE bKey, IN SIZE_T sKeySize) {
	for (size_t i = 0, j = 0; i < sShellcodeSize; i++, j++) {
		if (j >= sKeySize){
			j = 0;
		}
		pShellcode[i] = pShellcode[i] ^ bKey[j]; // 异或(XOR)运算
	}
}

结论

建议在小任务中使用异或加密,例如对字符串进行混淆处理。但是,对于较大的有效负载,建议使用更安全的加密方法,例如 AES。