免费教程_免费网赚教程_破解版软件-寂涯网络学习基地

当前位置: 主页 > 系统综合 > linux > 使用kprobes进行内核修改

使用kprobes进行内核修改

时间:2012-02-20 21:01来源:未知 整理:寂涯网络 点击:

本文使用Kprobes来实现对linux内核的攻击,如实现rootit和后门。用kprobes来实现攻击是一个很好的思路因为kprobes是由内核提供的API。但是,由于后文将提到的限制,我们需要实现一些额外的功能来完成文件隐藏和攻击内核等。
背景介绍
1.kprobes
Linux 内核源码中附带的kprobes.txt很好地介绍了kprobes。建议读者好好地读一读。Kprobes是linux内核提供的一个调试用APi,其基于处理器所提供的调试寄存器。本文我们将主要讨论x86。
基于上述定义,我们可以想象,kprobes可以被用于修改内核来实现一些有用的功能,如安全检查和攻击。这就是本文的主要内容。目前,已经有很多内核补丁是用kpr0beS来实 现的了。这不是说传统的内核补丁方法如kernel function trampolines不行,而是这些方 法在SMP上是不安全的,因为将代码交换出入不是原子操作。在某些地方可以被用于为内核打补丁,然而并非所有地方都可以用。某些时候,kpr0beS必须结合其他的方法来使用。在本文继续深入之前,我首先指出一些需要知道的地方:
Kprobes 在此处进行注册:/sys/kernel/debug/kprobes/listo
? 可以通过在此处写入0/1来禁用/使用kprobes:
/sys/kernel/debug/kprobes/enabledo
? Kprobes 的源码:/usr/src/linux/kernel/kprobes.c*
/usr/src/linux/arch/x86/kerel/kprobes. c0
记住jprobes/kretprobes完全是基于kprobes并且如果禁用了 Kprobes将同时禁用 kretprobes/jprobes0 2. Jprobes 例子
本文将主要涉及jprobes和kretprobe。適口 kprobe文档中所述,其提供了几个注册和 卸载probes的函数。
例如,我们现在对sys_mprotect函数很感兴趣并想知道任何对该函数的调用及调用参数
3此,我们可以为sys_mprotect注册一个jprobe。图1中的代码实现了该功能。
int n_sys_mprotect(unsigned long start, size_t len, long prot) { struct pt_regs *regs = task_pt_regs(current); start — regs->bx; len = regs->cx; prot = regs->dx;
printk(??start: Ox%lx len: %u prot: Ox%lxAn' start, len, prot);
jprobe_retum();
return 0;
}
static structjprobe mprotectJprobe =
{
.entry = (kprobe_opcode_t *)n_sys_mprotect // 函数入 口
};
static int—init jprobe_init(void) { mprotectJprobe .kp. addr (kprobe_opcode_t*)kallsyms_lookup_name(??sys_mprotect??); if ((ret = registerJprobe(&mprotectJprobe)) < 0) { printk(??registerJprobe failed for sys_mprotect^i??); return -1;
}
return 0;
}
int init_module(void) { jprobe_init(); return 0;
}
void exit module(void) { unregister jprobe(&mprotect jprobe); }
上述代码,我们为sys_mprotect注册一个jprobe。也就是说在该函数的入口处我们放 置了一个断点指令,当该函数被调用时将产生一个trap,同时将控制权转到 1^巧8^0^化&()。此时,我们就可以分析数据了如寄存器或栈中的参数以及任何内核数据 结构。我们也可以修改内核的数据结构,这也就是为什么我们可以使用kprobes来实现补丁。 在我们的处理函数n_sys_mprotect返回时,对于栈或寄存器中参数所做的修改将覆盖原始 值(这是因为kprobes在调用处理函数之前会保存寄存器状态和栈中的参数,并在 jprobe_return ()时进行恢复)。此后真正的系统调用或函数将可以执行。
3. Kretprobes 例子
现在开始看下kprobes。如果没有kretprobes就无法很容易地为内核打补丁。这是因为我们设置了jprobe的内核函数仍然可能在jprobe返回后再次修改内核数据结构。正是 因为我们还有kretprobe,因此在上述情况下,我们就可以在内核函数返回后再修改内核数据结构。例如,我们想修改虚构的内核数据结构” kstruct->x"。我们只有等到函数八执行 之后(即』口^化处理函数已返回),我们才能知道该赋何值给” kstruct->x"。在这种情况下,我们就可以使用kretprobes。如下所示:
1. [函数A的jprobe处理函数] 今决定我们想要赋给kstruct->的值。
2. [函数八执行] +将某值赋给kstruct->x赋。
3. [函数A的kretprobe处理函数]今将我们决定的值赋给kstruct_>x。 下面是一个注册kretprobe的简单例子。我们将使用sys_mprotect作为例子。我们将
在2. 4节介绍Kretprobe的数据类型。
static int mprotect_ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs) { printk(??Original return address: Ox%hAn' (unsigned long)ri->ret_addr); return 0;
}
static struct kretprobe mprotect_kretprobe = {
.handler = mprotect_ret_handler, // return probe handler .maxactive = NR_CPUS II max number ofkretprobe instances

本页地址 http://www.jybase.net/linux/20120220779.html

百度搜索更多

谷歌搜索更多

顶一下
(0)
0%
踩一下
(1)
100%
------分隔线----------------------------

评价:
昵称: 验证码:点击我更换图片
推荐内容
赞助商
赞助商


关于本站免责声明视频更新google百度地图视频地图RRS订阅

如有什么问题请在本站留言,或发邮件到 hxt167#foxmail.com