精品欧美一区二区三区在线观看 _久久久久国色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久久夜色精品国产网站| 日韩午夜激情免费电影| 成人免费黄色大片| 刘玥91精选国产在线观看| 欧美高清视频一区| 欧美性猛交xxxx富婆| 超碰精品在线观看| 久久午夜鲁丝片午夜精品| 国产精选久久久久久| 美日韩丰满少妇在线观看| 51xx午夜影福利| 少妇喷水在线观看| 麻豆精品蜜桃视频网站| 欧美交受高潮1| 色一情一交一乱一区二区三区| 全球最大av网站久久| 亚洲在线免费播放| 日本不卡一二三区| 蜜臀av免费在线观看| 欧美a级一区二区| 九九久久精品一区| 久久久久久久毛片| 国产精品调教| 91精品免费观看| 玩弄japan白嫩少妇hd| 色呦呦在线免费观看| 国产欧美视频一区二区三区| 99久热re在线精品996热视频| 国产成人无码av| 亚洲特级毛片| 久久久精品国产| 中文字幕免费在线看线人动作大片| 999国产精品一区| 欧美精品亚洲一区二区在线播放| 欧美 国产 综合| 秋霞在线视频| 一色桃子久久精品亚洲| 欧美一区二区三区在线免费观看 | 欧美美女一级片| 国产精品专区免费| 亚洲国产裸拍裸体视频在线观看乱了| 欧美一区二区性放荡片| 亚州av一区二区| 九九视频免费看| 97久久夜色精品国产| 国产丝袜精品第一页| 一级黄色免费视频| 日韩精品一区二区三区中文在线| 欧美日本一道本| 高清一区二区视频| 欧美大胆成人| 色综合久久久久网| 国产亚洲天堂网| 国产美女高潮在线| 精品国产乱码久久久久久婷婷| av影院在线播放| 在线黄色网页| 亚洲自拍与偷拍| av在线com| 超碰在线资源| 亚洲3atv精品一区二区三区| 成人网站免费观看入口| 成人爽a毛片免费啪啪动漫| 亚洲高清免费视频| 日本中文字幕网址| 中文在线免费视频| 色94色欧美sute亚洲线路一ni| 欧美精品色婷婷五月综合| 韩国久久久久久| 欧美专区日韩专区| 亚洲这里只有精品| 未满十八勿进黄网站一区不卡| 欧美精品1区2区| 美女被艹视频网站| ccyy激情综合| 亚洲精品中文字| 日本性高潮视频| 99久久99久久精品国产片果冰| 日韩中文字幕国产| 青娱乐91视频| 国产精品一卡| 国产精品羞羞答答| 国产黄色高清视频| bt欧美亚洲午夜电影天堂| 蜜桃视频成人| 亚洲xxxxxx| 亚洲一级电影视频| 丝袜老师办公室里做好紧好爽| 吞精囗交69激情欧美| 欧美日韩一区二区在线观看视频| 亚洲最大天堂网| jazzjazz国产精品久久| 亚洲色图色老头| 最新一区二区三区| 国产伦理一区| 91九色精品视频| 手机福利小视频在线播放| 国产精品女主播在线观看| 欧美日韩中文字幕在线播放| 毛片无码国产| 日韩午夜激情av| 一级特黄曰皮片视频| 欧美午夜久久| 国产精品久久国产精品99gif| 国产黄a三级三级看三级| ww久久中文字幕| 51xx午夜影福利| 秋霞国产精品| 亚洲福利视频久久| 婷婷社区五月天| 久久xxxx| 国产成人精品自拍| 日本不卡在线| 日本电影亚洲天堂一区| 中文字幕无码毛片免费看| 欧美丝袜激情| 热久久免费国产视频| 国产99久久九九精品无码免费| 久久综合久久综合亚洲| 超碰10000| 99久久久国产精品免费调教网站 | 国产日韩一级二级三级| 自拍偷拍99| 欧美办公室脚交xxxx| 9191国产精品| 国产亚洲精品精品精品| 激情欧美亚洲| 成人国产精品日本在线| 色视频免费在线观看| 亚洲欧美日韩一区二区三区在线观看| 久草热视频在线观看| 亚洲一区二区三区在线免费| 久久伊人精品| 一本色道a无线码一区v| www.色.com| 成人免费在线播放| 国产91精品青草社区| 色婷婷久久综合中文久久蜜桃av| 成人午夜精品在线| www亚洲国产| 日本综合视频| 日韩电影网在线| 麻豆视频在线观看| 久久性天堂网| 欧美精品在线一区| 爱看av在线| 91精品久久久久久蜜臀| 性欧美精品男男| 日韩亚洲国产欧美| αv一区二区三区| 日本片在线观看| 777久久久精品| 丁香六月激情综合| 男女男精品网站| 视频三区二区一区| 欧美电影网站| 国产香蕉精品视频一区二区三区 | 亚洲三级视频网站| 羞羞色国产精品网站| 久久久久日韩精品久久久男男| 丰满人妻av一区二区三区| 亚洲欧美日韩成人高清在线一区| 高清一区在线观看| 国语产色综合| 国产成人av网址| 国产专区在线| 欧美猛男超大videosgay| 国产美女免费无遮挡| 国产精品久久久久久模特| 国产精品一区二区a| 欧美videosex性极品hd| 日韩欧美中文字幕公布| 免费一级片视频| 91在线视频播放| 91国视频在线| 国产精品一区二区99| 国产精品美女在线| 日韩黄色影院| 欧美少妇bbb| 欧美日韩国产精品综合| 国产成人精品综合在线观看| 国产911在线观看| 99久久香蕉| 7777精品视频| 国产女人在线观看| 日韩午夜激情电影| 国产无码精品久久久| 9久草视频在线视频精品| 免费无码av片在线观看| 九一亚洲精品| 国产精品第七影院| 午夜小视频在线观看| 亚洲国产私拍精品国模在线观看| 亚洲伊人成人网| 国产色产综合色产在线视频| 尤物国产在线观看| 精品成人在线| 欧美一进一出视频| 国产精品久久久久久久久久辛辛| 欧美激情区在线播放| 涩爱av在线播放一区二区| 欧洲亚洲国产日韩| 亚洲一二三在线观看| 成人精品高清在线| 成年人在线看片| 91精品国产成人观看| 国产一区二区三区av在线| 欧美18—19sex性hd| 精品国偷自产在线| 欧美一区二区三区黄片| 日本韩国一区二区三区视频| 91九色丨porny丨极品女神| a美女胸又www黄视频久久| 天天综合网日韩| 国产精品亚洲综合久久| 一区在线电影| 日韩av不卡一区| 成人情趣片在线观看免费| 77thz桃花论族在线观看| 亚洲欧美日韩中文视频| 高潮毛片7777777毛片| 欧美手机在线视频| 国产精彩视频在线| 国产精品免费aⅴ片在线观看| 无码人妻久久一区二区三区蜜桃| 美女视频一区二区| av7777777| 欧美福利影院| 亚洲日本理论电影| 色先锋久久影院av| 成人欧美一区二区三区黑人孕妇| 久久天堂av| 97在线看福利| 国产精成人品免费观看| 99re6热只有精品免费观看| 日韩美女在线观看| 免费一二一二在线视频| 久久色免费在线视频| 国产免费视频在线| 亚洲美女www午夜| 亚洲国产精品久久久久久6q| 91精品福利在线一区二区三区| 久久久久久在线观看| 亚洲第一av色| 可以直接看的黄色网址| 国产精品天天看| 先锋影音av在线| 久久影院电视剧免费观看| 日本50路肥熟bbw| 国产福利精品一区| 五月天六月丁香| 国产激情一区二区三区四区| 午夜久久福利视频| 免费人成黄页网站在线一区二区 | 亚洲综合精品四区| 久久精品国产sm调教网站演员| 在线日本高清免费不卡| 黄色一级片黄色| 亚洲一级一区| 97超碰在线人人| 天天影视欧美综合在线观看| 老司机av福利| 91精品一区二区三区综合在线爱| 这里只有精品66| 亚洲深深色噜噜狠狠爱网站| 青青草成人激情在线| 国产成人三级| 亚洲一区二区三区午夜| 久久影视一区| 国产成人精品免费看在线播放| 日韩免费在线| 日本丰满少妇黄大片在线观看| 五月婷婷六月综合| 中国成人在线视频| 一区二区三区中文| av免费观看大全| 亚洲一区二区三区四区五区午夜 | 青春草视频在线观看| 欧美激情va永久在线播放| free性欧美| 国语对白做受69| 欧洲一级精品| 成人亚洲欧美一区二区三区| 日韩一区二区三区精品视频第3页| 99视频网站| 天堂俺去俺来也www久久婷婷 | 成人欧美一区二区三区白人| 色欲人妻综合网| 亚洲第一综合色| 亚洲另类在线观看| 欧洲精品一区二区三区在线观看| 国产视频在线一区| 亚洲福利视频网| 98在线视频| 欧美激情一区二区三区成人| 中文字幕一区久| 国产精自产拍久久久久久| 成人久久精品| 久久精品国产99精品国产亚洲性色| 亚洲精品**不卡在线播he| 91免费视频黄| 国产一区二区三区成人欧美日韩在线观看 | 亚洲黄色精品视频| 亚洲精品视频免费| 黄网站免费在线播放| 国模精品视频一区二区三区| 日韩一级特黄| 黄色99视频| 97精品97| 黄色一级片播放| 日韩在线观看一区二区| 少妇伦子伦精品无吗| 国产午夜精品理论片a级大结局| 国产三级aaa| 精品福利免费观看| 99er热精品视频| 亚洲精品日韩久久久| 性欧美猛交videos| 国产suv精品一区二区三区88区| 国产一区一一区高清不卡| 18成人在线| 国语产色综合| 蜜桃传媒一区二区三区| 精品一区二区三区在线观看| 朝桐光av一区二区三区| 一区二区三区精品在线| a片在线免费观看| 亚洲第一区在线| 黄色网址在线免费| 国产精品视频区1| 天天做夜夜做人人爱精品| 一本色道久久综合亚洲精品婷婷| 99视频一区| 亚洲精品第三页| 国产精品亲子伦对白| 日韩精品成人在线| 日韩午夜激情免费电影| 在线观看的av| 国产精品日韩在线播放| 婷婷精品在线观看| 91精品国产91久久久久麻豆 主演| 免费精品视频在线| www..com.cn蕾丝视频在线观看免费版| 亚洲国产精品影院| 国产丝袜视频在线观看 | 超碰在线观看免费版| 国产精品女人网站| 国内精品久久久久久久影视简单 | 激情欧美日韩一区| 波多野结衣一二三区| 亚洲免费电影在线| 国产又爽又黄免费软件| 中文字幕av一区二区| 国产经典一区| 日韩性感在线| 日韩精品亚洲一区| 国产人妻一区二区| 欧美亚洲禁片免费| 国产大片在线免费观看| 国产91久久婷婷一区二区| 偷窥自拍亚洲色图精选| 国产熟人av一二三区| 久久久精品人体av艺术| 91玉足脚交嫩脚丫在线播放| 日韩精品极品视频| 亚洲第一香蕉网| 久久国产日韩| 中文字幕免费视频| 亚洲午夜三级在线| 天堂av中文在线资源库| 45www国产精品网站| 亚洲宅男一区| 欧美综合在线观看视频| 国产亚洲综合在线| 日本黄色中文字幕| 精品国产自在精品国产浪潮| 日韩高清在线观看一区二区| 久操手机在线视频| 99久久99久久免费精品蜜臀| 日韩xxx高潮hd| 综合国产在线观看| 久久视频社区| 无码专区aaaaaa免费视频| 欧美国产精品一区二区| 国产一区二区在线播放视频| 欧美成人久久久| 国产欧美一区二区三区米奇| 成年人在线看片| 亚洲天堂免费在线观看视频| 丰满大乳国产精品| 青青在线视频一区二区三区| jiujiure精品视频播放| 在线免费视频一区| 亚洲精品国产第一综合99久久 | 欧美韩日亚洲| 久久综合精品一区| 国产在线精品一区二区夜色| 国产精品1234区| 有码中文亚洲精品| 久久视频免费|