Я работаю над проектом (C++), для которого требует полностью динамически распределенных функций, что означает malloc/new и mprotect, а затем вручную модифицирует буфер код сборки. Из-за этого я точно задался вопросом, что требуется в этом «моем буфере», так как это будет реплицировать любой другой функции _cdecl. Например:Использование C++ с сборкой для выделения и создания новых функций во время выполнения
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
Теперь, если этот код правильно (я очень сомневаюсь, пожалуйста, поправьте меня) мне нужно только, чтобы найти значение этого кодекса в шестнадцатеричной (например, «ПСМ» является 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)
?). И я не заинтересован в использовании наддува :: функции или что-то похож, я нужно функцию, чтобы быть полностью динамичны, поэтому мой интерес :)
Примечание: Этот вопрос является продолжением на мой previous one, но с гораздо больше.
Зачем вам нужно скопировать функцию? Исходный так же хорош. Вы хотите создать совершенно новую функцию из некоторого представления более высокого уровня? –
@ н.м. Да, это был всего лишь пример для меня, чтобы понять и легко представить все для вас. Мне легко понадобится около двадцати из них. Если вы прочтете мою ссылку (на мой другой вопрос), вы точно поймете, почему :) –
Я попытался понять этот вопрос в первый раз, без каких-либо успехов. –