想必能找到这里的都是被吴一民的操作系统大作业坑过的学弟学妹了,当初我也是千辛万苦才把这个作业完成了,本着服务后辈的宗旨,尽量让学弟学妹少走弯路,我会把实现的大概思路记录下来。本系列一共三篇文章,分别实现了三种进程隐藏的方法。

  • 实验目标

ps和top命令列出了unix中当前所有进程的相关信息,作业要求在linux中增加两个系统调用,功能如下:

hide():执行此系统调用后,隐藏当前进程,即当前进程不能够被ps和top命令查看到。

unhide():执行此系统调用后,取消隐藏当前进程,即当前进程恢复正常,能够被ps和top命令查看到。

  • 实验解题思路

1.修改linux的进程控制块task_struts,在进程控制块中增加一个字段:

int hide;

hide的值为1时,表示该进程被隐藏;为0时,表示该进程不被隐藏。

2.修改创建进程的相关代码,在进程创建时,置hide为0;即进程在初始创建时(默认)不被隐藏。

3.在系统中增加系统调用hide(),其功能为:

1)将进程控制块中的hide置1;

2)删除/proc文件系统中该进程的相关目录项;

4.在系统中增加系统调用unhide(),其功能为:

1)将进程控制块中的hide清0;

2)增加/proc文件系统中该进程的相关目录项

这里是三种方法的共同步骤,包括修改task_struct,修改进程创建代码,添加系统调用,重新编译内核。

首先修改task_struct

在struct task_struct(include\linux\sched.h)的定义中加入hide字段:

接着修改linux创建进程的代码,找到kernel/fork.c,通过阅读代码可以发现,fork()调用了do_fork(),而do_fork()又调用了copy_process(),copy_process()函数的作用是将父进程的进程描述符(即task_struct)拷贝给子进程,在该函数中加入对hide字段的初始化:

下一步是添加系统调用:

1.修改include/asm-generic/unistd.h,分配系统调用号

加入新的系统调用,同时将__NR_syscalls的值由273改为275

2.修改系统调用表

修改arch/x86/syscalls/syscall_64.tbl文件,根据原有表内容的格式,在322行处添加如下内容

3.添加处理函数

在源代码目录下,创建hide文件夹,新建hide.c文件与unhide.c文件。

hide.c的代码如下所示:

unhide.c的代码如下所示:

编写编译这两个文件进内核模块的Makefile:

接着在编译内核的Makefile中的core-y字段中加入编译刚才新建的两个系统调用的Makefile所在的路径:

添加系统调用后注意需要重新编译内核,以使改动生效。

方法一:

本文通过修改proc文件系统读取进程文件的函数proc_pid_readdir,在其中加入对进程hide字段的判断来实现隐藏进程。

跟踪内核可知,proc目录下进程号目录是动态生成的,是在每次readdir,getdents时动态生成,所以从某种意义上说增加或删除/proc文件系统中该进程的相关目录项这种说法是不正确的。proc目录内容的填充函数是proc_pid_readdir(fs/proc/base.c),因此我们只要修改proc_pid_readdir函数的代码,加上对要隐藏进程的判断就可以实现隐藏进程的目的。

proc_pid_readdir的定义如下:

/* for the /proc/ directory itself, after non-process stuff has been done */
int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir)
{
unsigned int nr;
struct task_struct *reaper;
struct tgid_iter iter;
struct pid_namespace *ns;
filldir_t __filldir;
........................
for (; nr < ARRAY_SIZE(proc_base_stuff); filp->f_pos++, nr++) { //填充self目录
const struct pid_entry *p = &proc_base_stuff[nr];
if (proc_base_fill_cache(filp, dirent, filldir, reaper, p) < )
goto out;
} ns = filp->f_dentry->d_sb->s_fs_info;
iter.task = NULL;
iter.tgid = filp->f_pos - TGID_OFFSET;
/* 遍历进程散列表,向proc目录填充进程目录项,是我们要修改的地方 */
for (iter = next_tgid(ns, iter);
iter.task;
iter.tgid += , iter = next_tgid(ns, iter)) {
if (has_pid_permissions(ns, iter.task, ))
__filldir = filldir;
else
__filldir = fake_filldir; filp->f_pos = iter.tgid + TGID_OFFSET;
if (proc_pid_fill_cache(filp, dirent, __filldir, iter) < ) {
put_task_struct(iter.task);
goto out;
}
}
filp->f_pos = PID_MAX_LIMIT + TGID_OFFSET;
out:
put_task_struct(reaper);
out_no_task:
return ;
}

在上面的for循环中加入对进程hide字段的判断,就能实现进程隐藏:

接着执行make menuconfig选择要编译的模块,然后make -j10开10个线程进行编译,编译完成后make modules_install

测试程序:

结果:

