曾因朋友問到監(jiān)控,致使我探究了kretprobe的實(shí)現(xiàn),想到編譯中的尾調(diào)用優(yōu)化,作個(gè)小結(jié)
?1. kretprobe_trampoline_holder該跳轉(zhuǎn)函數(shù)無參是必須的或說最好的通用設(shè)計(jì),因?yàn)樘鎿Q返回地址是非正常程序流程,即被探測函數(shù)的調(diào)用者無感知,不存在為跳轉(zhuǎn)函數(shù)準(zhǔn)備入?yún)ⅰH粢O(shè)計(jì)傳參且只讀,則不會破壞被探測函數(shù)調(diào)用者的上下文,但跳轉(zhuǎn)函數(shù)內(nèi)部流程怎么用參數(shù)是個(gè)問題,這需要一種約定
?2. 跳轉(zhuǎn)函數(shù)為調(diào)用trampoline_handler準(zhǔn)備入?yún)ⅲ丛跅I蠘?gòu)造一個(gè)(不完整的)pt_regs,再把它地址即棧頂賦給rdi,rdi是x86_64上傳入第一參數(shù)使用的寄存器,同時(shí)預(yù)留一個(gè)棧單元存放原返回地址(為什么要預(yù)留?因?yàn)楸惶綔y函數(shù)返回時(shí),其調(diào)用者存放返回地址的棧空間被釋放了,所以得在跳轉(zhuǎn)函數(shù)內(nèi)造一個(gè))。由于trampoline_handler內(nèi)調(diào)到用戶自定義handler而傳入pt_regs,因此自定義handler內(nèi)要注意最好別改動pt_regs,否則會破壞被探測函數(shù)調(diào)用者的上下文
posted on 2023-09-13 02:26
春秋十二月 閱讀(339)
評論(0) 編輯 收藏 引用 所屬分類:
System