注入.so对特定function函数进行hook要保持原始业务的兼容性典型的hook的做法应该是 hook_function() { save ori_function_address; /* do something in here span some time delay */ call ori_function; } hook函数在执行完自己的逻辑后,应该要及时调用被hook前的"原始函数",保持对原有业务逻辑的透明 4. 尽量...
err= register_ftrace_function(&hook->ops);if(err) { pr_debug("register_ftrace_function() failed: %d\n", err);/*Don’t forget to turn off ftrace in case of an error.*/ftrace_set_filter_ip(&hook->ops, hook->address,1,0);returnerr; }return0; } 要关闭钩子,我们只需反向重复相同...
Linux钩子函数(LinuxHook Function)是在Linux操作系统中的一种重要机制,它允许开发者插入自己的代码片段到内核的核心功能之中。通过使用钩子函数,开发者可以在内核的关键操作点上执行自定义的代码,并对系统行为进行修改、增强或监控。在本文中,我们将探讨Linux钩子函数的作用、工作原理以及常见应用。 首先,我们需要了解什...
//define one hook function static struct nf_hook_ops hook_pcap = { {NULL,NULL}, packet_cap, PF_INET, NF_IP_LOCAL_IN, NF_IP_PRI_FILTER+1 }; static int __init init(void) { return nf_register_hook(&hook_pcap); } static void __exit fini(void) { nf_unregister_hook(&hook_pcap)...
这时候,每次调用 open 函数时,都会先执行自定义的钩子函数 hook_func,输出 "Hook function called!"...
更多的相关资料可以通过搜索malloc_hook了解。不过这种方式已经被废弃了,虽然还可以使用,但是不建议。二)GCC的编译选项—wrap方式,以下为GCC文档描述:对symbol使用包装函数(wrapper function),任何对symbol未定义的引用(undefined reference)会被解析成__wrap_symbol,而任何对__real_symbol未定义的引用会被解析成symbol。
hook:我们定义的处理函数的指针,它的返回值必须为前面所说的几个常量之一; pf:协议族,表示这个HOOK属于哪个协议族; hooknum:我们想要注册的钩子,取值为五个钩子之一; priority:优先级,目前Netfilter定义了一下几个优先级,取值也小优先级也高,我们可以根据需要对各个优先级加减一个常量得到符合我们需要的优先级。
gcc-o app main.c-L.-lfunction exportLD_LIBRARY_PATH=../app 这样我们得到一个打印 my_printf in function 现在再创建一个注入的so hook.c #include<stdio.h>voidmy_printf(){printf("my_printf in hook\n");} 分别进行编译和运行 gcc-shared-fPIC-o libhook.so hook.cLD_PRELOAD=./libhook.so....
voidfh_remove_hook(structftrace_hook*hook){interr;err=unregister_ftrace_function(&hook->ops);if(err)pr_debug("unregister_ftrace_function() failed: %d\n",err);}err=ftrace_set_filter_ip(&hook->ops,hook->address,1,0);if(err){pr_debug("ftrace_set_filter_ip() failed: %d\n",err);}...
function: 钩子函数的地址(替代被hook函数) original: 指针,指向存储被hook函数的地址的地方 address: 被hook函数的地址 ops: ftrace服务信息 */structftrace_hook{constchar*name;void*function;void*original;unsignedlongaddress;structftrace_opsops;};