Как выполнить ассемблерный код x64 ABI в куче из CC++

Программы на C++. Форум разработчиков
Ответить
Anonymous
 Как выполнить ассемблерный код x64 ABI в куче из C

Сообщение Anonymous »

Я создаю выделенную в куче память с правами на выполнение, используя windows.h VirtualAlloc и VirtualProtect.

Код: Выделить всё

void* write_into_executable(uint8_t code[]) {
SYSTEM_INFO info;
GetSystemInfo(&info);

void *buf = VirtualAlloc(NULL, info.dwPageSize, MEM_COMMIT, PAGE_READWRITE);
memcpy(buf, code, info.dwPageSize);

DWORD dummy;
VirtualProtect(buf, info.dwPageSize, PAGE_EXECUTE_READ, &dummy);

return buf;
}
затем я хочу вызвать функцию тестирования с помощью heap_exec:

Код: Выделить всё

int test(int v) {
return v;
}

void heap_exec() {
uintptr_t fnPt = (uintptr_t)test;

uint8_t code[] = {
0x55,                                               // push rbp
0x48, 0x89, 0xE5,                                   // mov rbp, rsp
0x48, 0xC7, 0xC1, 0x05, 0x00, 0x00, 0x00,           // mov rcx, 0x5
0x48, 0xBB, fnPt>>0 , fnPt>>8 , fnPt>>16, fnPt>>24, // mov rbx, fnPt
fnPt>>32, fnPt>>40, fnPt>>48, fnPt>>56,
0xFF, 0xD3,                                         // call rbx
0x5D,                                               // pop rbp
0xC3,                                               // ret
};

void *buf = write_into_executable(code);

typedef int (*callable) ();
printf("%d\n", ((callable)buf)());
VirtualFree(buf, 0, MEM_RELEASE);
}
правильно ли я использую x64 ABI для Windows (я помещаю первый аргумент в rcx)? являются ли инструкции push rbp, pop rbp (которые я скопировал из gcc -S -masm=intel main.c) избыточными?

Подробнее здесь: https://stackoverflow.com/questions/798 ... eap-from-c
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C++»