2017-06-20 70 views
1

我是計算機科學專業的學生。作爲我的主項目的一部分,我試圖攔截Android平臺上本地庫中函數的調用。目標是決定是否允許該呼叫或拒絕該呼叫以提高安全性。Android:我如何攔截本地函數調用?

繼研究論文1的方法之後,我想修改ELF文件的Procedure Procedure Linkage Table(PLT)和Global Offset Table(GOT)。我的想法是,我想讓所有的函數調用指向我自己的攔截函數,它決定是阻止調用還是傳遞給原始目標函數。 (在第三章,第2章程序加載和動態鏈接,第2-13頁,「全局偏移表」和「程序鏈接表」一節)中指出,PLT的實際內容和形式與GOT取決於處理器。但是,在文檔「ARM體系結構的ELF」3中,我無法看到這兩個表中的任何一個的確切規格。我現在專注於ARM,目前還沒有考慮其他架構。

我有3個問題:

  • 我該如何映射一個符號,一個GOT或PLT入口?
  • 在哪裏可以找到GOT的ARM處理器的確切規格和PLT?
  • 作爲PLT包含機器代碼;我將不得不解析該代碼以修改目標地址,還是所有PLT條目看起來都是相同的,這樣我纔可以爲每個PLT條目以不變的偏移量修改內存?

感謝, 曼努埃爾

回答

0
  1. 你需要分析ELF頭和由SHT_DYNSYM字符串名稱查找符號索引。然後遍歷GOT(將被稱爲「.rela.plt」)並找到具有匹配索引的條目。
  2. 我不知道正式的規範,但你總是可以學習android的鏈接源和拆卸一些二進制注意到模式
  3. 通常PLT只是普通的代碼,你並不需要修改它。它實際上是這樣設計的,因爲如果鏈接器不得不修改它,那麼最終會出現RWX內存,這是不可取的。所以你只需要重寫GOT中的條目。默認情況下,GOT條目指向解析器例程,該例程將查找所需的功能並將條目寫入GOT。這是在Linux上。在Android上,地址已經解決。

我做了一件對x86_64的Linux的 https://github.com/astarasikov/sxge/blob/vaapi_recorder/apps/src/sxge/apps/demo1_cube/hook-elf.c

而且也有一個這樣做的博客,你想在Android https://www.google.de/amp/shunix.com/android-got-hook/amp/

+0

感謝什麼,那第二個鏈接似乎真的很有趣。而且我不知道符號的_index_與GOT條目的_index_匹配。這是一個非常有價值的信息。 我會嘗試你的建議,如果我成功了,我會接受你的答案。 – fritteli

+0

我已經將ELF文件的內存轉儲與其表示形式作爲文件在磁盤上進行了比較。從我看到的.rel.plt部分是相同的(對於我測試的文件沒有.rela.plt)。不同之處在於.got,它顯然是GOT。 – fritteli