execve系統調用_張凱捷—系統調用分析(3) (基于最新Linux5.0版本系統調用日志收集系統)...

6cc1510da245bca8e5845aac02c66dac.png

? ? 在上一篇文章《系統調用分析(2)》中介紹和分析了32位和64位的快速系統調用指令——sysenter/sysexit和syscall/sysret,以及內核對快速系統調用部分的相關代碼,并追蹤了一個用戶態下的系統調用程序運行過程。

????本篇中將基于最新的Linux-5.0內核,添加一個系統調用,完成一個“系統調用日志收集系統”; 并對這三篇文章進行一個總結。

?6cc1510da245bca8e5845aac02c66dac.png

加前兩篇文章在這里:

https://mp.weixin.qq.com/s/3Dvd2dy0l6OYFVGzfEvOcg

https://mp.weixin.qq.com/s/7uXVXXqzN8wMqgxqrN_5og

加一個系統調用

//

? 單純添加一個系統調用會顯得有些單調,出于既是作業又是學習角度,將系統調用、工作隊列、修改內核、內核編譯和內核模塊編寫插入等結合起來,通過完成一個系統調用日志收集系統。

1

系統調用日志收集系統的目的

? 系統調用是用戶程序與系統打交道的入口,系統調用的安全直接關系到系統的安全,如果一個用戶惡意地不斷調用fork()將導致系統負載增加,所以如果能收集到是誰調用了一些有危險的系統調用,以及系統調用的時間和其他信息,將有助于系統管理員進行事后追蹤,從而提高系統的安全性。

2

系統調用日志收集系統概述

184c2596ec56e4595c638d1dae3f7f2d.png

圖3-1?系統調用日志收集系統示意圖

? 根據示意圖,系統調用日志收集系統所做工作為:當用戶進程執行系統調用,運行到內核函數do_syscall_64時,進行判斷是否為我們需要記錄的系統調用,如果是我們需要記錄的系統調用則通過my_audit這一函數將記錄內容寫入內核中的buffer里;同時編寫用戶態測試程序調用335號系統調用(myaudit),這一系統調用調用my_sysaudit這一函數將內核buffer中數據copy到用戶buffer中并顯示日志內容;其中我們調用的my_audit和my_sysaudit都是鉤子函數,具體實現使用內核模塊完成并插入,方便調試。

3

系統調用日志收集系統實現

?(1)增加系統調用表的表項

? 打開arch/x86/entry/syscalls/syscall_64.tbl,添加一個系統調用表項:

335 common ?myaudit ? ? ? ? __x64_sys_myaudit

? (2)添加系統調用函數

??arch/x86/kernel/目錄下添加myaudit.c文件完成系統調用函數:

#include

#include

#include

#include

#include

#include

#include

#include

void (*my_audit) (int, int) = 0;

int (*my_sysaudit)(u8, u8 *, u16, u8) = 0;

SYSCALL_DEFINE4(myaudit, u8, type, u8 *, us_buf, u16, us_buf_size, u8, reset)

{ ? ?

????if (my_sysaudit) { ? ? ? ?

????????return (*my_sysaudit)(type, us_buf, us_buf_size, reset);

? ? ? ?printk("IN KERNEL: my system call sys_myaudit() working\n"); ? ?} else ? ?????printk("my_sysadit is not exist\n");

? ?return 1;

}

EXPORT_SYMBOL(my_audit);

EXPORT_SYMBOL(my_sysaudit);

? ?這里可以看到實際上定義兩個鉤子函數,在我們系統調用里去調用這兩個鉤子函數,這樣可以以模塊的方式添加這兩個函數的具體內容,方便調試。

??(3)修改Makefile

??修改arch/x86/kernel/Makefile,將myaduit.c文件加入內核編譯:

obj-y ? ? ? ? ? += myaudit.o

? (4)增加函數聲明

? 在include/linux/syscalls.h最后的endif前添加函數聲明:

??????????asmlink long sys_myaudit(u8, u8 *, u16, u8);

extern void (*my_audit)(int, int);

? (5)攔截相關系統調用

