成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

如何對一個可執行程序進行攔截和包裝?

系統 Linux
Ubuntu 18.04操作系統中,重啟指令/sbin/reboot是一個軟鏈接,鏈接到可執行程序/bin/systemctl,那么是否可以在執行systemctl之前,做一些其它的事情(例如:保持一些應用程序的狀態數據)?

文中一共討論了3種方法,來實現對【函數】進行攔截:

  • 在編譯階段插樁;
  • 在鏈接階段插樁;
  • 在執行階段插樁;

昨天一個網友提了另外一個問題:如何對一個可執行程序進行攔截?

他提出了一個實際的示例:

Ubuntu 18.04操作系統中,重啟指令/sbin/reboot是一個軟鏈接,鏈接到可執行程序/bin/systemctl,那么是否可以在執行systemctl之前,做一些其它的事情(例如:保持一些應用程序的狀態數據)?

  • Ubuntn18.04 中使用 systemd 來管理系統的所有 Service;
  • 除了 reboot 指令,還有其它幾個指令也是軟鏈接到 /bin/systemctl;

圖片

這里就引出一個問題了:

既然上面這6個命令都鏈接到systemctl,那么當systemctl被執行的時候,它是如何知道它是被哪一個命令調用的呢?

看一下源碼就知道了:通過參數 argv[0] 來獲得的。

我們知道,main函數通過argc和argv[]來獲取所有的參數,如下:

// 測試文件:test1.c

#include <stdio.h>

int main(int argc, char *argv[])
{
printf("argc = %d \n", argc);
for (int i = 0; i < argc; i++)
printf("argv[%d] = %s \n", i, argv[i]);
return 0;
}

編譯、執行一下:

$ gcc test1.c -o test1
$ ./test1 aaa bbb
argc = 3
argv[0] = ./test1
argv[1] = aaa
argv[2] = bbb

可以看到:argv[0] = ./test1,因為我們是在命令行直接調用test可執行程序的,這很容易理解。

那么:如果test是被一個軟鏈接調用的呢?

測試一下,創建軟鏈接:

$ ln -s test1 link1

圖片

執行一下:

圖片

此時,argv[0] = ./link1。

也就是說:第一個參數存放的是軟鏈接文件路徑,systemctl 的道理也是如此!

知道了這個原理,那我們就可以在reboot與systemc之間橫叉一刀,增加一個中間可執行文件:

圖片

為了便于描述,我們把這個中間文件創建為腳本pre_systemctl.sh,然后把root軟鏈接到這個腳本。

注意:在理解原理之前,建議不要直接用 reboot 等系統命令進行操作,可以自己寫一些測試程序,例如上面的 test。

操作如下:

$ cd /sbin
$ sudo rm root
$ sudo touch pre_systemctl.sh
$ sudo chmod +x pre_systemctl.sh
$ sudo ln -s pre_systemctl.sh reboot

圖片

創建了pre_systemctl.sh腳本之后,并且把reboot軟鏈接到它,在腳本中輸入如下內容:

圖片

此時,在命令行中執行reboot命令,就會執行這個腳本,并且這個腳本也能夠正確的把/sbin/root作為第0個參數傳遞給/bin/systemctl,如下圖所示:

圖片

在這個腳本中,可以在執行systemctl之前,做任何需要關機前需要處理的一些事情。

問題似乎是解決了,但是好像還有一個問題:

如果用戶在執行命令時輸入了一些其它的參數,這個腳本程序也應該透明的把這些參數傳遞給 systemctl 才可以!

為了便于觀察,我們在腳本中多打印個參數,并通過exec來啟動systemctl,并且強制把參數$0設置為systemctl的第0個參數:

圖片

這個腳本文件中的重點是最后一條命令:

exec -a $0 /bin/systemctl $*

此時,在命令行中執行reboot指令,輸出如下:

圖片

如此調用systemctl,就解決了剛才提出的問題,而且通過 $*,可以把任意多個參數透明的傳遞下去。

這里的關鍵還是 exec 的參數 -a ,看一下它的指令說明:

exec [-cl] [-a name] [command [arguments ...]] [redirection ...]

這里還有一個更詳細的說明:

圖片

責任編輯:武曉燕 來源: IOT物聯網小鎮
相關推薦

2022-01-11 09:59:23

Python關機程序文件

2010-03-23 10:29:28

Python程序編譯轉

2021-08-12 09:17:18

WFH漏洞劫持攻擊

2009-09-04 09:36:17

Java調用

2024-03-08 09:34:35

JpackageJarJava

2010-03-26 14:49:04

Python腳本

2010-09-09 21:34:06

2023-12-14 14:32:00

物聯網人工智能邊緣計算

2010-02-24 15:41:53

Python解釋器

2010-01-15 17:18:57

C++源程序

2009-10-28 13:03:54

2022-12-13 07:40:33

LinuxWeb服務器

2010-02-26 13:03:31

Python腳本語言

2018-01-31 08:03:30

2018-07-23 08:45:00

程序員能力水平

2022-02-04 22:05:19

JVM程序內存模型

2012-01-09 17:45:48

Java程序員

2011-11-17 10:34:44

并行程序

2010-10-12 16:26:44

2017-12-12 14:08:48

Unix命令maybe
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 999免费网站 | 性色av网站 | av在线影院 | 中文字幕欧美日韩 | 欧美精品一区二区三区在线 | 国产精品国产三级国产aⅴ入口 | 国产网站在线播放 | 欧美激情综合五月色丁香小说 | 国产精品久久久久久久久久久免费看 | 欧美久久久久久 | 四虎永久免费在线 | 国产一级片免费在线观看 | 午夜国产羞羞视频免费网站 | 激情麻豆视频 | 黄色一级电影免费观看 | 中文字幕 在线观看 | 四虎永久免费影院 | a黄在线观看 | 围产精品久久久久久久 | 精品亚洲一区二区三区四区五区 | 成人在线免费看 | 一级一级毛片免费看 | 亚洲视频在线播放 | 老头搡老女人毛片视频在线看 | 97av视频在线观看 | 中文字幕一区二区三区精彩视频 | 国产精品久久久久婷婷二区次 | 国产精品亚洲视频 | 成人欧美一区二区三区在线观看 | 久久久久国产一区二区三区 | 国产一区二区视频免费在线观看 | 91成人免费电影 | 久久精品亚洲 | 日本字幕在线观看 | 亚洲精品一区二三区不卡 | 日韩精品在线观看一区二区 | 麻豆成人在线视频 | 亚洲午夜久久久 | 欧美日韩一区二区三区四区 | 亚洲综合在线一区 | 国产区精品视频 |