Использование C++ с ассемблером для выделения и создания новых функций во время выполнения

Я работал над проектом (C++), который требует полностью динамически выделяемых функций, что означает malloc/new и mprotect, а затем вручную модифицирует буфер в ассемблерный код. Из-за этого я задался вопросом, что именно требуется в этом моем «буфере», чтобы он был репликойлюбой другой функции _cdecl. Например:

int ImAcDeclFunc(int a, int b)
{
     return a + b;
}

Если бы я хотел буквально создать дубликат этой функции, но полностью динамически, что для этого потребовалось бы (и помните, что это C++ с встроенной сборкой)? Для начала, я думаю, мне нужно было бы сделать что-то вроде этого (или похожее решение):

// My main....
byte * ImAcDeclFunc = new byte[memory];
mprotect(Align(ImAcDeclFunc), pageSize, PROT_EXEC | PROT_READ | PROT_WRITE);

После этого мне нужно было бы узнать ассемблерный код для ImAcDeclFunc(int a, int b);]. Теперь я все еще паршив в сборке, так как бы эта функция была в синтаксисе AT&T? Вот моя смелая попытка:

push %ebp
movl %%ebp, %%esp
movl 8(%ebp), %%eax
movl 12(%ebp), %%edx
addl edx, eax
pop ebp
ret

Теперь, если этот код правильный (в чем я очень сомневаюсь, пожалуйста, поправьте меня), мне нужно только найти значение этого кода в шестнадцатеричном формате (например, «jmp» — это 0xE9, а «inc» — это 0xFE ) и использовать эти значения непосредственно в C++? Если я продолжу свой предыдущий код C++:

*ImAcDeclFunc = 'hex value for push'; // This is 'push' from the first line
*(uint)(ImAcDeclFunc + 1) = 'address to push'; // This is %ebp from the first line
*(ImAcDeclFunc + 5) = 'hex value for movl' // This is movl from the second line
// and so on...

После того, как я сделал это для всего кода/буфера, будет ли этого достаточно для полностью динамической функции _cdecl (т.Можно ли просто привести его к указателю на функцию и выполнить int result = ((int (*)(int, int))ImAcDeclFunc)(firstArg, secondArg)?). И я не заинтересован в использовании boost::function или чего-то подобного, мне нужночтобы функция была полностью динамической, поэтому мой интерес :)

ПРИМЕЧАНИЕ. Этот вопрос является продолжением моего предыдущий, но с гораздо большей конкретикой.

7
задан Community 23 May 2017 в 10:28
поделиться