【发布时间】:2013-02-09 20:33:31
【问题描述】:
我正在用 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 函数???
谢谢 亚历山大
【问题讨论】:
-
你写了一个JIT,但不知道LoadLibrary和朋友? #困惑