正如前面對syscall執行的分析,修改do_syscall_64()函數(在/arch/x86/entry/common.c中),對系統調用號nr進行判斷,如果是我們日志收集系統需要記錄的系統調用,就調用我們的記錄函數進行記錄:

__visible void do_syscall_64(unsigned long nr, struct pt_regs *regs)

{

? ?... ? ?

????nr = syscall_trace_enter(regs);

? ?nr &= __SYSCALL_MASK;

? ?if (likely(nr < NR_syscalls)) {

? ? ? ?nr = array_index_nospec(nr, NR_syscalls);

? ? ? ?regs->ax = sys_call_table[nr](regs);

? ? ? ?if (nr == 57 || nr == 2 || nr == 3 || nr == 59 || nr == 39 || nr == 56) { ? ? ? ? ? ?

????????????if (my_audit)

? ? ? ? ? ? ? ?(*my_audit)(nr, regs->ax);

? ? ? ?????else

? ? ? ? ? ? ? ?printk("my_audit is not exist.\n"); ? ? ? ?} ? ?} ? ?syscall_return_slowpath(regs); }

? ?可以看到要記錄的系統調用有:2:open;3:close;39:getpid;56:clone;57:fork;59:execve。

? (6)重新編譯內核

#提前把原來內核版本的.config拷貝到5.0內核源碼根目錄下

cd linux-5.0的路徑

sudo cp /usr/src/內核版本/.config ./ ?

#進入menuconfig后按照 load->OK->save->OK->exit->exit執行

sudo make menuconfig ?

sudo make olddefconfig

#編譯內核

sudo make bzImage -j2

sudo make modules

#安裝內核修改引導

sudo make modules_install sudo make install

sudo update-grub2

#重啟

sudo reboot

?(7)添加實現鉤子函數的內核模塊

? my_audit.c:#include

#include

#include

#include

#include

#define COMM_SIZE 16

#define AUDIT_BUF_SIZE 100

MODULE_LICENSE("GPL v2");

struct syscall_buf {

u32 serial; u64 ts_sec; u64 ts_micro; u32 syscall;

u32 status;

????????pid_t pid;

????????uid_t uid;

u8 comm[COMM_SIZE]; };

DECLARE_WAIT_QUEUE_HEAD(buffer_wait);

static struct syscall_buf audit_buf[AUDIT_BUF_SIZE];

static int current_pos = 0;

static u32 serial = 0;

void syscall_audit(int syscall, int return_status)

{

????????struct syscall_buf *ppb_temp;

struct timespec64 nowtime;

ktime_get_real_ts64(&nowtime);

????????if (current_pos < AUDIT_BUF_SIZE) {

ppb_temp = &audit_buf[current_pos]; ppb_temp->serial = serial++; ppb_temp->ts_sec = nowtime.tv_sec; ppb_temp->ts_micro = nowtime.tv_nsec; ppb_temp->syscall = syscall; ppb_temp->status = return_status; ppb_temp->pid = current->pid;

ppb_temp->uid = current->tgid;

memcpy(ppb_temp->comm, current->comm, COMM_SIZE);

if (++current_pos == AUDIT_BUF_SIZE * 8 / 10)

{ printk("IN MODULE_audit: yes, it near full\n"); wake_up_interruptible(&buffer_wait); } }

}

int sys_audit(u8 type, u8 *us_buf, u16 us_buf_size, u8 reset)

{

????int ret = 0;

if (!type) {

????if (clear_user(us_buf, us_buf_size)) {

printk("Error:clear_user\n");

return 0;

????????????}

????printk("IN MODULE_systemcall:starting...\n"); ????ret = wait_event_interruptible(buffer_wait, current_pos >= AUDIT_BUF_SIZE * 8 / 10);

????printk("IN MODULE_systemcall:over, current_pos is %d\n", current_pos);

????if(copy_to_user(us_buf, audit_buf, (current_pos)*sizeof(struct syscall_buf))) {

????????printk("Error: copy error\n");

return 0;

????} ????ret = current_pos; ????current_pos = 0;

}

????return ret;

}

static int __init audit_init(void)

