如何将内联汇编__asm转换为byte

Dan*_*gen 5 c++

好吧,我想创建一个绕道我的自定义注入函数,所以这样的代码工作

void *DetourCreate(BYTE *src, const BYTE *dst)
{
    int len = 5;
    BYTE* jmp = (BYTE*)malloc(len + 5);
    DWORD dwBack;
    VirtualProtect(src, len, PAGE_EXECUTE_READWRITE, &dwBack);
    memcpy(jmp, src, len);
    jmp += len;
    jmp[0] = 0xE9;
    *(DWORD*)(jmp + 1) = (DWORD)(src + len - jmp) - 5;
    src[0] = 0xE9;
    *(DWORD*)(src + 1) = (DWORD)(dst - src) - 5;
    VirtualProtect(src, len, dwBack, &dwBack);
    return(jmp - len);
}
Run Code Online (Sandbox Code Playgroud)

但我觉得使用操作码很烦人,所以有没有办法使用__asm?比如这个伪代码

void DetourCreate(byte *src, const byte *dst)
{
    DWORD dwBack;
    VirtualProtect(src, sizeof(*dst), PAGE_EXECUTE_READWRITE, &dwBack);
    *src = __asm{
        call dst
    };
    VirtualProtect(src, sizeof(*dst), dwBack, &dwBack);
}
Run Code Online (Sandbox Code Playgroud)

Gui*_*ing 0

要将内联汇编转换为相应的字节,您可以将汇编写入__declspec(naked)函数内部,并使用WriteProcessMemory将内联汇编函数作为源将数据写入外部进程。

以下是从程序集写入本地缓冲区的示例:

__declspec(naked) int assembly()
{
    __asm
    {
        push eax;   // \x50
        mov eax, 1; // \xB8 \x01\x00\x00\x00
        pop eax;    // \x58
    }
}

int main()
{
    unsigned char buffer[7] = { 0 };

    HANDLE hProc = OpenProcess(PROCESS_ALL_ACCESS, NULL, GetCurrentProcessId());
    WriteProcessMemory(hProc, &buffer, &assembly, 7, NULL);

    for (auto c : buffer)
    {
        printf("0x%hhX ", c);
    }

    std::getchar();

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我们使用 declspec 来确保没有函数序言/结尾妨碍我们。输出仅用于此概念证明,内容为:0x50 0xB8 0x1 0x0 0x0 0x0 0x58

使用此技术写入目标进程应该足够简单。

如果您发现自己经常这样做,那么使用Capstone 反汇编器是最终的解决方案,它非常易于使用。