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

  • 实验目标

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. 在XP系统下如何访问win10共享的打印机

    < > 找到 GUEST 用户,添加即可. 2. Win10 共享本地打印机 右击要共享的打印机,共享选项卡,设置共享名,这个共享很重要,要记住,尽量设置简单点.IP + 共享名就是网络打 ...

  2. Jenkins+ Xcode+ 蒲公英 实现IOS自动化打包和分发

    Jenkins+ Xcode+ 蒲公英 实现IOS自动化打包和分发 直接入正题: Screen Shot 2015-09-18 at 16.56.20.png Mac上安装Jekins jekins下 ...

  3. iOS边练边学--UIGestureRecognizer手势识别器简单介绍

    iOS 3.2之后,苹果退出了手势识别功能(Gesture Recognizer),在触摸事件处理方面,大大简化了开发者的开发难度. 一.UIGestureRecognizer UIGestureRe ...

  4. JavaScript(二):JavaScript语法及数据类型

    一.JavaScript语法 1.区分大小写ECMAScript中的一切,包括变量.函数名和操作符都是区分大小写的.例如:text和Text表示两种不同的变量.2.标识符所谓标识符,就是指变量.函数. ...

  5. Spring Boot 日志记录 SLF4J

    Spring Boot 日志记录 SLF4J 2016年01月12日 09:25:28 阅读数:54086 在开发中打印内容,使用 System.out.println() 和 Log4j 应当是人人 ...

  6. 转载------让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法

    本文是转载及收藏 让IE6 IE7 IE8 IE9 IE10 IE11支持Bootstrap的解决方法 最近做一个Web网站,之前一直觉得bootstrap非常好,这次使用了bootstrap3,在c ...

  7. HTML坦克大战学习01

    <!DOCTYPE html> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <t ...

  8. hBase官方文档以及HBase基础操作封装类

    HBase 官方文档 0.97 http://abloz.com/hbase/book.html HBase基本操作封装类(以课堂爬虫为例) package cn.crxy.spider.utils; ...

  9. Mastering the game of Go with deep neural networks and tree search浅析

    Silver, David, et al. "Mastering the game of Go with deep neural networks and tree search." ...

  10. html -- 实体