linux hook 系统调用之ioctl

YZH_0710 2015-01-15 07:07:37
#include <linux/kernel.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/sched.h>
#include <asm/unistd.h>
MODULE_LICENSE("GPL");
MODULE_AUTHOR("xunil@bmy");
MODULE_DESCRIPTION("Different from others, this module automatically locate the entry of sys_call_table !");
void ** sys_call_table = (void **)0xc03c7740;
int (*orig_my_ioctl)(int fd, int cmd);
int a=0;

asmlinkage int hacked_ioctl(int fd,int cmd){
printk("PID %d called sys_mkdir !/n",current->pid);
printk("The pathname=%d;The mode=%d",fd,cmd);
a=cmd;
return orig_my_ioctl(fd,cmd);

}

static int __init find_init(void){
orig_my_ioctl=sys_call_table[__NR_ioctl];
sys_call_table[__NR_ioctl]=hacked_ioctl;
printk("The cmd value=%d",a);
//sys_call_table[__NR_ioctl]=orig_my_ioctl;
return 0;
}
static void __exit find_cleanup(void){
sys_call_table[__NR_ioctl]=orig_my_ioctl;
}
module_init(find_init);
module_exit(find_cleanup);
上面是我再晚上看的一些资料然后写的代码,编译后insmod 后系统直接挂了,不知道什么原因,是因为系统调用ioctl 修改了么,还是什么原因。我的目的是要hook打印机的驱动,自动控制它。如何判断他是调用打印机驱动的呢,我只想过滤打印机的相关操作,其他的设备掉放过,如果哪位大神可以帮助我,感激不尽,我所有的分数都给你,谢了!!!
...全文
588 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
YZH_0710 2015-01-20
  • 打赏
  • 举报
回复
问题再此解决了,非常完美,就是你说的那个问题,我也加入就没问题了!!!再次感谢大神的帮助,可以加个QQ么, 我QQ:437858914 希望大神多多赐教!!!
zuxi 2015-01-20
  • 打赏
  • 举报
回复
引用 18 楼 YZH_0710 的回复:
好的多谢了!!!能加个QQ向大虾学习下么?
我自己写了一个例子是可以hook ioctl的。 感觉有问题的是这几个: 1、int (*orig_my_ioctl)(int fd, int cmd,int request);和asmlinkage int hacked_ioctl(int fd,int cmd,int request)函数参数类型与内核的不一致; 2、int (*orig_my_ioctl)(int fd, int cmd,int request);要加asmlinkage。 我的如下:

asmlinkage long (*orig_ioctl)(unsigned int fd, unsigned int cmd, unsigned long request);
asmlinkage long hacked_ioctl(unsigned int fd, unsigned int cmd, unsigned long request)
YZH_0710 2015-01-19
  • 打赏
  • 举报
回复
好的多谢了!!!能加个QQ向大虾学习下么?
zuxi 2015-01-19
  • 打赏
  • 举报
回复
引用 16 楼 YZH_0710 的回复:
大虾还有什么建议,帮帮忙!!!
这两天比较忙,晚上回家我试试看
YZH_0710 2015-01-19
  • 打赏
  • 举报
回复
大虾还有什么建议,帮帮忙!!!
YZH_0710 2015-01-16
  • 打赏
  • 举报
回复
因为iotcl是管理i/o的函数,若是系统访问硬盘也被黑了,那就出问题了,我觉得问题应该出在这里,不知道有没有什么方法先得到系统调用ioctl这个函数的参数,然后根据ioctl的参数来做有筛选的黑ioctl函,只黑系统调用打印机的ioctl 其他放过,不知道能否实现
YZH_0710 2015-01-16
  • 打赏
  • 举报
回复
其实这里面写的跟我的思想是差不多的,只是找sys_call_table方法不一样,他主要是HOOK ord = (void *)orig_sys_call_table[__NR_read]; ordv = (void *)orig_sys_call_table[__NR_readv]; oprd64 = (void *)orig_sys_call_table[__NR_pread64]; oo = (void *)orig_sys_call_table[__NR_open]; osk = (void *)orig_sys_call_table[__NR_socketcall]; ofk = (void *)orig_sys_call_table[__NR_fork]; ovfk = (void *)orig_sys_call_table[__NR_vfork]; oclone = (void *)orig_sys_call_table[__NR_clone]; 这些函数,这些函数我这个程序也可以hook到的,也没问题,主要是hook ioctl这个函数才出问题的,所以我觉得你说的枷锁是有可能的
zuxi 2015-01-16
  • 打赏
  • 举报
回复
引用 7 楼 YZH_0710 的回复:
可不可以再详细点,或者是给个实例,Linux 锁 完全没接触过,不懂怎么锁!!!
https://github.com/honeynet/sebek/blob/master/linux-2.6/src/syscall.c 这是sebek的hook系统调用代码。
YZH_0710 2015-01-16
  • 打赏
  • 举报
回复
可不可以再详细点,或者是给个实例,Linux 锁 完全没接触过,不懂怎么锁!!!
zuxi 2015-01-16
  • 打赏
  • 举报