{

????my_sysaudit = sys_audit; ????my_audit = ?syscall_audit;

????printk("Starting System Call Auditing\n");

????return 0;

}

module_init(audit_init);

static void __exit audit_exit(void)

{

my_audit = NULL; my_sysaudit = NULL;

printk("Exiting System Call Auditing\n");

return ;

} module_exit(audit_exit);

? ?(8)實現用戶空間收集日志進程程序

? ? test_syscall.c:

#include

#include

#include

#include

#include

#include

#include

#include

#define COMM_SIZE 16

typedef unsigned char u8;

typedef unsigned int u32;

typedef unsigned long long u64;

struct syscall_buf {

? ?u32 serial; ? ?u64 ts_sec; ? ?u64 ts_micro; ? ?u32 syscall;

? ?u32 status; ? ?

????pid_t pid; ? ?

????uid_t uid;

? ?u8 comm[COMM_SIZE];

};

#define AUDIT_BUF_SIZE (20 * sizeof(struct syscall_buf))

int main(int argc, char *argv[]){

? ?u8 col_buf[AUDIT_BUF_SIZE];

? ?unsigned char reset = 1;

? ?int num = 0;

? ?int i, j;

? ?struct syscall_buf *p;

? ?while(1) { ? ? ? ?num = syscall(335, 0, col_buf, AUDIT_BUF_SIZE, reset); ? ? ? ?printf("num: %d\n", num);

? ? ? ?p = (struct syscall_buf *)col_buf;

? ? ? ?for(i = 0; i < num; i++) {

? ? ? ? ? ?printf("num [%d], serial: %d,\t syscall: %d,\t pid: %d,\t comm: %s,\t ts_sec: %ld\n", i, p[i].serial, p[i].syscall, p[i].pid, p[i].comm, ctime(&p[i].ts_sec));

? ? ? ?} ? ?} ? ?return 1; }

? ? (9)測試系統

? 運行用戶空間收集日志進程程序,隨著OS系統的運行,不斷從內核里記錄相關系統調用日志的buffer中取出打印在屏幕上:

da069f57c4325898e17379ca544a3a11.png

//

圖3-2?系統測試截圖

總結

d29d45d74be57832897d0dc2d664d3fe.png

圖?4-1?系統調用總結圖

《系統調用分析》一共三篇文章,先從最早的系統調用方法——(int 80)開始,基于Linux-2.6.39內核開始分析,對用軟中斷系統調用的初始化、處理流程和系統調用表進行了學習探究。隨后,基于Linux-4.20內核分析學習了從機制上對系統調用進行優化的方法——vsyscalls和vDSO。之后對32位下的快速系統調用指令——sysenter/sysexit進行指令學習和對相關Linux源碼分析。然后在Linux-4.20內核下編寫調用系統調用的程序,使用gdb進行調試跟蹤并分析出最后使用syscall指令執行系統調用,再對64位下的快速系統調用指令syscall/sysret進行指令學習和對相關Linux源碼分析。最后在Linux-5.0內核上完成一個系統調用日志收集系統,其中包含著添加系統調用,編譯內核,修改內核代碼,添加內核模塊,編寫用戶態程序測試。

參考文獻

[1]?英特爾?64和IA-32架構軟件開發人員手冊合并卷.?https://software.intel.com/sites/default/files/managed/39/c5/325462-sdm-vol-1-2abcd-3abcd.pdf

[2]?The Definitive Guide to Linux System Calls.?https://blog.packagecloud.io/eng/2016/04/05/the-definitive-guide-to-linux-system-calls/#32-bit-fast-system-calls

[3] Linux 2.6 對新型 CPU 快速系統調用的支持.?https://www.ibm.com/developerworks/cn/linux/kernel/l-k26ncpu/index.html

[4] vsyscalls and vDSO.?https://0xax.gitbooks.io/linux-insides/content/SysCall/linux-syscall-3.html

[5] Linux系統調用過程分析.?https://www.binss.me/blog/the-analysis-of-linux-system-call/

[6] Fix-Mapped Addresses and ioremap.?https://0xax.gitbooks.io/linux-insides/content/MM/linux-mm-2.html

