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

可见

我正在一个项目中,必须在OSX(10.10.5)上钩住80%-90%的系统调用函数。我正在通过内核扩展进行此操作。由于必须(取消)钩住许多函数,因此我想将原始内核函数存储到一个函数指针数组中,为此,我可以快速查找该数组以在脱钩时恢复原始函数。

    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;

这可以工作,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;

恢复: 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 ***
panic(cpu 0 caller 0xffffff80093f0024): Kernel trap at 0x0000000000000000, type 14=page fault, registers:
CR0: 0x0000000080010033, CR2: 0x0000000000000000, CR3: 0x00000000769bb018, CR4: 0x00000000001606e0
RAX: 0x0000000000000000, RBX: 0xffffff80115e3fc0, RCX: 0x0000000000000001, RDX: 0xffffff80115e3fc0
RSP: 0xffffff8068dabaf8, RBP: 0xffffff8068dabf50, RSI: 0xffffff80115e3f80, RDI: 0xffffff8010059cf0
R8:  0xffffff7f8afaccdf, R9:  0xffffff8009ae2a18, R10: 0xffffff8009939740, R11: 0x0000000000000000
R12: 0xffffff8010059cf0, R13: 0x0000000000000005, R14: 0xffffff80115e3f80, R15: 0xffffff801188b480
RFL: 0x0000000000010282, RIP: 0x0000000000000000, CS:  0x0000000000000008, SS:  0x0000000000000010
Fault CR2: 0x0000000000000000, Error code: 0x0000000000000010, Fault CPU: 0x0 VMM

Backtrace (CPU 0), Frame : Return Address
0xffffff8068dab790 : 0xffffff80092e4ed1 mach_kernel : _panic + 0xd1
0xffffff8068dab810 : 0xffffff80093f0024 mach_kernel : _kernel_trap + 0x664
0xffffff8068dab9e0 : 0xffffff800940de53 mach_kernel : trap_from_kernel + 0x26
0xffffff8068daba00 : 0x0 
0xffffff8068dabf50 : 0xffffff800982c0c1 mach_kernel : _unix_syscall64 + 0x2f1
0xffffff8068dabfb0 : 0xffffff800940e656 mach_kernel : _hndl_unix_scall64 + 0x16

BSD process name corresponding to current thread: xpcproxy
Boot args: debug=0x14e kext-dev-mode=1 -v keepsyms=1 kmem=1

Mac OS version:
14F27

Kernel version:
Darwin Kernel Version 14.5.0: Wed Jul 29 02:26:53 PDT 2015; root:xnu-2782.40.9~1/DEVELOPMENT_X86_64
Kernel UUID: C75BDFDD-9F27-3694-BB80-73CF991C13D8
Kernel slide:     0x0000000009000000
Kernel text base: 0xffffff8009200000
__HIB  text base: 0xffffff8009100000
System model name: VMware7,1 (Mac-66F35F19FE2A0D05)

System uptime in nanoseconds: 251264993940
last loaded kext at 249789197520: my.kext   1 (addr 0xffffff7f8afa9000, size 57344)
last unloaded kext at 116769666233: com.apple.driver.AppleFileSystemDriver  3.0.1 (addr 0xffffff7f8aed3000, size 16384)
loaded kexts:
my.kext 1

[more kexts here]

在请求中,mon_open()的代码:

int
mon_open(struct proc *p, struct open_args *uap, int *r) {
    int error;
    char processname[MAXCOMLEN+1];
    char intercepted_path[MAXPATHLEN];

    pid_t pid = proc_pid(p);

    proc_name(pid, processname, sizeof(processname));

    size_t dummy = 0;
    error = copyinstr((void *)uap->path, (void *)intercepted_path, MAXPATHLEN, &dummy);
    if (!error) {
        printf("[MYKEXT] open called with path: %s, PID: %d, processname: %s\n", intercepted_path, pid, processname);
    }

    return kern_open(p, uap, r);
}

提前非常感谢您!

可见

太愚蠢了,我忘了指向kern_open(的返回值mon_open)数组中的函数指针。kern_openNULL,因此这导致了NULL-pointer异常。现在,函数指针数组可以正常工作。

@pmdj,非常感谢您的帮助。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将指向函数的指针存储在void *中

来自分类Dev

C ++ / Arduino将存储在PROGMEM中的2D数组的指针传递给函数

来自分类Dev

将函数存储在数组中

来自分类Dev

将函数存储在数组中

来自分类Dev

将指针返回数组的函数

来自分类Dev

将数组中的元素作为C函数中的指针传递

来自分类Dev

JavaScript中的函数指针数组?

来自分类Dev

修改函数中数组的指针

来自分类Dev

填充函数中的指针数组

来自分类Dev

如何调用函数指针数组中的函数?

来自分类Dev

将数组的指针传递给C中的函数

来自分类Dev

为什么将数组视为函数参数C ++中的指针?

来自分类Dev

将指针传递给构造函数中的数组

来自分类Dev

函数存储在数组中

来自分类Dev

在std :: map中存储函数指针

来自分类Dev

将指针数组存储在 C 中的指针数组中

来自分类Dev

我应该将函数的结果存储到数组中吗?

来自分类Dev

尝试将函数的结果存储在2D数组中

来自分类Dev

我应该将函数的结果存储到数组中吗?

来自分类Dev

如何将函数的输出存储到数组中

来自分类Dev

将指向数组的指针传递给函数

来自分类Dev

将“指针数组”传递给函数

来自分类Dev

将指针数组传递给函数

来自分类Dev

将char指针数组传递给函数

来自分类Dev

将char数组的指针传递给函数

来自分类Dev

将char指针数组传递给函数

来自分类Dev

将指针或数组传递给函数

来自分类Dev

将char指针/数组传递给函数

来自分类Dev

将指针数组传递给函数