当前位置: 首页 > news >正文

FreeBSD中替换系统调用监视系统文件打开记录

FreeBSD 7.1

Makefile


SRCS = rmdir.c vn_help.c main.c vnode_if.h KMOD = fsmon KO = $(KMOD).ko KLDMOD = t WERROR = .include <bsd.kmod.mk>

main.c 模块主文件

#include "inc.h" static int load (struct module *module, int cmd, void *arg) { int error = 0; switch( cmd ) { case MOD_LOAD: uprintf( "%s module was loaded. \n", MOD_NAME ); //sysent[SYS_rmdir].sy_call = (sy_call_t *)new_rmdir; //sysent[SYS_mkdir].sy_call = (sy_call_t *)new_mkdir; sysent[SYS_open].sy_call = (sy_call_t *)new_open; break; case MOD_UNLOAD: uprintf( "%s module was unloaded. \n", MOD_NAME ); //sysent[SYS_rmdir].sy_call = (sy_call_t *)rmdir; //sysent[SYS_mkdir].sy_call = (sy_call_t *)mkdir; sysent[SYS_open].sy_call = (sy_call_t *)open; break; default: error = EINVAL; break; } return error; } static moduledata_t fsmon_mod = { "fsmon", load, NULL }; DECLARE_MODULE(fsmon, fsmon_mod, SI_SUB_KLD,SI_ORDER_ANY);

open.c 拦截open系统调用

#include "inc.h" static char old_path[MAXPATHLEN]; int new_open(td, uap) struct thread *td; register struct open_args /* { char *path; int flags; int mode; } */ *uap; { struct vnode *vp, *dvp = NULL; int error; struct nameidata nd, *ndp; int vfslocked; char *dlep = NULL; char *flep = NULL; char *nameptr = NULL; char *dirptr = NULL; int fmode = 0, mpsafe; int locked = 0; fmode = FFLAGS(uap->flags); ndp = &nd; mpsafe = ndp->ni_cnd.cn_flags & MPSAFE; vfslocked = 0; NDINIT(ndp, LOOKUP, FOLLOW | AUDITVNODE1 | MPSAFE, UIO_USERSPACE, uap->path, td); if (fmode & O_CREAT) { ndp->ni_cnd.cn_nameiop = CREATE; ndp->ni_cnd.cn_flags = ISOPEN | LOCKPARENT | LOCKLEAF | MPSAFE | AUDITVNODE1; if ((fmode & O_EXCL) == 0 && (fmode & O_NOFOLLOW) == 0) ndp->ni_cnd.cn_flags |= FOLLOW; bwillwrite(); if ((error = namei(ndp)) != 0) return (error); vfslocked = NDHASGIANT(ndp); if (!mpsafe) ndp->ni_cnd.cn_flags &= ~MPSAFE; if (ndp->ni_vp == NULL) { dvp = ndp->ni_dvp; vp = NULL; locked = 0; vput(ndp->ni_dvp); VFS_UNLOCK_GIANT(vfslocked); NDFREE(ndp, NDF_ONLY_PNBUF); } else { if (ndp->ni_dvp == ndp->ni_vp) vrele(ndp->ni_dvp); else vput(ndp->ni_dvp); dvp = ndp->ni_dvp; vp = ndp->ni_vp; locked = 1; if (fmode & O_EXCL) { error = EEXIST; goto bad; } } } else { ndp->ni_cnd.cn_nameiop = LOOKUP; ndp->ni_cnd.cn_flags = ISOPEN | ((fmode & O_NOFOLLOW) ? NOFOLLOW : FOLLOW) | LOCKLEAF | MPSAFE | AUDITVNODE1; if ((error = namei(ndp)) != 0) return (error); if (!mpsafe) ndp->ni_cnd.cn_flags &= ~MPSAFE; vfslocked = NDHASGIANT(ndp); dvp = ndp->ni_dvp; vp = ndp->ni_vp; locked = 1; } if ( vp ) { if (vp->v_type == VLNK) { error = EMLINK; goto bad; } if (vp->v_type == VSOCK) { error = EOPNOTSUPP; goto bad; } if (fmode & (FWRITE | O_TRUNC)) { if (vp->v_type == VDIR) { error = EISDIR; goto bad; } } } if ( dvp ) { error = vn_fullpath( td, dvp, &dlep, &flep ); if ( !error ) { //uprintf( "path = %s\n", dlep ); strncpy( old_path, dlep, MAXPATHLEN ); } else { uprintf( "%s: vn_fullpath call fail. return %d\n", __func__, error ); //uprintf( "old_path = %s \n", old_path ); } // dirptr = old_path; if ( nd.ni_cnd.cn_namelen ) { nameptr = nd.ni_cnd.cn_nameptr; } else { nameptr = ""; } if ( fmode & O_CREAT ) { uprintf( "open %s/%s for create\n", dirptr, nameptr ); } else { if ( fmode & (FWRITE | O_TRUNC | O_APPEND) ) { uprintf( "open %s/%s for write\n", dirptr, nameptr ); } else { uprintf( "open %s/%s\n", dirptr, nameptr ); } } if ( flep ) { free( flep, M_TEMP ); } error = 0; } if ( locked ) { NDFREE(ndp, NDF_ONLY_PNBUF); if ( vp ) vput(vp); VFS_UNLOCK_GIANT(vfslocked); } return kern_open(td, uap->path, UIO_USERSPACE, uap->flags, uap->mode); bad: NDFREE(ndp, NDF_ONLY_PNBUF); if ( vp ) vput(vp); VFS_UNLOCK_GIANT(vfslocked); return error; }

