我正在开发一个项目,我必须在OSX(10.10.5)上挂钩80%-90%的系统调用函数.我是从内核扩展中做到这一点的.由于我必须(un)挂钩许多函数,我想将原始内核函数存储到函数指针数组中,我可以快速查找数组,以便在取消时恢复原始函数.
int (*kern_open)(struct proc *, struct open_args *, int *);
int mon_open(struct proc *p, struct open_args *uap, int *retval) {
kern_open = sysent[SYS_open].sy_call;
sysent[SYS_open].sy_call = mon_open;
Run Code Online (Sandbox Code Playgroud)
这样可行,kern_open函数用于存储调用系统调用的原始内核函数.mon_open是我的挂钩功能.
我想要实现的目标如下:因此,在取消挂钩时,我可以通过KernSysCall数组进行迭代并恢复功能.
// global array of function pointers that all have the same func def.
static int (*KernSysCall[SYS_MAXSYSCALL])(struct proc *, struct args *, int *);
KernSysCall[SYS_open] = sysent[SYS_open].sy_call;
sysent[SYS_open].sy_call = mon_open;
Run Code Online (Sandbox Code Playgroud)
恢复: sysent[SYS_open].sy_call = KernSysCall[SYS_open];
但是,将原始内核函数存储在函数指针数组中会导致内核崩溃.由于error: KDP_REATTACH failed错误,我还无法附加lldb .我希望有人知道导致内核恐慌的原因.
下面是内核恐慌的日志.
Anonymous UUID: 052D64D2-A43C-99F8-D221-B591991E54AF
Wed Nov 11 12:55:06 2015
*** Panic Report *** …Run Code Online (Sandbox Code Playgroud) 我想将inta 转换char[4]为char[4]包含十进制值2的每个字节.所以在下面的例子中:
int p = 2999999;
Run Code Online (Sandbox Code Playgroud)
转换p到相同的阵列k,其中k通过被构造:
char k[4];
k[0] = 2;
k[1] = 99;
k[2] = 99;
k[3] = 99;
Run Code Online (Sandbox Code Playgroud)
我怎么能在C中这样做?
提前致谢!