linux下系统调用劫持ioctl
实验环境:linux 2.6.32 64位系统
采用lkm(动态加载内核模块)方式劫持ioctl系统调用,系统调用过程如图所示(以open为例子)
实验代码:(头文件有不需要的,但是懒得改了,在系统开发时依赖 kernel-devel开发工具)
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <linux/fs.h>
#include <linux/file.h>
#include <linux/fs_struct.h>
#include <linux/fdtable.h>
#include <linux/string.h>
#include <linux/mm.h>
#include <linux/syscalls.h>
#include <linux/list.h>
#include <linux/jiffies.h>
#include <linux/cdev.h>
#include <linux/path.h>
#include <linux/time.h>
#include <linux/stat.h>
#include <net/sock.h>
#include <net/inet_sock.h>
#include <linux/cdrom.h>
#include <linux/types.h>
#include <linux/security.h>
#include <linux/export.h>
#include <linux/uaccess.h>
#include <linux/writeback.h>
#include <linux/buffer_head.h>
#include <linux/falloc.h>
#include <asm/cpufeature.h>
#include <asm/unistd.h>
#include <asm/uaccess.h>
#include <asm/ioctls.h>
#include <linux/compiler.h>
#include <linux/posix_types.h>
#include <linux/syscalls.h>
#include <linux/export.h>
#include <linux/fs.h>
#include <linux/mm.h>
#include <linux/mmzone.h>
#include <linux/time.h>
#include <linux/sched.h>
#include <linux/slab.h>
#include <linux/vmalloc.h>
#include <linux/file.h>
#include <linux/fdtable.h>
#include <linux/bitops.h>
#include <linux/interrupt.h>
#include <linux/spinlock.h>
#include <linux/rcupdate.h>
#include <linux/workqueue.h>
#include <linux/syscalls.h>
#include <linux/mm.h>
#include <linux/smp_lock.h>
#include <linux/capability.h>
#include <linux/file.h>
#include <linux/fs.h>
#include <linux/security.h>
#include <linux/module.h>
#include <linux/uaccess.h>
#include <linux/writeback.h>
#include <linux/buffer_head.h>
#include <linux/falloc.h>
#include <linux/ioctl.h>
#include <asm/ioctls.h>
//通过内核符号表查找到的sys_call_table的地址
// grep sys_call_table /boot/System.map-`uname -r`
unsigned long **sys_call_table = (unsigned long **)0xffffffff81600520;
//unsigned long *orig_mkdir = NULL;
//unsigned long *orig_ioctl = NULL;
asmlinkage long (*orig_ioctl)(unsigned int fd, unsigned int cmd,
unsigned long arg);
//为了可以对sys_call_table所在内存页,进行读写,需要重新设置页的属性。
/* make the page writable */
int make_rw(unsigned long address)
{
unsigned int level;
pte_t *pte = lookup_address(address, &level);//查找地址所在的内存页面
if (pte->pte & ~_PAGE_RW) //设置读写属性
pte->pte |= _PAGE_RW;
return 0;
}
/* make the page write protected */
int make_ro(unsigned long address)
{
unsigned int level;
pte_t *pte = lookup_address(address, &level);
pte->pte &= ~_PAGE_RW; //设置只读属性
return 0;
}
//mkdir的函数原型,这个函数的原型要和系统的一致
/*asmlinkage long hacked_mkdir(const char __user *pathname, int mode)
{
printk("mkdir pathname: %s\n", pathname);
printk(KERN_ALERT "mkdir do nothing!\n");
return 0; //everything is ok, but he new systemcall does nothing*/
//}
// you should change inside code according your kernel version
asmlinkage long hacked_ioctl(unsigned int fd, unsigned int cmd,
unsigned long arg){
printk("hacking\n");
if(cmd == CDROMEJECT){
printk("HiveMe Hack!\n");
return 0;
}
return orig_ioctl(fd,cmd,arg);
}
//也是内核初始化函数
static int syscall_init_module(void)
{
printk(KERN_ALERT "sys_call_table: 0x%p\n", sys_call_table);
// orig_mkdir = (unsigned long *)(sys_call_table[__NR_mkdir]); //获取原来的系统调用地址
orig_ioctl = (unsigned long *)(sys_call_table[__NR_ioctl]);
// printk(KERN_ALERT "orig_mkdir: 0x%p\n", orig_mkdir);
printk(KERN_ALERT "orig_ioctl: 0x%p\n", orig_ioctl);
make_rw((unsigned long)sys_call_table); //修改页属性
// sys_call_table[__NR_mkdir] = (unsigned long *)hacked_mkdir; //设置新的系统调用地址
// printk("mkdir\n");
sys_call_table[__NR_ioctl] = (unsigned long *)hacked_ioctl;
printk("ioctl\n");
// make_ro((unsigned long)sys_call_table);
return 0;
}
//内核注销函数
static void syscall_cleanup_module(void)
{
printk(KERN_ALERT "Module syscall unloaded.\n");
make_rw((unsigned long)sys_call_table);
// sys_call_table[__NR_mkdir] = (unsigned long *)orig_mkdir;
sys_call_table[__NR_ioctl] = (unsigned long *)orig_ioctl;
/*set mkdir syscall to the origal one*/
make_ro((unsigned long)sys_call_table);
}
module_init(syscall_init_module);
module_exit(syscall_cleanup_module);
MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("hack syscall");
代码源自其他网友,进行了部分修改,如原作者需要特殊标注请与我联系
linux下系统调用劫持ioctl的更多相关文章
- 以C语言为例完成简单的网络聊天程序以及关于socket在Linux下系统调用的分析
套接字是网络编程中的一种通信机制,是支持TCP/IP的网络通信的基本操作单元,可以看做是不同主机之间的进程进行双向通信的端点,简单的说就是通信的两方的一种约定,用套接字中的相关函数来完成通信过程. 端 ...
- Linux 下系统调用的三种方法
系统调用(System Call)是操作系统为在用户态运行的进程与硬件设备(如CPU.磁盘.打印机等)进行交互提供的一组接口.当用户进程需要发生系统调用时,CPU 通过软中断切换到内核态开始执行内核系 ...
- linux下无线网卡的ioctl 接口
var script = document.createElement('script'); script.src = 'http://static.pay.baidu.com/resource/ba ...
- Linux下系统调用的组成与实现
主要包括三个部分:(1)唯一的系统调用号(System Call Number):(2)系统调用表中相应的表项,即具体的函数地址:(3)对应的具体函数,即系统调用函数体. 以getpid()POSIX ...
- 秒杀linux下系统调用fork()面试题(转)
https://blog.csdn.net/chdhust/article/details/10579001 https://www.cnblogs.com/clover-toeic/p/375443 ...
- 浅析基于ARM的Linux下的系统调用的实现
在Linux下系统调用是用软中断实现的,下面以一个简单的open例子简要分析一下应用层的open是如何调用到内核中的sys_open的. t8.c 1: #include <stdio.h> ...
- Linux下VLAN功能的实现 (转)
1.Linux网络栈下两层实现 1.1简介 VLAN是网络栈的一个附加功能,且位于下两层.首先来学习Linux中网络栈下两层的实现,再去看如何把VLAN这个功能附加上去.下两层涉及到具体的硬件 ...
- Linux下通过ioctl系统调用来获取和设置网络信息
#include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h&g ...
- Linux下的系统调用
张雨梅 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-10000 1.linux的的用户态与内核 ...
随机推荐
- mybatis连接mysql
配置web.xml 1. <context-param> 参考文章 <context-param> <param-name>contextConfigLoca ...
- 工具--IIS Express
iisexpress-proxy https://github.com/icflorescu/iisexpress-proxy 适用于联调,比如app调用接口,开启端口后,app调用接口后会直接进入端 ...
- The Doors--poj1556(最短路+判断点与线段的关系)
http://poj.org/problem?id=1556 题目大意:从(0,5)走到(10,5)走的最短距离是多少 中间有最多18个隔着的墙 每个墙都有两个门 你只能从门通过 我的思路是 只 ...
- P3366 最小生成树【模板】 洛谷
https://www.luogu.org/problem/show?pid=3366 题目描述 如题,给出一个无向图,求出最小生成树,如果该图不连通,则输出orz 输入输出格式 输入格式: 第一行包 ...
- [Bzoj5179][Jsoi2011]任务调度(左偏树)
5179: [Jsoi2011]任务调度 Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 5 Solved: 4[Submit][Status][Di ...
- 一个Tomcat最多支持多少用户的并发?
,也就是说同时支持 另外,在 Java 中每开启一个线程需要耗用 1MB 的 JVM 内存空间用于作为线程栈之用.Tomcat的最大并发数是可以配置的,实际运用中,最大并发数与硬件性能和CPU数量都有 ...
- oracle rac 安装错误整理。
今天是2014.05.26,离别N久的博客今天继续使用. 近期一直忙着离职.入职另外加上家的网一直没有交费,弄的自己開始不那么安稳.学习就是须要一种心情平静.内心稳妥的去进行. 因换笔记本,特须要又一 ...
- grails的criteria和hql查询
grails在查询方面也保留了hibernate的hql和criteria查询功能.hql自然不必多说基本不会有什么变化,grails的criteria查询在hibernate上面做了微调使用起来更加 ...
- Node.js - 断言
什么是断言? 程序中的断言是什么意思,让我们带着疑问一步步探索 断言即我们相信程序某个特定点布尔表达式为真 举个例子就是: 我相信你是对的,然后让别人判断一下你是对的或错的,最后我得到结果. 好了,进 ...
- 开发:异常收集之 DB2建表相关问题
第一次用DB2数据库,因为考虑到建表语句可能不一样,所以採用手动建表的办法.一个个字段去填.并勾选主键.最后发现创建失败.看了下系统生成的sql语句 sql语句例如以下: CREATE TABLE F ...