测试系统:

curtis@curtis-virtual-machine:~/Desktop$ uname -a
Linux curtis-virtual-machine 4.2.0-42-generic #49~14.04.1-Ubuntu SMP Wed Jun 29 20:22:11 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux

Hook 系统调用我们先要知道sys_call_table地址,这个可以看之前文章,同时我们要了解sys_open的函数原型:

asmlinkage int (*original_open)( const char __user *, int , mode_t);

这次我们的目的是hook住sys_open并且打印被Hook sys_open被调用的路径和copy 路径的长度。

open_hook.c

/*
** hook_open.c for this function
**
**
*/#include <linux/init.h>
#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/printk.h>
#include <linux/syscalls.h>
#include <linux/unistd.h>MODULE_LICENSE("GPL");
MODULE_DESCRIPTION("Hook sys_call_open by change sys_open entry");
MODULE_AUTHOR("curtis");void  **sys_call_table_ptr;
unsigned long copied;asmlinkage int (*original_open)( const char __user *, int , mode_t);asmlinkage int new_open( const char __user * pathname, int flags, mode_t mode )
{char user_msg[256];printk("%s\n",__FUNCTION__);memset(user_msg,0,sizeof(user_msg));copied = strncpy_from_user(user_msg, pathname, sizeof(user_msg));printk("copied:%ld\n", copied);printk("pathname%s\n",user_msg);printk("------\n");return ( *original_open )( pathname, flags, mode );
}static int __init open_hook_init(void)
{write_cr0(read_cr0() & (~0x10000));sys_call_table_ptr = (void**)kallsyms_lookup_name("sys_call_table");original_open = sys_call_table_ptr[__NR_open];sys_call_table_ptr[__NR_open] = new_open;write_cr0(read_cr0() | (0x10000));return 0;
}static void __exit open_hook_exit(void)
{write_cr0(read_cr0() & (~0x10000));sys_call_table_ptr[__NR_open] = original_open;write_cr0(read_cr0() | (0x10000));printk("Bye bye open_hook\n");
}module_init(open_hook_init);
module_exit(open_hook_exit);

Makefile:

ifeq ($(KERNELRELEASE),)# Assume the source tree is where the running kernel was built
# You should set KERNELDIR in the environment if it's elsewhere
KERNELDIR ?= /lib/modules/$(shell uname -r)/build# The current directory is passed to sub-makes as argument
PWD := $(shell pwd)modules:$(MAKE) -C $(KERNELDIR) M=$(PWD) modulesmodules_install:$(MAKE) -C $(KERNELDIR) M=$(PWD) modules_installclean:$(MAKE) -C $(KERNELDIR) M=$(PWD) cleanhelp:$(MAKE) -C $(KERNELDIR) M=$(PWD) help.PHONY: modules modules_install cleanelse# called from kernel build system: just declare our module
obj-m := open_hook.o
yolo-objs :=endif

Hook 效果如下,dmesg打印文件路径

[ 1421.715076] new_open
[ 1421.715077] copied:31
[ 1421.715077] pathname/lib/x86_64-linux-gnu/libc.so.6
[ 1421.715077] ------
[ 1421.715219] new_open
[ 1421.715220] copied:13
[ 1421.715220] pathname/proc/cmdline
[ 1421.715221] ------
[ 1421.715239] new_open
[ 1421.715240] copied:31
[ 1421.715241] pathname/sys/module/open_hook/initstate
[ 1421.715241] ------
[ 1421.715257] new_open
[ 1421.715257] copied:28
[ 1421.715258] pathname/sys/module/open_hook/refcnt
[ 1421.715258] ------
[ 1421.715269] Bye bye open_hook

以此类推,我们可以添加hook sys_read sys_write 函数Hook的功能

asmlinkage int ( *original_write ) ( unsigned int, const char __user *, size_t );
asmlinkage int ( *original_read ) ( unsigned int, const char __user *, size_t );asmlinkage int  new_write( unsigned int fd, const char __user *buf, size_t count )
{printk("%s\n",__FUNCTION__);printk("------\n");return ( *original_write )( fd, buf, count );
}asmlinkage int new_read( unsigned int fd, const char __user *buf, size_t count )
{printk("%s\n",__FUNCTION__);printk("------\n");return ( *original_read )( fd, buf, count );
}

本来是想要把系统调用所对应的buf也打印出来,发现会有问题。