[7] 王宗濤. Linux快速系統調用實現機制分析. TP316.81

[8] linux下系統調用的實現.?https://www.pagefault.info/2010/10/09/implementation-of-system-call-under-linux.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/259816.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/259816.shtml
英文地址,請注明出處:http://en.pswp.cn/news/259816.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

批量下載小說網站上的小說(python爬蟲)

隨便說點什么 因為在學python&#xff0c;所有自然而然的就掉進了爬蟲這個坑里&#xff0c;好吧&#xff0c;主要是因為我覺得爬蟲比較酷&#xff0c;才入坑的。 想想看&#xff0c;你可以批量自動的采集互聯網上海量的資料數據&#xff0c;是多么令人激動啊&#xff01; 所以我…

Playground

題意 &#xff1a;求被兩點分割的凸包面積的較小值 題意已經給出順時針啦 就是求以某一個點 和其他所有相鄰點組成三角形的面積&#xff0c;然后sum存和求兩點的時候就求出那兩點的之間所有三角形的和再減掉0點和那兩點的面積一減就是其中一個三角形的面積。轉載于:https://…

華為歐拉系統服務器開接口,華為操作系統 euleros

華為操作系統 euleros 內容精選換一換Atlas 900 AI集群安裝上架、服務器基礎參數配置、安裝操作系統等操作&#xff0c;請根據集群配置參見對應的手冊&#xff1a;《Atlas 900 PoD 用戶指南 (型號9000, 直流)》《Atlas 900 PoD 用戶指南 (型號9000, 交流)》《Atlas 900 計算節點…

對勾函數_對勾函數?2020福建省中考壓軸題分析

訓練營機密視頻大公開歡迎轉發、分享傳播知識&#xff0c;傳播力量&#xff01;福建也是全省統一考選擇題&#xff1a;這題考的是二次函數的性質&#xff0c;先求出對稱軸就好了填空題&#xff1a;這題看似有反比例&#xff0c;確實會用到反比例函數的對稱性。但其實重點是考察…

這個textview有問題嗎 為什么一使用就崩潰

