基于linker實現so加殼技術的補充,旨在解決將so文件與dex文件結合時遇到的問題。在實際應用中,發現存在如下挑戰:
so地址頁對齊&多余占位數據實現libart.so中的inlinehookhook dex加載函數更改只讀權限修正getsoinfo函數針對第一個問題,為了滿足某些函數在使用過程中需要頁開始的條件,必須保證so文件在內存中的偏移量%0x1000等于0。因此,直接在dex文件末尾拼接so文件的方式不可取,因為so文件是linking view,而執行時需要Execution View。為了解決這個問題,可以利用系統提供的ElfReader::Load結束時的soinfo信息,將其執行視圖整體dump出來。使用frida、ida或自定義裝載函數(避免調用init_arry和JNI_Onload)來實現這一過程。
成功dump出so文件后,將其復制粘貼至dex文件末尾,補零以確保對齊。隨后,將文件大小、校驗和等參數補全,完成準備工作。最后,將so文件與插件dex文件合并為一個文件,通過DexClassLoader加載執行。
為了解決第二個問題,定位真正so文件的首地址,可以嘗試從libart.so的導出表中找到LoadMethod函數的地址。通過分析Elf文件格式,獲取導出符號的函數地址,并使用類似的計算方法實現inline hook。實現過程包括定位函數地址、跳轉到自定義hook函數,并在返回時恢復指令。
針對第三個問題,通過修改dex加載函數的權限,使dex文件可讀、可寫、可執行。在加載dex文件時,利用mprotect函數進行權限更改,但由于權限限制,需通過hook MapFileAtAddress函數,改變其參數以實現所需權限。
解決第四個問題,即修正getsoinfo函數,確保在不同型號手機上的適配性。通過分析inline函數實現過程,最終找到獲取soinfo指針的算法,并翻譯成C代碼,以解決機型差異帶來的問題。
總結而言,通過解析Elf文件格式,實現了so加殼技術的補充,解決了so地址頁對齊、實現inlinehook、更改dex加載函數權限、修正getsoinfo函數等關鍵問題。雖然本文提供了一個基礎示例,未對數據加密,但在實際應用中,加密dex中的so信息可增強安全性和保護效果。同時,本文指出hook機制可能存在穩定性問題,有待進一步優化。感謝大家的閱讀與關注。