如何使Android應用程式獲得root許可權

來源:互聯網
上載者:User



寫這篇文章前,首先要感謝
Simon_fu

,他的兩篇關於
root
許可權的文章對於我的工作起到了非常大的協助,這篇文章可以說是對他的文章的一個補充。
Simon_fu
的文章可以參考如下兩個網頁:

Android程式的安全系統


Android應用程式獲得

root許可權


 

      

一般來說,
Android
下的應用程式可以“直接”得到的最大的許可權為
system
,但是如果我們需要在程式中執行某些需要
root
許可權的命令,如
ifconfig
等,就需要
root
許可權了。按照
Simon
的文章中提到的,應用程式有以下兩種辦法臨時獲得
root
許可權:

1)       



實現一個
init

實現一個
Service

,來協助
Android

應用程式執行
root

許可權的命令。

2)       



實現一個虛擬設備,這個裝置協助
Android

應用程式執行
root

許可權的命令。

 

第二種辦法我這裡沒有嘗試,暫時也不會。這裡講講我在實現第一種辦法的過程和遇到的一些問題。

 

1.      



將我們要執行的命令寫成指令碼,或者可執行程式。

下面是我的指令碼
ifconfig_test.sh

#

/system/bin/sh

ifconfig

       注意:
指令碼的第一行必須為
#

/system/bin/sh
,否則無法執行,通過
dmesg
可以查看到資訊內容為
cannot execve ./ifconfig_test.sh: Exec format error

 

也可以採用
C/C++
編寫需要執行的命令或者程式,並在編譯
image
的時候編譯成可執行程式。

 

2.      




init.rc

中註冊
service

Android
中的
service
需要在
init.rc
中註冊,
Init.rc
中定義的
Service
將會被
init
進程建立,這樣將可以獲得
root
許可權。當得到相應的通知(通過屬性設定)後,
init
進程會啟動該
service

本文中註冊的內容如下:

service ifconfig_test /system/etc/ifconfig_test.sh

oneshot

disabled

       其中,
oneshot
表示程式退出後不再重新啟動,
disabled
表示不在系統啟動時啟動。

 

注意:
這裡
service name
不能超過
16
個字元。我之前的
service name
由於定義的比較長,
18
個字元,設定屬性通知
service
啟動後查看
dmesg
可以看到提示:
init: no such service
。查看
/system/core/init/parser.c
的原始碼,在
parse_service->valid_name
函數中可以看到如下內容:
if (strlen(name) > 16) { return 0; }
,證明
service
的名字的確不能超過
16
個字元。

 

3.      




Android

應用程式提升為
system

許可權

既然應用程式可以通過啟動
service
獲得
root
許可權,那麼豈不是很不安全。
Android
考慮到了這點,規定只有
system
許可權的應用程式才能設定屬性,通知
service
啟動。關於提升
system
許可權的文章網上已有很多,這裡就不再細說,可以參考如下兩篇文章:

http://blog.csdn.net/liujian885/archive/2010/03/22/5404834.aspx

http://labs.chinamobile.com/mblog/532767_73183

 

4.      



在應用程式中添加屬性設定代碼

前面已經提到,對於
Android
來說,代理程式更新
init
啟動
service
是通過設定系統屬性來完成的,具體為設定
System
系統屬性
“ctl.start”

“ifconfig_test”
,這樣
Android
系統將會幫我們運行
ifconfig_test
這個
service
了。

對該系統屬性的設定有三種方法,分別對應三種不同的應用程式:
 

1)  Java 代碼

 
Android 在 Java 庫中提供 System.getProperty 和 System.setProperty 方法, Java 程式可以通過他們來設定和獲得屬性。代碼如下:

SystemProperties.set("ctl.start", "ifconfig_test");

上面的代碼是通知
Android
執行
ifconfig_test service
,如果需要查詢當前
service
執行的狀態,如是否執行完畢,可以通過如下代碼查詢:

ret = SystemProperties.get("init.svc. ifconfig_test ", "");

if(ret != null && ret.equals("stopped"))

 
{

     
return true;

 
}

 
      2) 


JNI
代碼

當編寫
NDK
的程式時,可以使用
property_get

property_set
這兩個
API
來獲得和設定屬性。使用這兩個
API
必須要包含標頭檔
cutils/properties.h


和連結
libcutil
庫。

 

3) 


Shell
指令碼

Android
提供了命令列
setprop

getprop
來設定和擷取屬性,他們可以在指令碼中被使用。

 

由於我的程式是在
JNI
中呼叫指令碼,指令碼中又執行
ifconfig
,因此我將設定屬性的部分放在了指令碼中完成,代碼如下:

setprop ctl.start ifconfig_test

 

#wait for the service until it stops

ret=1

while [ $ret -ne 0 ]

do

      
getprop | grep "$ENABLE_MAPPER_SRV" | grep stopped

      
ret=$?

done

 
     通過上面
4
個步驟,
Android
應用程式就獲得了
root
許可權,更具體的說,是在執行我們需要執行的命令時臨時獲得了
root
許可權。

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.