問題描述<TextViewandroid:id"id/textview1"android:layout_columnSpan"4"android:layout_gravity"fill"android:gravity"right"android:text"0" />public class MainActivity extends Activity {Button one;TextView…

通過Ajax解析和jQuery寫了一個小小的導航條

最近在用ajax和jquery做開發&#xff0c;所以閑來無事寫了些小導航條&#xff0c;通過ajax解析XML文件動態的創建WEB網站的導航條。 <link href"css/style.css" rel"stylesheet" type"text/css" /><script src"js/jquery-1.8.2.mi…

一次生產事故的優化經歷

在一次正常的活動促銷之后&#xff0c;客服開始陸續反饋有用戶反應在搶標的時候打不開網頁或者APP&#xff0c;在打開的時候標的就已經被搶光了&#xff0c;剛開始沒有特別的上心&#xff0c;覺得搶標不就是這樣嗎&#xff0c;搶小米手機的時候也不就這樣嗎&#xff1f;隨著活動…

mysql over rank_SQL學習筆記 - 窗口函數OVER

Window Function 窗口函數Perform calculations on an already generated result set ( a window).&#xff08;在已生成的結果集上執行計算&#xff09;Aggregate calculation(without having to group your data)&#xff08;允許使用聚合函數時不用進行GROUP BY分組&#xf…

用boost庫實現traceroute小工具

參考了網上幾個 traceroute的實現版本&#xff0c;存在一些缺陷&#xff0c;比如沒有做超時處理&#xff0c;或者只能在window下使用。自己用boost實現了一個traceroute小工具&#xff0c;在window下正常運行。 先來看下面實現的原理。這些說明來自維基百科。traceroute&#x…

Win系統利用本地安全策略全面禁止360等軟件的安裝與運行-1

這個理論應該也可以用在域對下設域用戶上.各位不知道有沒有這種經歷&#xff0c;機子讓別人玩了一上午&#xff0c;回來發現&#xff0c;自己干干凈凈的系統多了一堆某某安全助手&#xff0c;某某殺毒&#xff0c;某某手機助手等等&#xff0c;最可恨的還是不知一系列的&#x…

php配置文件php.ini的詳細解析(續)

file_uploads On //是否允許文件上傳 upload_tmp_dir "d:/wamp/tmp" //上傳文件的臨時目錄&#xff0c;默認為“/wamp/tm…

服務器iis7.5 配置文件,使用注冊表項 - Internet Information Services | Microsoft Docs

Internet 信息服務使用的注冊表項的說明07/21/2020本文內容本文介紹了 Microsoft Internet Information Services (IIS) 在 Windows 上使用的注冊表項。原始產品版本&#xff1a; Internet information Services原始 KB 數&#xff1a; 954864簡介本文還包含有關如何修改注…

access考試素材_NCRE考試當天常見問題處理辦法及各科目注意事項大匯總

溫馨提醒為了方便大家在21-22號討論考試抽中的題目&#xff0c;請自覺加入QQ群&#xff1a;776167039考試當天常見問題及處理辦法大匯總問題一&#xff1a;考試當天忘記帶身份證和準考證原因&#xff1a;這種情況&#xff0c;要么是忘了&#xff0c;要么真沒有提前領到準考證。…

騰訊開源手游熱更新方案,Unity3D下的Lua編程

寫在前面\\xLua是Unity3D下Lua編程解決方案&#xff0c;自2016年初推廣以來&#xff0c;已經應用于十多款騰訊自研游戲&#xff0c;因其良好性能、易用性、擴展性而廣受好評。現在&#xff0c;騰訊已經將xLua開源到GitHub。\\2016年12月末&#xff0c;xLua剛剛實現新的突破&…

設置安全性根據Folder關聯的條目模板設置上傳文檔安全性

文章結束給大家來個程序員笑話&#xff1a;[M] 在XT上可以設預條目模板&#xff08;EntryTemplate&#xff09;來到達模板化制控上傳文檔安全性和屬性等信息的作用。而EntryTemplate本身可以與Folder相干聯&#xff08;一個Folder可以關聯多個EntryTemplate&#xff09;&#x…

surfaceView中的線程問題

問題描述我在surfaceView中的surfaceCreated方法中start線程&#xff0c;但是當我start一個其他activity后&#xff0c;又finish掉那個acvitity回來&#xff0c;又會走到這個surfaceCreated方法&#xff0c;這時候走到線程的start方法&#xff0c;它會報錯Thread already exist…

1加6投屏_6月1日起駕考要加項目?真相是這樣

來源&#xff1a;新聞晨報近日網上流傳一則消息讓還沒考出駕照的朋友們瑟瑟發抖網傳消息稱&#xff0c;上海、海南、陜西、貴州、浙江等地駕考科目二于6月1日起加項&#xff0c;因而“朋友們要抓緊時間報名&#xff0c;錄入舊系統”。網傳消息截圖上海6月1日起科目二考試增加到…

Java this關鍵字

this 關鍵字有三個應用&#xff1a;  1.this調用本類中的屬性&#xff0c;也就是類中的成員變量  2.this調用本類中的其他方法  3.this調用本類中的其他構造方法&#xff0c;調用時要放在構造方法的首行 來看下面這段代碼&#xff1a; public String name;public void sh…

linux下查看線程數的幾種方法

1、 cat /proc/${pid}/status 2、pstree -p ${pid} 3、top -p ${pid} 再按H 或者直接輸入 top -bH -d 3 -p ${pid} top -H手冊中說&#xff1a;-H : Threads toggle加上這個選項啟動top&#xff0c;top一行顯示一個線程。否則&#xff0c;它一行顯示一個進程。 4、ps xH手冊…

網站等保測評針對服務器,互聯互通測評知識分享之信息安全建設要點

原創 醫療測評實驗室 中國軟件評測中心 1周前醫院互聯互通測評&#xff0c;即國家醫療健康信息互聯互通標準化成熟度測評&#xff0c;近年來隨著政策的要求、需求的驅動、技術的更迭、價值的引領&#xff0c;越來越被業內人士接受和認可&#xff0c;測評熱度也水漲船高。國家衛…