CRUX下实现进程隐藏(1)
想必能找到这里的都是被吴一民的操作系统大作业坑过的学弟学妹了,当初我也是千辛万苦才把这个作业完成了,本着服务后辈的宗旨,尽量让学弟学妹少走弯路,我会把实现的大概思路记录下来。本系列一共三篇文章,分别实现了三种进程隐藏的方法。
- 实验目标
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)的更多相关文章
- CRUX下实现进程隐藏(2)
前面我们介绍了如何修改/proc目录读取函数的方法实现进程隐藏.这篇博文将介绍另一种方法—— 劫持系统调用实现进程隐藏. 其基本原理是:加载一个内核模块(LKM),通过劫持系统调用sys_getden ...
- CRUX下实现进程隐藏(3)
通过一个内核模块拦截文件系统的回调函数来实现进程隐藏. VFS(Virtual File System)是Linux在实际文件系统(如ext3,ext4,vfat等)上抽象出的一个文件系统模型,简单来 ...
- Linux下进程隐藏的方法及其对抗
零.背景 在应急响应中,经常碰到ps命令和top命令查不到恶意进程(异常进程)的情况,会对应急响应造成很大的影响.轻则浪费时间,重则排查不出问题,让黑客逍遥法外.所以这篇博客研究学习如何对抗linux ...
- SSDT Hook实现简单的进程隐藏和保护【转载】
原文链接:http://www.blogfshare.com/ssdthook-hide-protect.html 原文作者:AloneMonkey SSDT Hook实现简单的进程隐藏和保护 Alo ...
- 进程隐藏与进程保护(SSDT Hook 实现)(二)
文章目录: 1. 引子 – Demo 实现效果: 2. 进程隐藏与进程保护概念: 3. SSDT Hook 框架搭建: 4. Ring0 实现进程隐藏: 5. Ri ...
- 在CMD命令行下关闭进程的命令
转载: [重要]在CMD命令行下关闭进程的命令━━━━━━━━━━━━━━━━━━━━━━━━━━ 方法一: 在"运行"中输入:ntsd -c q -pn 程序名字(在MS-Dos ...
- Windows2003 内核级进程隐藏、侦测技术
论文关键字: 内核 拦截 活动进程链表 系统服务派遣表 线程调度链 驱动程序简介 论文摘要:信息对抗是目前计算机发展的一个重要的方向,为了更好的防御,必须去深入的了解敌人进攻的招式.信息对抗促使 ...
- Driver 01 进程隐藏
大二时候的代码以及笔记,当时暂时记录在QQ上在,现在发出来分享一下. 为了写驱动装一大堆的软件插件啥的,还常常失败. 这里就顺带总结下SDK下载和WinDbg symbol路径设置正确WinDbg却总 ...
- 进程隐藏与进程保护(SSDT Hook 实现)(三)
文章目录: 1. 引子: 2. 获取当前系统下所有进程: 3. 服务管理(安装,启动,停止,卸载): 4. 应用程序和内核程序通信: 5. 小结: 1. 引子: 关于这个 SSDT Hook 实现进程 ...
随机推荐
- [转]RosBridge小结
1.rosbridge介绍 rosbridge(rosbridge_suite)是ros官方为开发者提供的一个用于非ros系统和ros系统进行交互通信的功能包.rosbridge主要包含两个部分,Ro ...
- iOS边练边学--plist文件,懒加载,模型初使用--补充instancetype
一.什么是plist文件 1>将数据直接写在代码里面,不是一种合理的做法.如果数据经常修改,就要经常翻开对应的代码进行修改,造成代码扩展性低 2>因此,可以考虑将经常变得数据放在文件中进行 ...
- Apache2.4.x版wampserver本地php服务器如何让外网访问及启用.htaccess
http://www.jb51.net/article/61193.htm ———————————————————————————————————————————— 这篇文章主要介绍了Apache2. ...
- NetBeans启动Tomcat报“'127.0.0.1' 不是内部或外部命令”启动失败的解决办法
http://blog.sina.com.cn/s/blog_709548200102vgy4.html ——————————————————————————————————————————————— ...
- Struts2学习笔记(OGNL表达式)
Struts 2支持以下几种表达式语言: OGNL(Object-Graph Navigation Language),可以方便地操作对象属性的开源表达式语言: JSTL(JSP Standard T ...
- Java String 学习
String, 首先,String有字面值常量的概念,这个字面值常量是在编译期确定下来的,类加载时直接存入常量池(注意,常量池是类的常量池,类与类之间隔离). 而运行时生成的字符串,是不在常量池中的. ...
- 使用ffmpeg步骤
av_register_all();//初始化ffmpeg库,如果系统里面的ffmpeg没配置好这里会出错 if (isNetwork) { //需要播放网络视频 avforma ...
- Eclipse/MyEclipse全屏插件
此插件可以让Eclipse/MyEclipse的界面全屏,隐藏菜单栏和状态栏! MyEclipse 2014/2015中亲测有效! 插件下载: http://files.cnblogs.com/got ...
- mui.back()返回刷新功能
使用场景:操作某个步骤需要获取用户信息,如果用户未登陆,则跳转登录页面,登陆成功之后使用mui.back()返回父页面,父页面必须刷新. 子页面:登陆页 父页面:跳转登录页的页面 1. 在子页面初始化 ...
- javaEE mvc样例具体解释
一个不错的样例值得细细品味: 以下依照包顺序将代码贴出来供大家參考: IEmpDAO package org.lzch.dao; import java.util.List; import org.l ...