将程序集转换为C中的机器代码

我寻求任何lib或函数将一串汇编代码转换为机器码,
如下:

char asmString[] = {"mov eax,13H"};
byte[] output; // array of byte
output = asm2mach(asmString); // {0xB8, 0x13, 0x00, 0x00, 0x00}

动机是注入机器代码来调用程序中的asm函数.这个注入主要有3个步骤:VirtualAllocEx,WriteProcessMemory和CreateRemoteThread.这是代码:

bool injectAsm(const char* exeName,const byte* code, int size) 
{ 
    LPVOID allocAddr = NULL;
    HANDLE ThreadProcess = NULL;
    HANDLE hProcess = OpenProcessEasy(exeName);

    allocAddr = VirtualAllocEx(hProcess, NULL, size, MEM_COMMIT, PAGE_READWRITE);
    if(allocAddr){
        if(WriteProcessMemory(hProcess, allocAddr, code, size, NULL)) {
            ThreadProcess = CreateRemoteThread(hProcess, NULL, 0, (LPTHREAD_START_ROUTINE)allocAddr, NULL, 0, NULL);
            WaitForSingleObject(ThreadProcess, INFINITE);
            VirtualFreeEx(hProcess,allocAddr, 0, MEM_RELEASE);
            CloseHandle(ThreadProcess);
            return true;
        }
    }
    if(allocAddr){
        VirtualFreeEx(hProcess, allocAddr, 0, MEM_RELEASE);
    }
    return false;
}

int main()
{
    byte code[] = {0xB8, 0x10, 0xED, 0x4A, 0x00, 0xFF, 0xD0, 0xC3, 0x90};
    injectAsm("game.exe",code,sizeof(code));
    system("pause");
    return 0;
} 

解决方法:

你应该定义你真正想要的东西:

您想在运行时生成机器代码吗?然后使用一些JIT compilation库,如libgccjit,libjit,LLVM,GNU lightningasmjit.asmjit是一个发出x86机器代码的库,可能就是你需要的.绝对不需要使用包含汇编代码的字符串.

或者您是否想要将一些汇编语法(甚至对于x86有几种汇编语法)转换为对象代码或机器代码?那么你最好将一个真正的汇编程序作为外部程序运行.生产的object code将包含relocation指令,您需要处理这些指令(例如linker).

或者,您应该考虑在运行时生成一些(例如)C代码,然后分支编译,并在运行时动态加载和使用结果函数(例如使用dlopen(3)和dlsym).见this

详细信息显然是操作系统,ABI和处理器特定.

上一篇:2020年最新 C# .net 面试题,月薪20K+中高级/架构师必看(2)


下一篇:2020年最新 C# .net 面试题,月薪20K+中高级/架构师必看(1)