我一直在做一个(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或类似的东西,我需要函数完全动态化,因此我很感兴趣:)注意:这个问题是我之前一个问题的延续,但更具体。