如何对一个可执行程序开展拦截和包装?
发布时间:2022-07-12 23:15:06 所属栏目:Linux 来源:互联网
导读:文中一共讨论了3种方法,来实现对【函数】进行拦截: 在编译阶段插桩; 在链接阶段插桩; 在执行阶段插桩; 昨天一个网友提了另外一个问题:如何对一个可执行程序进行拦截? 他提出了一个实际的示例: Ubuntu 18.04操作系统中,重启指令/sbin/reboot是一个软链
文中一共讨论了3种方法,来实现对【函数】进行拦截: 在编译阶段插桩; 在链接阶段插桩; 在执行阶段插桩; 昨天一个网友提了另外一个问题:如何对一个可执行程序进行拦截? 他提出了一个实际的示例: Ubuntu 18.04操作系统中,重启指令/sbin/reboot是一个软链接,链接到可执行程序/bin/systemctl,那么是否可以在执行systemctl之前,做一些其它的事情(例如:保持一些应用程序的状态数据)? Ubuntn18.04 中使用 systemd 来管理系统的所有 Service; 除了 reboot 指令,还有其它几个指令也是软链接到 /bin/systemctl; 这里就引出一个问题了: 既然上面这6个命令都链接到systemctl,那么当systemctl被执行的时候,它是如何知道它是被哪一个命令调用的呢? 看一下源码就知道了:通过参数 argv[0] 来获得的。 可以看到:argv[0] = ./test1,因为我们是在命令行直接调用test可执行程序的,这很容易理解。 创建了pre_systemctl.sh脚本之后,并且把reboot软链接到它,在脚本中输入如下内容: 此时,在命令行中执行reboot命令,就会执行这个脚本,并且这个脚本也能够正确的把/sbin/root作为第0个参数传递给/bin/systemctl,如下图所示: 在这个脚本中,可以在执行systemctl之前,做任何需要关机前需要处理的一些事情。 问题似乎是解决了,但是好像还有一个问题: ![]() 如果用户在执行命令时输入了一些其它的参数,这个脚本程序也应该透明的把这些参数传递给 systemctl 才可以! 为了便于观察,我们在脚本中多打印个参数,并通过exec来启动systemctl,并且强制把参数$0设置为systemctl的第0个参数: 这个脚本文件中的重点是最后一条命令: 复制 exec -a $0 /bin/systemctl $* 1. 此时,在命令行中执行reboot指令,输出如下: 如此调用systemctl,就解决了刚才提出的问题,而且通过 $*,可以把任意多个参数透明的传递下去。 (编辑:柳州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 在Linux上启动期间启动Vertica数据库
- 好轻mini和好轻color有什么区别 好轻mini和好轻color有什么
- 阿里云linux服务器配置安装nginx
- linux – 如何允许来自给定IP范围的基于密码的登录,强制其他
- 编译安装ibus错误make: *** 没有指明目标并且找不到 makefi
- ssh – 可以在Linux(ext3)上减慢日志写入速度吗?
- 华为b2手环怎么调时间 华为手环B2调时间方法步骤
- linux – 使用perl读取系统文件,而不在打开时发出额外的搜索
- linux – 无法从外部机器访问公开暴露的Docker容器端口,只能
- linux – 硬件和软件负载平衡器有什么区别?