Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

Исполнение сгенерированного машинного кода.

353
03 июля 2007 года
Nixus
840 / / 04.01.2007
Существуют ли в WinAPI механизмы, позволяющие моей программе генерировать машинный код и исполнять его (минуя создание exe, dll и т.д.)? Нужно не в деструктивных целях. Хочу разроботать что-то вроде JIT-компилятора.
22K
03 июля 2007 года
Pastor
43 / / 16.05.2007
Сам не проверял, но может быть так:
 
Код:
hMap = CreateFileMapping(....);
void *address = MapViewOfFile(hMap, PAGE_EXECUTE_READWRITE, 0, .....);
//а потом передаешь управление
__asm{
    call address
}

на асме все проще.... :)
353
03 июля 2007 года
Nixus
840 / / 04.01.2007
Возможно, спасиб. Буду разбираться.
261
03 июля 2007 года
ahilles
1.5K / / 03.11.2005
Цитата: Nixus
Существуют ли в WinAPI механизмы, позволяющие моей программе генерировать машинный код и исполнять его (минуя создание exe, dll и т.д.)?


API для генерации машинного кода нет. Тебе придётся вручную генерировать код, т.е. вручную писать опкоды инструкций в некоторую область памяти и потом передавать туда управление.

22K
03 июля 2007 года
Pastor
43 / / 16.05.2007
Код:
#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;
}

можно и так... но размер исполняемого куска должен быть заранее определен...
353
04 июля 2007 года
Nixus
840 / / 04.01.2007
Цитата: ahilles
API для генерации машинного кода нет. Тебе придётся вручную генерировать код, т.е. вручную писать опкоды инструкций в некоторую область памяти и потом передавать туда управление.



Ну, эт я понимаю. :) Винда просто так не даст исполнять код в выделеном участке памяти. А вот как сделать память для чтения/записи еще и исполнимой, вот это вопрос.

3
05 июля 2007 года
Green
4.8K / / 20.01.2000
Цитата: Nixus
Ну, эт я понимаю. :) Винда просто так не даст исполнять код в выделеном участке памяти. А вот как сделать память для чтения/записи еще и исполнимой, вот это вопрос.



Кто сказал, что не даст просто?

Ну можно и сделать, смотри VirtualProtect

353
05 июля 2007 года
Nixus
840 / / 04.01.2007
Можно сразу через VirtualAlloc с нужным доступом выделять. Но все равно вылетает с кодом 0xc0000005 (то бишь access violation).
Всем спасибо, понял в каком напрвлении капать. :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог