日期:2014-05-16  浏览次数:20769 次

我在linux下劫持了系统调用write ,然后在hached_write函数里面如何获得PID呢?
我在linux下劫持了系统调用write ,然后在hacked_write函数里面如何获得PID呢?
hached_write应该是运行在进程的上下文中,该如何调用函数获得进程的PID?
劫持的方法是编写内核模块,获得sys_call_table , 
然后保存orig_write = sys_call_table[__NR_write];
sys_call_table[__NR_write] = hacked_write
这样劫持的。
#include <linux/syscalls.h>
然后调用sys_getpid()
但是insmod时出现hookwrite: Unknown symbol sys_getpid

当然我使用
long (*orig_getpid)(void);
orig_getpid = sys_call_table[__NR_getpid];
然后在hacked_write里使用orig_getpid()就能得到pid ,, 这个是可以成功,我已经试验了。

请问还有没有更优雅些的方法获得pid呢?

------解决方案--------------------

就算是2.6的内核 ,2.6.12 和2.6.39 的task_struct 变化相当大
你没有办法写一个通用的c代码,从current的task_struct里直接取出pid
所以为了通用,你还是掉被劫持内核的api
Unknown symbol 是因为sys_getpid不是一个导出符号,不能随意在内核其他模块调用。你不是已经能从sys_call_table里掉系统原有的sys_getpid吗,这样的方法才是能通用2.6的