天天看點

Android系統權限及簽名

Android系統權限及簽名

2015-03-23 19:13:33CSDN-chen52671-點選數:

50

Android權限及簽名

現象:系統中的一個定制Service,服務是對外開放的,使用系統簽名

應用層調用這個系統服務,擷取底層的一些資訊。如果在IDE裡進行開發,普通簽名,無法調用到該服務, 改成在系統編譯環境裡編譯,并在Android.mk中加入如下語句:

就可以順利的擷取到系統服務。其内在的原因是什麼?

說起Android的權限和簽名,就要先從Linux的權限說起,我們都知道Linux的檔案系統是有權限限制的,對于每一個檔案或者目錄,我們執行 ls -l 指令都會看到類似如下的顯示: -rw-r–r–  1 xxxxx xxxxx  681 2013-05-24 09:16 Android.mk 分别代表:檔案種類和權限;硬連結個數;User;Group;大小;最後通路/修改時間;檔案/目錄名  檔案權限代表是否對對應使用者,使用者組,其他使用者開放讀或者寫權限。而User;Group則是代表了該檔案是屬于誰的,比如使用者ABC建立的一個檔案,該檔案的User則為ABC。linux就是通過檔案權限和使用者使用者組這種方式來保證安全的。 而檔案權限是通過程序來展現的,使用者通路一個檔案,總是要通過程序來通路,即便是打開一個終端界面,也是打開了一個bash程序來檢視檔案的。 就如下圖所示: 圖1

Android系統權限及簽名

對于Android而言,啟動一個Application,一般同樣要啟動一個單獨的程序來運作,就像這樣:

上面的test應用啟動了一個單獨的程序,它的使用者的使用者組都是u0_a49。這樣如果沒有意外的話,其隻能通路到該應用自己的data資料。 問題來了,如果我想通路其他不适自己data的檔案及目錄該怎麼辦呢?首先想到的就是能不能把自定義的應用的使用者組改成和其他某應用一樣呢?比如User改成radio。

答案是可以的。不過Android為了保證系統安全,還有個規定: 必須在AndroidManifest.xml具有相同簽名+相同shareUserId屬性的兩個App,才可以配置設定相同的使用者ID。因為com.android.phone是系統應用,其簽名是LOCAL_CERTIFICATE := platform 系統簽名,是以我必須同樣采用LOCAL_CERTIFICATE := platform系統簽名,并且android:sharedUserId=”android.uid.radio” 才可以讓這個自定義的App和phone應用具有相同的UID。(當然如果隻是想通路,android:sharedUserId可以設為更高權限的使用者也可以實作)。

AndroidManifest.xml中還有一個标簽android:process,比如:android:process=”com.android.phone”,它可以單獨應用于某個Activity或者Service,也可以直接應用于Application。作用就是将對應的Activity或者Service放在com.android.phone這個程序中運作。而使用這個标簽的前提就是前一段所說的:具有相同簽名+相同shareUserId屬性。 标簽android:process的作用比如phone應用中運作的某個動态庫或者持有的某個單例對象,如果另外一個app想要使用或者說調用的話,是沒法使用,或者拿到的是另外一個單例—因為是另一個程序了。這個時候通過android:process将對于的Activity讓其在phone程序中運作。這樣就可以很友善的使用phone應用中的資源了。 圖2

Android系統權限及簽名

簽名和APK的關系:通常APK對于的是Linux中的User和Process。APK的運作,就代表一個獨特的程序的運作,而該程序又屬于某個User。具有相同簽名和相同shareUserId屬性的兩個APK,才會屬于同一個User.(APK安裝時,PackageManagerService會檢查) 簽名和權限的關系:簽名是為了讓系統識别是不是同一個作者,除了前面提到的系統簽名外,每個作者都可以自定義自己的簽名。對于簽名級的權限,比如一個作者的應用定義了一個權限。并設定權限的android:protectionLevel 為”signature”。那麼隻有該作者使用同樣簽名的另一個應用,才可以使用該權限。

為什麼root後就可以無視那些權限呢? 拿一個root過得手機,執行如下代碼:

su程式的權限如下所示:

關鍵就是那個執行權限标志位S,代表當任何使用者執行該檔案時,都擁有該檔案所有者的權限—–root。 當然這裡說的比較簡略,其實在應用執行root權限操作的時候,向Superuser.apk申請超級使用者請求, Superuser.apk利用系統漏洞,執行類似如下的操作。讓su程式居然這些功能。

這樣上面修改cpu頻率的語句就可以順利執行。

Q&A

Q:android:sharedUserId和android:process的關系? A:sharedUserId是對整個apk而言, android:process則是對某一個activity或者servicce而言,很多時候sharedUserId是android:process的前提 Q:android:sharedUserId和android:process分别對應用來說有什麼作用。 A:sharedUserId可以讓應用的uid變成類似system,phone,雖然沒有root使用者權限高,但是也可以做很多事了,具體要看其需求。具有phone的uid,然後才可以設定應用内的activity的android:process屬性。 使用android:process的原因很多: a)比如Stk應用,想要使用CatService(單例模式),于是它調用CatService.getInstance(),調用時如果已經存在CatService執行個體才會正确傳回,該執行個體還沒有建立,是拿不到的。而這個CatService是在Phone應用中,使用CommandsInterface 對象(Ril)作為參數建立。這是就需要把Stk應用放在Phone程序裡,才可以拿到CatService執行個體。 b)又或者想要設計一個系統應用,想要調用Phone  phone = PhoneFactory.getDefaultPhone()獲得Phone對象,但是這個調用隻能運作在phone程序中(原因見該函數源碼)。這就必須把調用該語句的activity設為android:process=“com.android.phone“——如Setting裡的IccLockSettings。

繼續閱讀