c++ - C++ 中的 jit 汇编程序,使用 C 函数

标签 c++ c assembly jit

我正在用 C++ 开发一个简单的 JIT 汇编系统,但是,我想在这个 jit 系统中调用 C 函数,所以,我想...我需要命令的指针...但是,我不知道我怎么能得到这个...

这是我的代码

#include <cstdio>
#include <vector>
#include <windows.h>

int Execute(std::vector<unsigned char> code)
{
    int eaxRegister;

    unsigned char* func = (unsigned char*)VirtualAlloc( 0, code.size() + 1, 0x1000, 0x40 );

    memcpy( func, code.data(), code.size() );
    func[code.size()] = 0xC3; // add the ret to the final of code final

    CallWindowProc( (WNDPROC)func, 0, 0, 0, 0 );

    _asm mov eaxRegister, eax;

    VirtualFree( func, code.size() + 1, 0x4000 );

    return eaxRegister;
}

int main()
{
    std::vector<unsigned char> code;

    //mov eax, 10
    code.push_back( 0xc7 );
    code.push_back( 0xc0 );
    code.push_back( 0xa );
    code.push_back( 0x0 );
    code.push_back( 0x0 );
    code.push_back( 0x0 );

    //mov ecx, 10
    code.push_back( 0xc7 );
    code.push_back( 0xc1 );
    code.push_back( 0xa );
    code.push_back( 0x0 );
    code.push_back( 0x0 );
    code.push_back( 0x0 );

    //add eax, ecx
    code.push_back( 0x3 );
    code.push_back( 0xc1 );

    // push MESSAGE
    const char* ohi = "HI";
    code.push_back( 0x69 );
    code.push_back( *ohi );

    // call prinf ?????
    code.push_back( 0xe8 );
    code.push_back( 0xfff/* offset of printf */ ) ;

    // add esp, 4
    code.push_back( 0x83 );
    code.push_back( 0xc4 );
    code.push_back( 0x04 );
    code.push_back( 0x0 );
    code.push_back( 0x0 );
    code.push_back( 0x0 );

    int exec = Execute( code );
    printf("SUM = %d", exec);

    return 0;
}

所以,我的问题是,如何获取 printf 命令的偏移量以在 JIT 中使用,或者,如何使用 JIT 来使用 C 函数???

谢谢 亚历山大

最佳答案

printf(不带括号)将求值为函数 printf 的地址,因此您显然需要 code.push_back(printf);

编辑:当然,因为您已经将 code 定义为一个简单的 vector`,所以它不会按原样工作。您需要一次一个地推回地址的各个字节。这是一个快速演示,显示将其推回,然后打印出结果并显示它与将地址传递给 printf 并使用 %p 转换所获得的结果几乎相同:

#include <vector>
#include <stdio.h>
#include <iostream>

int main() {
    std::vector<unsigned char> code;

    auto a = printf;
    char *p = (char *) &a;

    printf("%p\n", printf);

    for (int i=0; i<sizeof(a); i++)
        code.push_back(*p++);

    for (int i=0; i<code.size(); i++)
        std::cout << std::hex << (unsigned int)code[i] << " ";
    return 0;
}

如您所见,%p 一起显示整个指针,而这一次显示一个字节。在 Windows(小端硬件)上,这将导致字节顺序相反。

关于c++ - C++ 中的 jit 汇编程序,使用 C 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15054432/

相关文章:

c++ - Python 和/或 C/C++ 中的高精度算术?

c - 在Linux上读取调试寄存器

c - 尝试释放字符串时下一个大小无效(快速)

c++ - 当结构在 C++ 中也被引用时,是否有可能返回其成员之一?

c++ - SDL2 SLD_RenderCopy 不显示任何内容

c++ - 无法使 wx-widget 与 netbeans 一起工作

arrays - 在谈论字符指针数组时,char *[] 和 char ** 之间的关系是什么

c - 如何跟踪全局变量重新定义问题的链接器问题

assembly - 有人知道 "mov edi,edi "是做什么的吗?

c++ - timespec 初始化时非阻塞 TCP 套接字挂起 (C++)