我正在尝试挂钩一个 linux 程序的功能。基本上使用 mprotect 搜索解除对函数的保护,然后将 jmp 放入原始函数地址中,重定向到我的函数挂钩。
但是我想复制原始函数,以便在不需要修改的函数时调用它。我会有这样的钩子
int CallHookedFunctionFoobar(int param1, int param2)
{
if (g_somevariable)
Foobar_original(param1, param2);
else
Foobar_modified(param1, param2);
}
所以我的问题是......我怎么知道函数的大小(以字节为单位),所以我可以将它 memcpy() 放到动态分配的缓冲区中执行它?
我考虑过可能嵌入一个小长度的反汇编程序并解析操作码,直到找到 RETN 光码,但我不确定它绝对适用于所有情况(例如,如果多个 RETN 驻留在同一个函数中:[)
因为我想这样做的另一个原因是因为同一个函数可能已被另一个库挂钩..