in.h 公共头文件

#ifndef _INC_H #define _INC_H #include <sys/cdefs.h> #include <sys/param.h> #include <sys/systm.h> #include <sys/bio.h> #include <sys/buf.h> #include <sys/sysent.h> #include <sys/malloc.h> #include <sys/mount.h> #include <sys/mutex.h> #include <sys/sysproto.h> #include <sys/namei.h> #include <sys/filedesc.h> #include <sys/kernel.h> #include <sys/fcntl.h> #include <sys/file.h> #include <sys/filio.h> #include <sys/limits.h> #include <sys/linker.h> #include <sys/stat.h> #include <sys/sx.h> #include <sys/unistd.h> #include <sys/vnode.h> #include <sys/priv.h> #include <sys/proc.h> #include <sys/dirent.h> #include <sys/jail.h> #include <sys/syscallsubr.h> #include <sys/sysctl.h> #ifdef KTRACE #include <sys/ktrace.h> #endif #include <machine/stdarg.h> #include <security/audit/audit.h> #include <security/mac/mac_framework.h> #include <vm/vm.h> #include <vm/vm_object.h> #include <vm/vm_page.h> #include <vm/uma.h> #define MOD_NAME "fsmon" int new_open(struct thread *, struct open_args *); #endif

相关文章:

  • LeetCode -- Remove Element
  • 刚做的H1N1猪流感分布图Demo
  • LeetCode -- Same Tree
  • 与辛鹏和王昕聊OPUG(开放流程社区)
  • LeetCode -- Search in Rotated Sorted Array II
  • 小议移动Widget
  • LeetCode -- Search in Rotated Sorted Array
  • LeetCode -- Binary Tree Postorder Traversal
  • 《3G移动增值业务的运营、定制与开发——BREW进阶与精通》开始连载
  • LeetCode -- Course Schedule
  • 七、基本I/O接口电路设计实验
  • LeetCode -- Intersection of Two Linked Lists
  • 红帽的top命令不正确
  • LeetCode -- Minimum Window Substring
  • 70后所面临的软件技术学习困境
  • android 一些 utils
  • CEF与代理
  • docker-consul
  • java中的hashCode
  • JS题目及答案整理
  • Laravel核心解读--Facades
  • Magento 1.x 中文订单打印乱码
  • Python爬虫--- 1.3 BS4库的解析器
  • spark本地环境的搭建到运行第一个spark程序
  • underscore源码剖析之整体架构
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 紧急通知:《观止-微软》请在经管柜购买!
  • 区块链将重新定义世界
  • 推荐一个React的管理后台框架
  • 推荐一款sublime text 3 支持JSX和es201x 代码格式化的插件
  • 一些关于Rust在2019年的思考
  • mysql面试题分组并合并列
  • 机器人开始自主学习,是人类福祉,还是定时炸弹? ...
  • 浅谈sql中的in与not in,exists与not exists的区别
  • 树莓派用上kodexplorer也能玩成私有网盘
  • 直播平台建设千万不要忘记流媒体服务器的存在 ...
  • ​LeetCode解法汇总518. 零钱兑换 II
  • # Python csv、xlsx、json、二进制(MP3) 文件读写基本使用
  • #LLM入门|Prompt#1.8_聊天机器人_Chatbot
  • $.ajax()
  • (C++)八皇后问题
  • (NSDate) 时间 (time )比较
  • (一)Dubbo快速入门、介绍、使用
  • (一)为什么要选择C++
  • (转)详解PHP处理密码的几种方式
  • (转)总结使用Unity 3D优化游戏运行性能的经验
  • (转贴)用VML开发工作流设计器 UCML.NET工作流管理系统
  • (状压dp)uva 10817 Headmaster's Headache
  • .libPaths()设置包加载目录
  • .Net Framework 4.x 程序到底运行在哪个 CLR 版本之上
  • .NET 指南:抽象化实现的基类
  • .NET/C# 避免调试器不小心提前计算本应延迟计算的值
  • 。Net下Windows服务程序开发疑惑
  • @EnableConfigurationProperties注解使用
  • @Resource和@Autowired的区别