hMap = CreateFileMapping(....);
void *address = MapViewOfFile(hMap, PAGE_EXECUTE_READWRITE, 0, .....);
//а потом передаешь управление
__asm{
call address
}
Исполнение сгенерированного машинного кода.
Существуют ли в WinAPI механизмы, позволяющие моей программе генерировать машинный код и исполнять его (минуя создание exe, dll и т.д.)? Нужно не в деструктивных целях. Хочу разроботать что-то вроде JIT-компилятора.
Код:
на асме все проще.... :)
Возможно, спасиб. Буду разбираться.
Цитата: Nixus
Существуют ли в WinAPI механизмы, позволяющие моей программе генерировать машинный код и исполнять его (минуя создание exe, dll и т.д.)?
API для генерации машинного кода нет. Тебе придётся вручную генерировать код, т.е. вручную писать опкоды инструкций в некоторую область памяти и потом передавать туда управление.
Код:
#include <windows.h>
#pragma code_seg(".exec")
unsigned char bytes[]={
0x6a, 0x00,//push 00
0xff, 0x15, //call
0x10, 0x72, 0x49, 0x00//_imp_ExitProcess
//в данной программе
};
#pragma section(".exec", read, write, execute)
#pragma code_seg()
int main(int argc, char **argv){
unsigned long *address = (unsigned long *)&bytes;
__asm call address
return 0;
}
#pragma code_seg(".exec")
unsigned char bytes[]={
0x6a, 0x00,//push 00
0xff, 0x15, //call
0x10, 0x72, 0x49, 0x00//_imp_ExitProcess
//в данной программе
};
#pragma section(".exec", read, write, execute)
#pragma code_seg()
int main(int argc, char **argv){
unsigned long *address = (unsigned long *)&bytes;
__asm call address
return 0;
}
можно и так... но размер исполняемого куска должен быть заранее определен...
Цитата: ahilles
API для генерации машинного кода нет. Тебе придётся вручную генерировать код, т.е. вручную писать опкоды инструкций в некоторую область памяти и потом передавать туда управление.
Ну, эт я понимаю. :) Винда просто так не даст исполнять код в выделеном участке памяти. А вот как сделать память для чтения/записи еще и исполнимой, вот это вопрос.
Цитата: Nixus
Ну, эт я понимаю. :) Винда просто так не даст исполнять код в выделеном участке памяти. А вот как сделать память для чтения/записи еще и исполнимой, вот это вопрос.
Кто сказал, что не даст просто?
Ну можно и сделать, смотри VirtualProtect
Всем спасибо, понял в каком напрвлении капать. :)