回复
引用 1 楼 wangzuxi 的回复:
hook系统调用一是要找到系统调用表的地址,二是修改系统调用表之前要把cr0寄存器的wp位清零,修改完成之后再把wp置1。 sys_call_table在一些老版本的内核上是固定的,从哪个版本之后就不固定了,有点忘了。 建议你参考sebek的实现,里面有修改sys_call_table的方法。
忘了,改sys_call_table之前还要把内核锁住:lock_kernel,改完之后unlock_kernel
YZH_0710 2015-01-16
  • 打赏
  • 举报
回复
#include <linux/kernel.h> #include <linux/module.h> #include <linux/init.h> #include <linux/sched.h> #include <asm/unistd.h> MODULE_LICENSE("GPL"); MODULE_AUTHOR("xunil@bmy"); MODULE_DESCRIPTION("Different from others, this module automatically locate the entry of sys_call_table !"); void ** sys_call_table = (void **)0xc03c7740; int (*orig_my_ioctl)(int fd, int cmd,int request); long g_oldcr0=0; unsigned int close_cr(void) { unsigned int cr0 = 0; unsigned int ret; asm volatile ("movl %%cr0, %%eax" //eax清零 : "=a"(cr0) //输出(%0=cr0) ); ret = cr0; // clear the 20th bit of CR0, cr0 &= 0xfffeffff; asm volatile ("movl %%eax, %%cr0" : : "a"(cr0) ); return ret; } void open_cr(unsigned int oldval) { asm volatile ("movl %%eax, %%cr0" : : "a"(oldval) ); } asmlinkage int hacked_ioctl(int fd,int cmd,int request){ printk("PID %d called sys_mkdir !/n",current->pid); printk("The pathname=%d;The mode=%d,The __request=%d",fd,cmd,request); return orig_my_ioctl(fd,cmd,request); } static int __init find_init(void){ orig_my_ioctl=sys_call_table[__NR_ioctl]; g_oldcr0=close_cr(); sys_call_table[__NR_ioctl]=hacked_ioctl; open_cr(g_oldcr0); //sys_call_table[__NR_ioctl]=orig_my_ioctl; return 0; } static void __exit find_cleanup(void){ g_oldcr0=close_cr(); sys_call_table[__NR_ioctl]=orig_my_ioctl; open_cr(g_oldcr0); } module_init(find_init); module_exit(find_cleanup); 改成这样,问题依旧!!!
zuxi 2015-01-16
  • 打赏
  • 举报
回复
SYSCALL_DEFINE3(ioctl, unsigned int, fd, unsigned int, cmd, unsigned long, arg) asmlinkage long sys_ioctl(unsigned int fd, unsigned int cmd, unsigned long arg); ioctl函数是三个参数,你的是两个参数,明显不对嘛,你再改试试
YZH_0710 2015-01-16
  • 打赏
  • 举报
回复
我想是不是HOOK ioctl这个函数的方法不对,因为系统使用硬盘是不是也要调用这个函数,还有其他的设备,若全给hook了系统是不是这样就出问题了呢?
YZH_0710 2015-01-16
  • 打赏
  • 举报
回复
我上面的这段代码是可以HOOK其他函数的,就是不能Hook ioctl这个函数,一加载系统就挂了。我这个 sys_call_table的地址是在boot的map里面找得地址,应该是可以的!!!
YZH_0710 2015-01-16
  • 打赏
  • 举报
回复

改成这个运行没有任何问题
但是改成ioctl 这个函数电脑直接黑屏
zuxi 2015-01-16
  • 打赏
  • 举报
回复
引用 13 楼 YZH_0710 的回复:
加上去就编译不过了
编译错误是你少两个分号了
YZH_0710 2015-01-16
  • 打赏
  • 举报
回复


加上去就编译不过了
YZH_0710 2015-01-16
  • 打赏
  • 举报
回复

这两个函数似乎系统里面没有
zuxi 2015-01-16
  • 打赏
  • 举报
回复
引用 10 楼 YZH_0710 的回复:
因为iotcl是管理i/o的函数,若是系统访问硬盘也被黑了,那就出问题了,我觉得问题应该出在这里,不知道有没有什么方法先得到系统调用ioctl这个函数的参数,然后根据ioctl的参数来做有筛选的黑ioctl函,只黑系统调用打印机的ioctl 其他放过,不知道能否实现
你把lock_kernel()和unlock_kernel()加上去试试就知道了
zuxi 2015-01-15
  • 打赏
  • 举报
回复
hook系统调用一是要找到系统调用表的地址,二是修改系统调用表之前要把cr0寄存器的wp位清零,修改完成之后再把wp置1。 sys_call_table在一些老版本的内核上是固定的,从哪个版本之后就不固定了,有点忘了。 建议你参考sebek的实现,里面有修改sys_call_table的方法。

1,318

社区成员

发帖
与我相关
我的任务
社区描述
主要是开发驱动技术
社区管理员
  • 驱动程序开发区社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