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

时间:2015-01-29 01:36:04

标签: 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);
}

但是我觉得使用操作码很烦人,所以有没有办法使用__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);
}

1 个答案:

答案 0 :(得分: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;
}

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

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

使用Capstone disassembler是最终的解决方案,如果你经常这样做,它很容易使用。