我一直在研究一个(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 或类似的东西不感兴趣,我需要该函数是完全动态的,因此我感兴趣:)
注意:这个问题是我上一个问题的延续,但有更多细节。