CRUX下实现进程隐藏(1)的更多相关文章

  1. CRUX下实现进程隐藏(2)

    前面我们介绍了如何修改/proc目录读取函数的方法实现进程隐藏.这篇博文将介绍另一种方法—— 劫持系统调用实现进程隐藏. 其基本原理是:加载一个内核模块(LKM),通过劫持系统调用sys_getden ...

  2. CRUX下实现进程隐藏(3)

    通过一个内核模块拦截文件系统的回调函数来实现进程隐藏. VFS(Virtual File System)是Linux在实际文件系统(如ext3,ext4,vfat等)上抽象出的一个文件系统模型,简单来 ...

  3. Linux下进程隐藏的方法及其对抗

    零.背景 在应急响应中,经常碰到ps命令和top命令查不到恶意进程(异常进程)的情况,会对应急响应造成很大的影响.轻则浪费时间,重则排查不出问题,让黑客逍遥法外.所以这篇博客研究学习如何对抗linux ...

  4. SSDT Hook实现简单的进程隐藏和保护【转载】

    原文链接:http://www.blogfshare.com/ssdthook-hide-protect.html 原文作者:AloneMonkey SSDT Hook实现简单的进程隐藏和保护 Alo ...

  5. 进程隐藏与进程保护(SSDT Hook 实现)(二)

    文章目录:                   1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring0 实现进程隐藏: 5. Ri ...

  6. 在CMD命令行下关闭进程的命令

    转载: [重要]在CMD命令行下关闭进程的命令━━━━━━━━━━━━━━━━━━━━━━━━━━ 方法一: 在"运行"中输入:ntsd -c q -pn 程序名字(在MS-Dos ...

  7. Windows2003 内核级进程隐藏、侦测技术

    论文关键字: 内核 拦截 活动进程链表 系统服务派遣表 线程调度链 驱动程序简介    论文摘要:信息对抗是目前计算机发展的一个重要的方向,为了更好的防御,必须去深入的了解敌人进攻的招式.信息对抗促使 ...

  8. Driver 01 进程隐藏

    大二时候的代码以及笔记,当时暂时记录在QQ上在,现在发出来分享一下. 为了写驱动装一大堆的软件插件啥的,还常常失败. 这里就顺带总结下SDK下载和WinDbg symbol路径设置正确WinDbg却总 ...

  9. 进程隐藏与进程保护(SSDT Hook 实现)(三)

    文章目录: 1. 引子: 2. 获取当前系统下所有进程: 3. 服务管理(安装,启动,停止,卸载): 4. 应用程序和内核程序通信: 5. 小结: 1. 引子: 关于这个 SSDT Hook 实现进程 ...

随机推荐

  1. Hive shell 命令

    Hive shell 命令. 连接 hive shell 直接输入 hive 1.显示表 hive> show tables; OK test Time taken: 0.17 seconds, ...

  2. rails中path、url路径解析,routes信息,form_for剖析,link_to示例,路由实例说明

    原创,转载请注明http://www.cnblogs.com/juandx/p/3963023.html  rails中path.url路径解析,routes信息,form_for剖析,link_to ...

  3. html -- 实体

  4. lseek函数与文件空洞

    在UNIX/LINUX系统中,文件位移量可以大于文件的当前长度,这种情况下向文件中写入数据就会产生文件空洞(hole),这些没写入数据的文件空洞部分默认会被0填满.虽然这些文件空洞并没有实际的数据,但 ...

  5. 转载:【原译】Erlang构建和匹配二进制数据(Efficiency Guide)

    转自:http://www.cnblogs.com/futuredo/archive/2012/10/19/2727204.html Constructing and matching binarie ...

  6. SharePoint 2013 网站迁移流程

    在新的Farm(场)里,创建一个新的Web Application(网站应用程序),不需要创建Site Collection(网站集) Copy(复制)自定义开发的WSP包到新的Farm Server ...

  7. html5简单拖拽实现自动左右贴边+幸运大转盘

    此篇文章主要实现两个功能: 1.点击屏幕下方签到悬浮按钮: 2.弹出幸运大转盘,转盘抽奖签到 效果如图: ​ 在网上找了很多移动端拖拽的js实现方式,大部分都是这一种,html5的touch事件,但是 ...

  8. MVC+LINQToSQL的Repository模式之(一)数据工厂 DataContext绑定线程

    namespace Data{    /// <summary>    /// 数据库建立工厂    /// Created By : 张占岭    /// Created Date:20 ...

  9. Error 2 error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)'

    Error 2 error C2784: 'bool std::operator <(const std::_Tree<_Traits> &,const std::_Tree ...

  10. HTML 之前未接触过的标签

    用于表单的HTML标签 HTML <fieldset> 标签             定义和用法 fieldset 元素可将表单内的相关元素分组. <fieldset> 标签将 ...