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 实现进程 ...
随机推荐
- 可变长度子网掩码(VLSM)在子网划分中的应用
在学习可变长度子网掩码时,必须先熟练掌握二进制与十进制的转化.计算机中数据的单位(字节.位)等知识. 一.什么是可变长度子网掩码? 要理解可变长度子网掩码,先要理解子网掩码:要理解子网掩码,先要理解I ...
- js学习笔记18----元素创建操作
1.父级.appendChild(新的元素) 从后面开始追加子元素. 2.父级.insertBefore(新的元素,被插入的元素) 在指定元素前面开始插入一个新元素. 兼容性:在ie下,如果第二个参数 ...
- thinkPHP的优缺点
适合大量重复的工作,但不太灵活...
- php 删除指定文件 glob,unlink
我用最简单的语句写了一个php删除指定文件 因为一直越级挑战thinkphp,所以突然面对php有点无所适从了... 首先,php的运行机制,是一个语法就搞定了,还是非要用数据库,还是post什么的. ...
- am335x uart分析
/************************************************************ * am335x uart分析 * 本文记录am335x uart驱动的注册 ...
- 利用Spring AOP和自定义注解实现日志功能
Spring AOP的主要功能相信大家都知道,日志记录.权限校验等等. 用法就是定义一个切入点(Pointcut),定义一个通知(Advice),然后设置通知在该切入点上执行的方式(前置.后置.环绕等 ...
- C++ 语言中的重载、内联、缺省参数、隐式转换等机制展现了很多优点
C++ 语言中的重载.内联.缺省参数.隐式转换等机制展现了很多优点,但是这些 优点的背后都隐藏着一些隐患.正如人们的饮食,少食和暴食都不可取,应当恰到好处. 我们要辨证地看待 C++的新机制,应该恰如 ...
- linux -- 注销,关机,重启
注销:logout Logout 注销是登陆的相对操作,登陆系统后,若要离开系统,用户只要直接下达logout命令即可: [root@localhost root]#logout Red Hat ...
- bootstrap -- css -- 表单控件
若干css样式 .form-control { display: block; width: 100%; height: 34px; padding: 6px 12px; font-size: 14p ...
- 当点击onBackpress方法或者onKeyDown方法时出现不能响应的问题解决办法
一般来讲,当我们点击手机上的back键之后,会直接调用activity的onbackpress()方法,或者我们也可以通过这样来进行捕捉点击事件 @Override public boolean on ...