Linux hook系统调用open/read/write相关推荐

  1. Linux Hook系统调用(适用基于x86_64的4.17.0以上的内核版本)

    随着rhel8.0于去年5月初发布以来,开启了rhel8.x的时代,随后一段时间里centos.oracle linux也都发布了基于rhel的8.x系统.前段时间我就安装了个centos8.0,但是 ...

  2. Linux内核Hook系统调用execve

    资源下载地址:linux内核hook系统调用execve函数-Linux文档类资源-CSDN下载 (已在内核为 4.19.0-amd64-desktop版本uos编译通过,并成功达到目的) 在Linu ...

  3. Linux HOOK

    0 - 前言 1 - 绪论 2 - 介绍 2.1 - 什么是中断(interrupt)? 2.2 - 中断和异常(exception) 2.3 - 中断向量 2.4 - 什么是IDT? 3 - 异常 ...

  4. linux mkdir 系统调用,Linux Rootkit 系列四:对于系统调用挂钩方法的补充

    免责声明:本文介绍的安全知识方法以及代码仅用于渗透测试及安全教学使用,禁止任何非法用途,后果自负 前言 我将会把系列文章继续写下去,由于本系列文章novice同学也在写,所以我俩的顺序可能有点乱,不过 ...

  5. Linux Hook技术实践

    LInux Hook技术实践 什么是hook 简单的说就是别人本来是执行libA.so里面的函数的,结果现在被偷偷换成了执行你的libB.so里面的代码,是一种替换. 为什么hook 恶意代码注入 调 ...

  6. Linux open系统调用流程

    Linux open系统调用流程(1) http://blog.csdn.net/chenjin_zhong/article/details/8452453 1.概述 我们知道,Linux把设备看成特 ...

  7. Linux的系统调用、网络连接状态、磁盘I/O;可疑行为监控/日志收集、SHELL命令执行流程

    http://man7.org/linux/man-pages/man7/capabilities.7.html http://www.cnblogs.com/LittleHann/p/3850653 ...

  8. 文件编程之Linux下系统调用

    说明: linux下文件编程可使用两种方法: ****linux系统调用 ****C语言库函数 前者依赖于linux系统,后者与操作系统是独立的. 在任何操作系统下,使用C语言库函数操作文件的方法都是 ...

  9. linux中系统调用和库函数的区别

    linux中系统调用和库函数的区别 2013-05-03 22:18:20 分类: LINUX 首先,要说一下两者的概念: 系统调用 :是操作系统为用户态运行的进程和硬件设备(如CPU.磁盘.打印机等 ...

最新文章

  1. 数据蒋堂 | 多维分析预汇总的存储容量
  2. 20万Star的编程学习教程:让你的编码之路事半功倍!
  3. 【VS Code】vue.js ESLint + vscode 代码格式配置
  4. [BUUCTF-pwn]——hitcontraining_uaf
  5. 亚马逊低调收购Biba 或下月发布视频消息服务
  6. form表单元素设置只读
  7. Ubuntu16.04安装MySQL5.7
  8. 2021年8月国产数据库排行榜:TiDB稳榜首,达梦返前三,Kingbase进十强,各厂商加速布局云生态...
  9. linux系统安装并配置oracle客户端
  10. (原创)无废话C#设计模式之十九:Observer
  11. 机器人运动学基础——旋转矩阵
  12. 2021-2027全球与中国Al2O3氧化铝陶瓷基板白板市场现状及未来发展趋势
  13. 26 | 产品安全方案:如何降低业务对黑灰产的诱惑?
  14. Unity 自动化构建方案:一键实现版本管理与打包、压缩
  15. 【云计算的1024种玩法】使用阿里云+微擎打造微信公众号管理系统
  16. 令人担忧的5G网络可被黑客入侵
  17. 「C位观察」零信任:企业分布式安全管理架构 | C位
  18. NLP实战:财经新闻热点发现
  19. 【如何开发小程序?】如何快速开发一个小程序
  20. 计算机桌面字体如何设置,桌面字体怎么设置-电脑字体大小的方法教程

热门文章

  1. idea中没有 program arguments 选项
  2. 菜鸡做题·20200418会员登陆页面(CTF)
  3. 【JZOJ】【匈牙利算法】【二分】 导弹
  4. 计算机毕业设计asp.net校园二手物品交易平台(源码+系统+mysql数据库+Lw文档)
  5. 当前支付有效提高线下支付场景效率?
  6. 多个主机节点上的Hyperledger Fabric
  7. 阿里程序员不小心把服务器CPU打到100%,淡定展示教科书排查过程
  8. 笔记本ssd固态硬盘的M.2、SATA、PCI-E和NVMe的区别
  9. android开发笔记之多媒体—图形图像处理
  10. 默哀STAND SILENTLY!