小编Vis*_*Vis的帖子

将SYSCALL函数存储在函数指针数组中

我正在开发一个项目,我必须在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)

c macos kernel module kernel-extension

7
推荐指数
1
解决办法
462
查看次数

在c中将int转换为bytes数组

我想将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中这样做?

提前致谢!

c arrays

-3
推荐指数
1
解决办法
250
查看次数

标签 统计

c ×2

arrays ×1

kernel ×1

kernel-extension ×1

macos ×1

module ×1