• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            隨筆-162  評論-223  文章-30  trackbacks-0
            描述
               攔截Linux動態庫API的常規方法,是基于動態符號鏈接覆蓋技術實現的,基本步驟是
                1. 重命名要攔截的目標動態庫。
                2. 創建新的同名動態庫,定義要攔截的同名API,在API內部調用原動態庫對應的API。這里的同名是指與重命名前動態庫前的名稱相同。
               顯而易見,如果要攔截多個不同動態庫中的API,那么必須創建多個對應的同名動態庫,這樣一來不僅繁瑣低效,還必須被優先鏈接到客戶二進制程序中(根據動態庫鏈接原理,對重復ABI符號的處理是選擇優先鏈接的那個動態庫)。 另外在鉤子函數的實現中,若某調用鏈調用到了原API,則會引起死循環而崩潰。本方法通過直接修改ELF文件中的動態庫API入口表項,解決了常規方法的上述問題。

            特點
               1. 不依賴于動態庫鏈接順序。
               2. 能攔截多個不同動態庫中的多個API。
               3. 支持運行時動態鏈接的攔截。
               4. 鉤子函數內的實現體,若調用到原API,則不會死循環。


            實現
               攔截映射表
                  為了支持特點2和3,建立了一個攔截映射表,這個映射表有2級。第1級為ELF文件到它的API鉤子映射表,鍵為ELF文件句柄,值為API鉤子映射表;第2級為API到它的鉤子函數映射表,鍵為API名稱,值為包含最老原函數地址和最新鉤子函數地址的結構體,如下圖
                  當最先打開ELF文件成功時,會在第1級映射表中插入記錄;反之當最后關閉同一ELF文件時,就會從中移除對應的記錄。當第一次掛鉤動態庫API時,就會在第2級映射表插入記錄;反之卸鉤同一API時,就會從中刪除對應的記錄。

               計算ELF文件的映像基地址
                  計算映像基地址是為了得到ELF中動態符號表和重定位鏈接過程表的內容,因為這些表的位置都是相對于基地址的偏移量,該算法在打開ELF文件時執行,如下圖
                  EXE文件為可執行文件,DYN文件為動態庫。對于可執行文件,映射基地址為可執行裝載段的虛擬地址;對于動態庫,可通過任一API的地址減去它的偏移量得到,任一API的地址可通過調用libdl.so庫API dlsym得到,偏移量通過查詢動態鏈接符號表得到。

               打開ELF文件
                  為了支持特點2即攔截不同動態庫的多個API,節省每次掛鉤API前要打開并讀文件的開銷,獨立提供了打開ELF文件的接口操作,流程如下圖
                  若輸入ELF文件名為空,則表示打開當前進程的可執行文件,此時要從偽文件系統/proc/self/exe讀取文件路徑名,以正確調用系統調用open。當同一ELF文件被多次打開時,只須遞增結構elf的引用計數。

               掛鉤API
                  當打開ELF文件后,就可掛鉤API了,流程如下圖
                  當第一次掛鉤時,需要保存原函數以供后面卸鉤;第二次以后繼續掛鉤同一API時,更新鉤子函數,但原函數不變。   
               
               卸鉤API
                  當打開ELF文件后,就可卸鉤API了,流程如下圖

               關閉ELF文件
                  因為提供了打開ELF文件的接口操作,所以得配有關閉ELF文件的接口操作。當不需要掛鉤API的時候,就可以關閉ELF文件了,流程如下圖


            運行時動態攔截裝置
               在初始化模塊中打開當前可執行文件,掛鉤libdl.so庫的API dlopen和dlsym;在轉換模塊中,按動態庫句柄和API名稱在攔截映射表中查找鉤子函數,若找到則返回鉤子函數,否則返回調用dlsym的結果;在銷毀模塊中,卸鉤dlopen和dlsym。
            當動態庫被進程加載的時候,會調用初始化模塊;當被進程卸載或進程退出的時候,會調用銷毀模塊;當通過dlsym調用API時,則會在dlsym的鉤子函數中調用轉換模塊。通過環境變量LD_PRELOAD將動態庫libhookapi.so設為預加載庫,這樣就能攔截到所有進程對dlopen及dlsym的調用,進而攔截到已掛鉤動態庫API的調用。
            posted on 2016-08-25 11:10 春秋十二月 閱讀(2293) 評論(0)  編輯 收藏 引用 所屬分類: System
            亚洲精品tv久久久久久久久久| 伊人久久无码中文字幕| 国产精品免费看久久久香蕉| 欧美亚洲国产精品久久蜜芽| 日韩欧美亚洲国产精品字幕久久久 | 久久午夜无码鲁丝片午夜精品| 香蕉久久久久久狠狠色| 99久久中文字幕| 久久精品综合网| 久久男人中文字幕资源站| 97久久综合精品久久久综合| 狠狠色丁香久久婷婷综合蜜芽五月| A狠狠久久蜜臀婷色中文网| 亚洲精品tv久久久久| 丁香久久婷婷国产午夜视频| 老色鬼久久亚洲AV综合| 综合久久久久久中文字幕亚洲国产国产综合一区首 | 伊人久久大香线蕉亚洲五月天| 国产69精品久久久久99| 国产精品禁18久久久夂久| 青青青青久久精品国产h久久精品五福影院1421 | 色成年激情久久综合| 久久亚洲国产成人精品性色| 伊人久久大香线蕉AV一区二区| 热99re久久国超精品首页| 久久超乳爆乳中文字幕| 欧美亚洲色综久久精品国产| 中文字幕乱码人妻无码久久| 久久精品国产AV一区二区三区| 久久这里有精品视频| 久久久久九国产精品| 国产AⅤ精品一区二区三区久久| 久久精品蜜芽亚洲国产AV| 国产三级久久久精品麻豆三级| 99精品国产99久久久久久97 | 日本久久久久亚洲中字幕| 久久丫精品国产亚洲av不卡| 久久香蕉国产线看观看精品yw| 国内精品久久久久影院一蜜桃| 国产国产成人精品久久| 国产成人久久777777|