Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/64.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 递归函数——挂钩_C_Linux_Hook - Fatal编程技术网

C 递归函数——挂钩

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

假设我们有一个名为“SomeFunction()”的函数,在.so中。 假设此函数多次调用自身(递归)

那么,下面的代码将不起作用

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,以重定向到我的函数。