精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Linux 內核動態追蹤技術的實現

系統 Linux
kprobe 是內核提供的動態追蹤技術機制,它允許動態安裝內核模塊的方式安裝系統鉤子,非常強大。下面先看一個內核中的例子。

[[434928]]

之前的文章介紹了基于 tracepoint 靜態追蹤技術的實現,本文再介紹基于 kprobe 的動態追蹤即使的實現。同樣,動態追蹤也是排查問題的利器。

kprobe 是內核提供的動態追蹤技術機制,它允許動態安裝內核模塊的方式安裝系統鉤子,非常強大。下面先看一個內核中的例子。

  1. #include <linux/kernel.h> 
  2. #include <linux/module.h> 
  3. #include <linux/kprobes.h> 
  4.  
  5. #define MAX_SYMBOL_LEN  64 
  6. // 要 hanck 的內核函數名 
  7. static char symbol[MAX_SYMBOL_LEN] = "_do_fork"
  8. module_param_string(symbol, symbol, sizeof(symbol), 0644); 
  9. static struct kprobe kp = { 
  10.     .symbol_name    = symbol, 
  11. }; 
  12.  
  13. // 執行系統函數前被執行的鉤子 
  14. static int __kprobes handler_pre(struct kprobe *p, struct pt_regs *regs){ 
  15.     // ... 
  16.  
  17. // 執行系統函數的單條指令后執行的鉤子(不是執行完系統函數) 
  18. static void __kprobes handler_post(struct kprobe *p, struct pt_regs *regs, 
  19.                 unsigned long flags){ 
  20.     // ... 
  21.  
  22. // 鉤子執行出錯或者單條執行執行出錯時被執行函數static int handler_fault(struct kprobe *p, struct pt_regs *regs, int trapnr){ 
  23.     // ... 
  24.  
  25. static int __init kprobe_init(void){ 
  26.     int ret; 
  27.     // 設置鉤子 
  28.     kp.pre_handler = handler_pre; 
  29.     kp.post_handler = handler_post; 
  30.     kp.fault_handler = handler_fault; 
  31.     // 安裝鉤子 
  32.     register_kprobe(&kp); 
  33.     return 0; 
  34.  
  35. static void __exit kprobe_exit(void){ 
  36.     unregister_kprobe(&kp); 
  37.     pr_info("kprobe at %p unregistered\n", kp.addr); 
  38.  
  39. // 安裝進內核后的初始化和注銷函數 
  40. module_init(kprobe_init) 
  41. module_exit(kprobe_exit) 
  42. MODULE_LICENSE("GPL"); 

設置完 kprobe 后,通過 register_kprobe 注冊到內核。

  1. int register_kprobe(struct kprobe *p){ 
  2.     int ret; 
  3.     struct kprobe *old_p; 
  4.     struct module *probed_mod; 
  5.     kprobe_opcode_t *addr; 
  6.  
  7.     // 通過系統函數名找到對應的地址,內核維護了這個數據 
  8.     addr = kprobe_addr(p); 
  9.     // 記錄這個地址 
  10.     p->addr = addr; 
  11.     p->flags &= KPROBE_FLAG_DISABLED; 
  12.     p->nmissed = 0; 
  13.     INIT_LIST_HEAD(&p->list); 
  14.     // 之前是否已經存在鉤子,是的話就插入存在的列表,否則插入一個新的記錄 
  15.     old_p = get_kprobe(p->addr); 
  16.     if (old_p) { 
  17.         /* Since this may unoptimize old_p, locking text_mutex. */ 
  18.         ret = register_aggr_kprobe(old_p, p); 
  19.         goto out
  20.     } 
  21.     // 把被 hack 的系統函數的指令保存到 probe 結構體,因為下面要覆蓋這塊內存 
  22.     /* 
  23.         prepare_kprobe => 
  24.             unsigned long addr = (unsigned long) p->addr; 
  25.             unsigned long *kprobe_addr = (unsigned long *)(addr & ~0xFULL); 
  26.             memcpy(&p->opcode, kprobe_addr, sizeof(kprobe_opcode_t)); 
  27.             memcpy(p->ainsn.insn, kprobe_addr, sizeof(kprobe_opcode_t)); 
  28.     */ 
  29.     ret = prepare_kprobe(p); 
  30.  
  31.     INIT_HLIST_NODE(&p->hlist); 
  32.     // 插入內核維護的哈希表 
  33.     hlist_add_head_rcu(&p->hlist, 
  34.                &kprobe_table[hash_ptr(p->addr, KPROBE_HASH_BITS)]); 
  35.     // hack 掉系統函數所在內存的內容 
  36.     arm_kprobe(p); 

注冊一個 probe,首先是通過被 hack 的函數名找到對應的地址,然后保存這個地址對應內存的信息,接著把 probe 插入哈希表,最后調用 arm_kprobe 函數 hack 掉系統函數所在內存的內容。看一下 arm_kprobe。

  1. void arch_arm_kprobe(struct kprobe *p){ 
  2.     // #define INT3_INSN_OPCODE 0xCC 
  3.     u8 int3 = INT3_INSN_OPCODE; 
  4.     // 把 int3 的內存復制到 addr 
  5.     text_poke(p->addr, &int3, 1); 
  6.     text_poke_sync(); 
  7.     perf_event_text_poke(p->addr, &p->opcode, 1, &int3, 1); 

0xCC 是 intel 架構下 int3 對應的指令。所以這里就是把被 hack 函數對應指令的前面部分改成 int3。完成 hack。當執行到系統函數的時候,就會執行 int3,從而觸發 trap,并執行對應的處理函數 do_int3(這里比較復雜,我也沒有深入分析,大概是這個流程)。

  1. static bool do_int3(struct pt_regs *regs){ 
  2.     kprobe_int3_handler(regs);}int kprobe_int3_handler(struct pt_regs *regs){ 
  3.     kprobe_opcode_t *addr; 
  4.     struct kprobe *p; 
  5.     struct kprobe_ctlblk *kcb; 
  6.     addr = (kprobe_opcode_t *)(regs->ip - sizeof(kprobe_opcode_t)); 
  7.  
  8.     kcb = get_kprobe_ctlblk(); 
  9.     // 通過地址從 probe  哈希表拿到對應的 probe 結構體 
  10.     p = get_kprobe(addr); 
  11.  
  12.     set_current_kprobe(p, regs, kcb); 
  13.     kcb->kprobe_status = KPROBE_HIT_ACTIVE; 
  14.  
  15.     // 執行 pre_handler 鉤子  
  16.     if (!p->pre_handler || !p->pre_handler(p, regs)) 
  17.         setup_singlestep(p, regs, kcb, 0); 

執行完。pre_handler 鉤子后,會通過 setup_singlestep 設置單步執行 flag。

  1. static void setup_singlestep(struct kprobe *p, struct pt_regs *regs, 
  2.                  struct kprobe_ctlblk *kcb, int reenter){ 
  3.     // 修改寄存器的值 
  4.     // 設置 eflags 寄存器的 tf 位,允許單步調試 
  5.     regs->flags |= X86_EFLAGS_TF; 
  6.     regs->flags &= ~X86_EFLAGS_IF; 
  7.     // 設置下一條指令為系統函數的指令 
  8.     if (p->opcode == INT3_INSN_OPCODE) 
  9.         regs->ip = (unsigned long)p->addr; 
  10.     else 
  11.         regs->ip = (unsigned long)p->ainsn.insn; 

setup_singlestep 首先設置了允許單步調試,也就是說執行下一條指令后會觸發一個 trap,從而執行一個處理函數。并設置了下一條指令為被 hack 函數對應的指令,這是在注冊 probe 時保存下來的。觸發單步調試的 trap 后,最終會執行到 kprobe_debug_handler

  1. int kprobe_debug_handler(struct pt_regs *regs){ 
  2.     struct kprobe *cur = kprobe_running(); 
  3.     struct kprobe_ctlblk *kcb = get_kprobe_ctlblk(); 
  4.     // 恢復指令為系統函數的指令 
  5.     resume_execution(cur, regs, kcb); 
  6.     regs->flags |= kcb->kprobe_saved_flags; 
  7.     // 執行 post 鉤子 
  8.     if ((kcb->kprobe_status != KPROBE_REENTER) && cur->post_handler) { 
  9.         kcb->kprobe_status = KPROBE_HIT_SSDONE; 
  10.         cur->post_handler(cur, regs, 0); 
  11.     } 

在單步調試的 trap 處理函數中,會執行 post 鉤子,并恢復真正的系統函數執行。這就完成了整個過程。

我們可以看到 kprobe 可以在系統函數執行前執行我們的鉤子,另外內核還提供了另外一個機制 kretprobe 用于在系統函數執行后返回前安裝鉤子。下面通過一個例子大致看一下 kretprobe。

  1. struct my_data { 
  2.     ktime_t entry_stamp; 
  3. }; 
  4.  
  5. // 記錄函數執行開始時間 
  6. static int entry_handler(struct kretprobe_instance *ri, struct pt_regs *regs){ 
  7.     struct my_data *data; 
  8.     data = (struct my_data *)ri->data; 
  9.     data->entry_stamp = ktime_get(); 
  10.     return 0; 
  11.  
  12. // 記錄函數執行結束時間 
  13. static int ret_handler(struct kretprobe_instance *ri, struct pt_regs *regs){ 
  14.     unsigned long retval = regs_return_value(regs); 
  15.     struct my_data *data = (struct my_data *)ri->data; 
  16.     s64 delta; 
  17.     ktime_t now; 
  18.  
  19.     now = ktime_get(); 
  20.     delta = ktime_to_ns(ktime_sub(now, data->entry_stamp)); 
  21.     return 0; 
  22.  
  23. static struct kretprobe my_kretprobe = { 
  24.     // 函數返回前執行 
  25.     .handler        = ret_handler, 
  26.     // 函數開始前執行 
  27.     .entry_handler      = entry_handler, 
  28.     .data_size      = sizeof(struct my_data), 
  29.     /* Probe up to 20 instances concurrently. */ 
  30.     .maxactive      = 20, 
  31. }; 
  32.  
  33. static char func_name[NAME_MAX] = "_do_fork"
  34. module_param_string(func, func_name, NAME_MAX, S_IRUGO); 
  35. my_kretprobe.kp.symbol_name = func_name; 
  36. // 注冊 
  37. register_kretprobe(&my_kretprobe); 

我們可以看到可以通過 kretprobe 計算系統函數的耗時。kretprobe 是基于 kprobe 實現的,主要邏輯是通過通過 kprobe 注冊一個 pre_handler,在 pre_handler 中 hack 掉函數的棧,因為函數執行時,返回地址是存在棧中的,把這個內存改成一段內核的代碼,等到函數執行完后,彈出返回地址時,就會執行內核 hack 的代碼,從而執行我們的鉤子,執行完后再跳回到真正的返回地址繼續執行。

 

總結:內核通過劫持的方式實現了 kprobe,基于 kprobe 的動態追蹤技術可謂是非常復雜而強大,我們可以利用這個機制,動態修改邏輯,收集信息。不過實現過于復雜,涉及到對 CPU 架構和內存模型的了解,本文也是大致分析了一下流程,有興趣的同學可以自行查看源碼。

 

責任編輯:武曉燕 來源: 編程雜技
相關推薦

2021-11-14 07:29:55

Linux 內核靜態追蹤Linux 系統

2016-12-08 09:57:09

LinuxDTrace技術

2025-04-02 00:33:00

2025-04-01 02:00:22

2025-06-09 02:10:00

2025-10-30 01:55:00

2022-03-03 18:18:53

BPF解釋器系統

2021-10-06 09:46:17

trace-cmd追蹤內核Linux

2025-05-15 09:12:27

2025-03-07 08:30:00

pwruLinux網絡包追蹤

2025-01-02 11:06:22

2023-03-10 14:56:37

Linuxconnect系統

2023-03-01 23:53:30

Linuxshutdown進程

2023-03-01 23:56:11

2023-02-28 09:47:42

2014-04-01 16:52:10

SUSEkGraftLinux內核

2024-04-15 11:24:32

庫存跟蹤技術NFC藍牙

2021-09-30 09:43:11

Linux內核Zstd補丁

2023-11-24 11:24:16

Linux系統

2022-05-24 12:34:32

Docker容器Linux容器進程
點贊
收藏

51CTO技術棧公眾號

九九九久久久精品| 亚洲91视频| 日本韩国视频一区二区| 五月天国产一区| 精品久久人妻av中文字幕| 日韩亚洲精品在线| 中文字幕亚洲综合久久| 欧美一区二区三区影院| 另类专区亚洲| 亚洲在线免费播放| 特级西西444www大精品视频| 亚洲AV无码乱码国产精品牛牛| 国产日韩欧美在线播放不卡| xvideos亚洲| 国产精品久久不卡| 国产高清亚洲| 色婷婷av久久久久久久| 91黄色在线看| 亚洲成人三级| 久久五月婷婷丁香社区| 99久热re在线精品视频| 国产男人搡女人免费视频| 在线观看视频免费一区二区三区| 永久555www成人免费| 国产日韩视频一区| 成人在线精品| 欧美在线观看视频在线| 欧美在线观看www| 色呦呦在线播放| 18欧美乱大交hd1984| 欧美另类高清视频在线| 国产综合在线播放| 国产原创一区二区| 国产精品亚洲视频在线观看| www亚洲视频| 99精品福利视频| 久久久久久美女| 成人自拍小视频| 欧美日韩伦理| 亚洲天堂网在线观看| 99热超碰在线| 牛牛精品成人免费视频| 精品国产网站在线观看| 色婷婷狠狠18禁久久| 亚洲天堂网站| 欧美精品丝袜久久久中文字幕| 国产视频一区二区视频| 婷婷午夜社区一区| 日本高清不卡一区| 日av中文字幕| 色香欲www7777综合网| 一本久久综合亚洲鲁鲁五月天 | 欧美日韩视频专区在线播放| 欧美国产亚洲一区| 中文在线а√天堂| 一本久久精品一区二区| 欧美黑人一级爽快片淫片高清| 91亚洲精品国产| 18+视频在线观看| 亚洲理论在线观看| 天堂а√在线中文在线| 欧美hdxxxxx| 午夜婷婷国产麻豆精品| www.av中文字幕| 黄毛片在线观看| 色综合天天天天做夜夜夜夜做| 777米奇影视第四色| 亚洲综合在线电影| 精品视频全国免费看| 最新天堂在线视频| 网站一区二区| 亚洲丁香久久久| 日韩人妻一区二区三区| 日韩成人综合| 久久精品国产96久久久香蕉| 一区二区成人免费视频| 亚洲国产婷婷| 国产精品wwwwww| 中文字字幕在线观看| 国产美女视频91| 国产精品国产精品国产专区蜜臀ah| 日本免费一区视频| 久久久久久久久久看片| 日韩在线观看电影完整版高清免费| 第一福利在线| 一区二区三区在线观看国产 | 青草av在线| 欧美视频在线看| 少妇一级淫免费播放| 日本综合精品一区| 亚洲开心激情网| 韩国一级黄色录像| 亚洲精品美女91| 国产中文欧美精品| 少妇喷水在线观看| 国产精品久久毛片a| 中国丰满熟妇xxxx性| 三上悠亚亚洲一区| 日韩视频在线永久播放| 成人无码www在线看免费| 99久久精品国产亚洲精品 | 国产亚洲欧美一区| 福利所第一导航| 日日骚欧美日韩| 99一区二区三区| 成人在线视频成人| 午夜精品福利一区二区三区av | 成人福利视频网站| 一区二区不卡视频| 91精品论坛| 日韩一级二级三级| 久久日免费视频| 亚洲精品韩国| 99热最新在线| 黄色网页在线播放| 日本久久电影网| 在线黄色免费网站| 一区二区蜜桃| 国产主播精品在线| 国内精品在线视频| 午夜伊人狠狠久久| 久久黄色一级视频| 91亚洲国产高清| 国产成人av网址| 婷婷五月综合久久中文字幕| 亚洲精品五月天| 九九九九九九九九| 欧美丝袜激情| 国产99视频精品免视看7| 全部免费毛片在线播放一个| 亚洲精选视频在线| 在线观看日本www| 欧美少妇性xxxx| 国产精品久久国产精品99gif| 色wwwwww| 亚洲一区二区美女| 潘金莲一级淫片aaaaaaa| 久久久久久久久国产一区| 国产精品久久久久免费a∨大胸| 亚洲色图21p| 性久久久久久久久| 黄色录像a级片| 伊人成人在线视频| 国产精品国产精品| 高h视频在线播放| 日韩精品中文字幕在线一区| 中文字幕另类日韩欧美亚洲嫩草| 久久99国产精品免费| 亚洲亚洲精品三区日韩精品在线视频| 久久野战av| 国产亚洲精品久久久久久777| 日本一区二区免费电影| 久久久国产午夜精品 | 日韩精品一区二区不卡| 成人免费看视频| 九一免费在线观看| 一区二区精彩视频| 国产+成+人+亚洲欧洲| 乱色精品无码一区二区国产盗| 亚洲精品中文字幕在线观看| 国产人妖在线观看| 亚洲国产日本| 欧美日韩亚洲在线 | 免费在线亚洲| 欧美日韩精品免费看| 日韩精品影院| 久久久国产精品免费| 不卡的日韩av| 欧美日韩午夜剧场| 亚洲色图 激情小说| 乱一区二区av| 欧美极品少妇无套实战| 国产精品极品国产中出| 国产91九色视频| 在线观看麻豆蜜桃| 日韩美女天天操| 国产区在线观看视频| 国产日韩欧美a| 一区二区三区四区毛片| 一区视频在线| 无码免费一区二区三区免费播放| 成人精品视频在线观看| 性色av一区二区咪爱| 国产中文字幕在线视频| 91精品国产品国语在线不卡| 激情五月色婷婷| 国产精品日日摸夜夜摸av| 亚洲综合中文网| 天堂资源在线中文精品| 强开小嫩苞一区二区三区网站| 国产精品17p| 国产精品私拍pans大尺度在线 | 亚洲精品福利视频网站| 女尊高h男高潮呻吟| 激情五月婷婷综合| 国产极品粉嫩福利姬萌白酱 | 阿v天堂2018| 欧美码中文字幕在线| 99三级在线| 久久电影天堂| 91chinesevideo永久地址| 69久久久久| 日韩电影在线观看中文字幕| 久久久久久av无码免费看大片| 亚洲综合成人在线| 自拍偷拍第9页| 91小视频在线| 永久免费看片在线观看| 日韩电影在线观看一区| 国产一级爱c视频| 亚洲一级毛片| 日韩精品另类天天更新| 欧美一性一交| 91久久久一线二线三线品牌| 高清av一区| 国产91精品视频在线观看| 午夜小视频在线观看| 中文字幕亚洲色图| 天天躁日日躁狠狠躁喷水| 日韩午夜在线观看| 91丨九色丨丰满| 色94色欧美sute亚洲线路二| 日韩欧美亚洲视频| 一区二区三区丝袜| 国产精品夜夜夜爽阿娇| 中文成人综合网| 成年人网站免费在线观看| 成人av在线一区二区| 亚洲精品鲁一鲁一区二区三区| 免费成人在线视频观看| 精品www久久久久奶水| 国产亚洲精品v| 成人在线国产视频| 亚洲视频一区| 真实国产乱子伦对白视频| 天天影视欧美综合在线观看| 亚洲欧洲久久| 日韩综合网站| 亚洲一一在线| 欧美jizz| 伊人av成人| 欧美国产一级| 制服国产精品| 91久久国产| 7777在线视频| 亚洲有吗中文字幕| 日韩欧美一级在线| 欧美精选在线| 日韩网站在线免费观看| 日韩亚洲国产精品| 可以免费观看av毛片| 日韩亚洲精品在线| av天堂永久资源网| 日韩精品国产欧美| 精品久久久久久久无码 | 精品福利在线看| 欧美三级午夜理伦| 91激情在线视频| 中文字幕人妻丝袜乱一区三区 | 亚洲第一色av| 国产91综合网| 国产精品无码网站| 久久久99久久| 日本爱爱小视频| 亚洲制服丝袜av| 久久久久久久极品| 日韩欧美在线播放| 伊人精品在线视频| 日韩三级av在线播放| 深爱激情五月婷婷| 国产一区二区三区日韩欧美| 看女生喷水的网站在线观看| 欧美成年人在线观看| caoporn-草棚在线视频最| 热久久免费国产视频| 国产成人午夜性a一级毛片| 亚洲最大的网站| 日本一道高清一区二区三区| 日本在线免费观看一区| 亚洲草久电影| 两根大肉大捧一进一出好爽视频| 免费看黄色91| 四虎精品一区二区| 欧美国产国产综合| 久久久精品人妻一区二区三区四| 好吊成人免视频| 伊人网站在线观看| 亚洲国产精品国自产拍av秋霞| 韩国福利在线| 久久久久久香蕉网| 亚洲成人一区在线观看| 99久久综合狠狠综合久久止 | 91在线观看免费视频| 污污视频网站在线免费观看| 亚洲国产一区二区在线播放| 国产精品一区无码| 日韩视频免费观看高清在线视频| 日韩专区一区二区| 久久色精品视频| 欧洲av不卡| 成人区精品一区二区| 成人中文视频| 国产在线精品91| 精品写真视频在线观看| 国产老熟女伦老熟妇露脸| 国产精品视频免费| 亚洲黄色激情视频| 欧美成人精品二区三区99精品| 国产中文字幕在线| 国色天香2019中文字幕在线观看| 人人精品久久| 免费看成人片| 亚洲国产精品一区| 中文字幕1区2区| 国产精品高潮久久久久无| 久久青青草原亚洲av无码麻豆| 日韩视频中午一区| 免费大片黄在线| 国产精品国语对白| 色天下一区二区三区| 欧美国产综合在线| 国产精品一区不卡| 欧美肥妇bbwbbw| 欧洲精品视频在线观看| 蜜桃视频在线入口www| 91超碰caoporn97人人| 中文字幕日韩在线| 欧美与动交zoz0z| 蜜臀a∨国产成人精品| 无码少妇精品一区二区免费动态| 午夜精品免费在线| 丰满熟女一区二区三区| 久久999免费视频| 韩国三级大全久久网站| 亚洲永久激情精品| 激情文学综合丁香| 黄色录像免费观看| 欧美精品乱码久久久久久| 日本中文在线| 国产在线观看一区二区三区| 91视频精品| 九九精品久久久| 亚洲欧美综合色| 91丨porny丨在线中文| 久久九九国产精品怡红院| 亚洲三级在线| 超级碰在线观看| 国产91丝袜在线18| 日韩成人免费在线观看| 亚洲国产成人精品一区二区| 国产99在线| 日本不卡一区二区三区视频| 日韩精品1区2区3区| 国产调教在线观看| 欧美日本国产一区| dj大片免费在线观看| 成人欧美一区二区三区在线观看| 亚洲手机视频| 国产一二三四五区| 欧美三级蜜桃2在线观看| 日韩美女网站| 亚洲最大成人在线| 99热免费精品在线观看| 熟女少妇一区二区三区| 欧美三区在线视频| 精品国产丝袜高跟鞋| 岛国视频一区免费观看| 国产亚洲高清视频| 中文字幕91视频| 日韩欧美第一区| 一本大道色婷婷在线| 视频一区不卡| 粉嫩av一区二区三区粉嫩| www.av麻豆| 色哟哟网站入口亚洲精品| 欧美久久一区二区三区| 国产一区二区网| 欧美激情综合五月色丁香小说| 一本色道久久综合熟妇| 久久91超碰青草是什么| 亚洲男人都懂第一日本| 中日韩av在线播放| 婷婷亚洲久悠悠色悠在线播放| 国产福利片在线| 99理论电影网| 免费高清不卡av| 国产女同在线观看| 日韩在线观看成人| 国产伦理久久久久久妇女 | 亚洲天堂av在线播放| 欧美一级大片在线视频| 女人和拘做爰正片视频| 日韩一区在线免费观看| 三级视频在线播放| 91在线精品视频| 免费日韩视频| 久久精品视频久久| 色99之美女主播在线视频| 欧美丝袜足交| 中文字幕在线播放一区二区|