.so作為安卓系統中最常見的二進位制檔案,如何高效地載入和呼叫so是每個開發者必備的技能。了解安卓系統中.so檔案特性,對於開發者來說非常必要的。360加固保高階安全研究員吳樂,通過本文為開發者詳細講解了安卓系統上.so檔案的一些特性。
1、gnu hashes
安卓上在載入so的時候它需要乙個動態鏈結的過程,hashes表結構就是它在載入動態鏈結過程中乙個非常重要的結構。動態鏈結庫so在記憶體對映完成後,必須對其內部的符號進行動態鏈結,之後才可以正常呼叫so中的函式。android上使用hash表等結構來加速動態鏈結的過程。gnuhash就是一種新的hash結構。而android系統中以前預設使用的是elfhash機構。從安卓6.0開始,谷歌就採用了gnu hashes這樣乙個結構來預設代替安卓系統之前使用的elfhash結構。
gnu hashes的用法:
在android.mk檔案中新增:
local_ldflags := -wl,--hash-style=gnu
只包含gnuhash
local_ldflags := -wl,--hash-style=both
同時包含gnuhash和elf hash,相容所有系統版本
2、correctsoname/path handling
correct soname/path handing是谷歌官方對動態載入器修復的一處設計錯誤。
在安卓6.0之前,當apk同時載入兩個so檔案,這兩個so檔名稱相同、路徑不同,導致apk只載入第乙個,後續so無法正常載入;
3、enable logging of dlopen
用法:4、missingsection headers
android 7.0開始會對so的section header做完整性檢查,凡是抹去了section header的so都無法通過完整性檢查,無法正常載入。這意味著無法通過對section header的抹除來防止so被逆向。
5、invalid elfheader/section headers
android 8.0開始對so的elf header和section header中的內容正確性做了檢查,凡是沒有通過內容正確性檢查的so都無法進行正常載入;
這意味著無法通過對elfheader或section header內部欄位的抹除來防止so被逆向。
安卓綠色聯盟後續會根據每期技術沙龍議題輸出精彩技術乾貨文章,為未能現場參加技術沙龍的您提供另乙個乾貨學習機會。
linux c 動態鏈結庫so編寫
linux下的動態鏈結庫是.so檔案,即 shared object,下面是乙個簡單的例子說明如何寫.so以及程式如何動態載入.so中的函式和物件。testso.h ifndef testso h define testso h extern c endif testso h testso.cpp ...
so動態鏈結庫生成 呼叫
linux下檔案的型別是不依賴於其字尾名的,但一般來講 o,是目標檔案,相當於windows中的.obj檔案 so 為共享庫,是shared object,用於動態連線的,和dll差不多 a為靜態庫,是好多個.o合在一起,用於靜態連線 1 動態庫的編譯 下面通過乙個例子來介紹如何生成乙個動態庫。這裡...
Android下動態鏈結庫 so呼叫的簡單例子
在這篇文章中 我在android下使用dlopen函式呼叫.so檔案沒有成功,於是只得改用在編譯過程中指定.so檔案的方式加以呼叫,這次在android下倒是通過了。先在 android原始碼目錄 development 目錄下建立乙個資料夾,比如起名叫 test123 在test123目錄下建立以...