C 递归函数——挂钩
假设我们有一个名为“SomeFunction()”的函数,在.so中。 假设此函数多次调用自身(递归) 那么,下面的代码将不起作用C 递归函数——挂钩,c,linux,hook,C,Linux,Hook,假设我们有一个名为“SomeFunction()”的函数,在.so中。 假设此函数多次调用自身(递归) 那么,下面的代码将不起作用 main() { [...] g_backup_bytes = SetJmpHook(SomeFunction, SomeFunction_hook); // Address of func previously found using dlsym(), contained in SomeFunction [...] } void S
main() {
[...]
g_backup_bytes = SetJmpHook(SomeFunction, SomeFunction_hook); // Address of func previously found using dlsym(), contained in SomeFunction
[...]
}
void SomeFunction_hook(void)
{
[...]
// Do stuff here
[...]
// Call the real function
UnsetJmpHook(SomeFunction, g_backup_bytes); // Restore original bytes
SomeFunction(); // Call
SetJmpHook(SomeFunction, SomeFunction_hook); // Restore the hook
}
我试图钩住的函数具有无效参数,但修改全局变量。
我绝对需要,每次调用函数时,修改这些全局变量中的一些字节。
现在,我的问题是。。。当我取消设置钩子时,就像上面的例子一样,函数调用本身,这些调用不会被我的SomeFunction_hook()过程捕获(因为jmp不再存在)。这是一个真正的问题
你知道我怎样才能成功挂接每一个电话吗
谢谢 听起来您需要通过
g_backup_bytes
而不是通过可挂钩的入口点来调用它。如何实现这一点取决于挂钩的实现方式。g_backup_bytes只是一个5字节的结构,其中包含由jmp指令调用替换的原始字节(即5字节)。不幸的是,它们只包含mov指令的开头(它们包含a1 x,即mov eax,一些\u r/m),而不包含任何相关内容。函数SetJmpHook()只在函数地址设置一个5字节长的跳转钩子。UnsetJmpHook()还原原始字节。我的意思是。。。它设置了一个e9风格的跳转钩子,其中相对偏移量是减法的结果:SomeFunction-SomeFunction_hook-5(5是jmp指令的长度)我找不到关于SetJmpHook
的任何文档,这是一个标准函数吗?不,这是一个“手工”函数。它实际上只在我想要钩住的函数的开头写一个jmp,以重定向到我的函数。