最近在移植Android過(guò)程中遇到了Android程序(apk)權限的問(wèn)題。最近也對這方面進(jìn)行了一些了解,在此和大家分享。
Android框架是基于Linux內核構建,所以Android安全系統也是基于Linux的安全架構建立的。在Linux安全系統中,用戶(hù)和組起著(zhù)重要的作用,Linux中所有的資源給不同的用戶(hù)和用戶(hù)組設置了不同的訪(fǎng)問(wèn)屬性。如果你對Linux下面用戶(hù)和組的概念不熟悉,請先補習一下Linux基礎知識。
在A(yíng)ndroid系統中,系統為每一個(gè)應用程序(apk)創(chuàng )建了一個(gè)用戶(hù)和組。這個(gè)用戶(hù)和組都是受限用戶(hù),不能訪(fǎng)問(wèn)系統的數據,只能訪(fǎng)問(wèn)自己的文件和目錄,當然它也不能訪(fǎng)問(wèn)其他應用程序的數據。這樣設計可以盡可能地保護應用程序的私有數據,增強系統的安全性和健壯性。
但是有一些應用程序是需要訪(fǎng)問(wèn)一些系統資源的。比如Setting程序,他就需要訪(fǎng)問(wèn)wiffi,在系統中創(chuàng )建刪除文件等等操作。怎樣做到這一點(diǎn)兒呢?Android通過(guò)一定途徑可以獲得system權限。獲得system用戶(hù)權限,需要以下步驟:
1. 在應用程序的AndroidManifest.xml中的manifest節點(diǎn)中加入android:sharedUserId="android.uid.system"這個(gè)屬性。
2. 修改Android.mk文件,加入LOCAL_CERTIFICATE := platform這一行
3. 使用mm命令來(lái)編譯,生成的apk就有修改系統時(shí)間的權限了。
一般情況下system用戶(hù)權限就已經(jīng)夠用了,system用戶(hù)可以在系統中創(chuàng )建和刪除文件,訪(fǎng)問(wèn)設備等等。但是有些情況下system權限還是不夠的。比如:設置網(wǎng)卡IP地址,ifconfig命令是需要root權限的。我可以很肯定的說(shuō),在A(yíng)ndroid下面應用程序是沒(méi)有可能拿到root權限的。但是如果我的應用程序需要root權限怎么辦呢?只能想辦法繞般過(guò)去。就以我的問(wèn)題為例,設置網(wǎng)卡IP地址,root權限下面命令為:
ifconfig eth0 192.168.1.188
在普通用戶(hù)或者system用戶(hù)權限下面這條命令是不起作用的,但是不會(huì )返回失敗和異常,這個(gè)我個(gè)人認為是Android的bug。那么怎樣實(shí)現這個(gè)功能呢?我想出了兩個(gè)辦法。
1、系統啟動(dòng)的時(shí)候init進(jìn)程創(chuàng )建一個(gè)后臺進(jìn)程,該進(jìn)程處于root用戶(hù)權限下面。用來(lái)監聽(tīng)系統中應用程序的請求(可以用socket實(shí)現),并代其完成。這樣應用程序就可以執行root用戶(hù)權限的任務(wù)了。
2、實(shí)現一個(gè)虛擬的設備,該設備的功能就是在內核態(tài)幫應用程序執行相應的命令。Linux內核態(tài)沒(méi)有權限的問(wèn)題了??隙梢詧绦谐晒?。
我解決設置網(wǎng)卡IP地址問(wèn)題時(shí),選擇是后者。相對來(lái)說(shuō)設計比較簡(jiǎn)單。
如果你到網(wǎng)上去搜一下,你會(huì )發(fā)現很多文章說(shuō)怎樣讓Android應用程序獲得root權限。如果你不想浪費時(shí)間就不要相信他們,因為那些途徑是根本不可能獲得root權限的。
我的后續博文《Android應用程序獲得root權限》講解讓?xiě)贸绦颍ˋPK)通過(guò)第一種方法獲得root權限的方法,請關(guān)注。



請教博主
2010-10-25 14:14:51
請教博主,“實(shí)現一個(gè)虛擬的設備,該設備的功能就是在內核態(tài)幫應用程序執行相應的命令。Linux內核態(tài)沒(méi)有權限的問(wèn)題了??隙梢詧绦谐晒??!斑@個(gè)怎么做呢,能否給個(gè)例子。比如我想在A(yíng)PK中執行一個(gè)df命令,取得一些硬盤(pán)相關(guān)的數據,該怎么做呢,謝謝!
[回復]
Simon_fu 回復:
十月 25th, 2010 at 15:11
不好意思,代碼我那不出來(lái)~!不能給你例子。
但是在kernal中實(shí)現一個(gè)設備驅動(dòng),這個(gè)設備接受字符串命令,然后幫你調用上層命令,應該是一個(gè)比較easy的問(wèn)題阿~!
如果你是作應用程序的開(kāi)發(fā)人員,你需要驅動(dòng)開(kāi)發(fā)人員幫忙實(shí)現這個(gè)設備。
[回復]
請教博主 回復:
十月 25th, 2010 at 15:14
謝謝^_^
[回復]
匿名 回復:
十二月 23rd, 2010 at 17:04
1、系統啟動(dòng)的時(shí)候init進(jìn)程創(chuàng )建一個(gè)后臺進(jìn)程,該進(jìn)程處于root用戶(hù)權限下面。用來(lái)監聽(tīng)系統中應用程序的請求(可以用socket實(shí)現),并代其完成。這樣應用程序就可以執行root用戶(hù)權限的任務(wù)了。
請教博主:能做個(gè)例子嗎?我無(wú)從下手
[回復]
Simon_fu 回復:
十二月 24th, 2010 at 14:47
呵呵~!
這個(gè)小程序我就不提供了,你可以在init.rc中啟動(dòng)這個(gè)進(jìn)程。
這個(gè)后臺進(jìn)程就是root權限的。
[回復]