2012-04-18 306 views
2

我有一個由本地部分和更高層組成的應用程序。授予應用程序的root權限

因此,它需要被授予root權限才能運行一些 本地函數。

作爲我之前發佈的文章,我添加了一段代碼,取自Bluez Utils(hidd.c)。

if (bind(sk, (struct sockaddr *) &addr, sizeof(addr)) < 0) { 
    close(sk); 
    return -1; 
    } 

這段代碼已經被NDK編譯爲.so了。

不幸的是,它一直返回-1,errno是13,這意味着 權限被拒絕。

一些有經驗的開發人員(謝謝你)提到 錯誤發生,因爲這個應用程序沒有足夠的權限。

它 「不應該」 是這樣的

工藝過程=調用Runtime.getRuntime()EXEC( 「ス」)。

我認爲這意味着您擁有系統權限,但您的 應用程序不適用。 (讓我知道如果我錯了)

有什麼辦法來授予應用程序具有root權限?

任何回覆/線索/提示將不勝感激。

關於下述

山姆

+0

猜不到.. 你可以做到這一點,只有在根植設備。 – 2012-04-18 06:29:48

+0

嗨,是的,我的手機已經完全紮根。 – Sam 2012-04-18 07:09:34

+0

你試過我的解決方案嗎? – 2012-04-19 04:48:17

回答

1

我想我可以幫助你。

在這裏,我們gooo ...

void gainRoot() 
{ 
    Process chperm; 
    try { 
     chperm=Runtime.getRuntime().exec("su"); 
      DataOutputStream os = 
       new DataOutputStream(chperm.getOutputStream()); 
      os.writeBytes("chmod 777 /dev/video0\n"); 
      os.flush(); 

      os.writeBytes("exit\n"); 
      os.flush(); 

      chperm.waitFor(); 

    } catch (IOException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } catch (InterruptedException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 
} 

這是一個功能我通常用它來改變的根文件的權限。

當您執行su操作時,將會創建一個具有root特權的新進程。所以使用這個過程你可以做任何根操作。有一些特定的語法需要遵循。上面的例子顯示了這一點。

所以你可以做的一件事是建立代碼的綁定部分作爲一個單獨的可執行文件,並將其放置在system/bin或通常可執行文件保存的位置。假設可執行文件的名稱是bind123然後代替

  os.writeBytes("chmod 777 /dev/video0\n"); 
      os.flush(); 

在上面的代碼與

  os.writeBytes("bind123\n"); 
      os.flush(); 

更換。

這應該工作。可能一旦這個工作正常,我們可以嘗試將它與應用程序集成,而不依賴於可執行文件。我希望我不會讓你困惑。如果清楚一些清晰,請讓我知道....所有最好的...

+0

我稍後再說。我似乎理解你的概念,但是,正如你所提到的,如何將它與我的應用程序集成以獲得根權限對我來說仍然是未知的。 watever,我會先嚐試你的方法。 – Sam 2012-04-19 09:28:52

+0

好的。我所知道的。應用程序始終默認在用戶模式下運行。即使在普通的linux中,也是這樣的。當您執行su時,會創建一個具有UID 0的新進程。這意味着它是一個具有root previlages的內核進程。使用這個過程,執行特權任務。我們在Android應用中嘗試使用的是同樣的東西。如果你想讓你的整個應用程序擁有root權限,我不認爲有可用的支持。 – 2012-04-20 05:08:49

+0

嗨happy2Help,在我的情況下,bind()是系統調用,我希望我可以用它來與我的藍牙進行交互。但是,當我的代碼執行bind()時,該錯誤表示權限被拒絕。在文檔中,它將此錯誤解釋爲「該進程沒有適當的權限來將local_address綁定到由socket_descriptor指向的套接字(例如,如果socket_descriptor是一個地址族爲AF_INET的套接字,並且sockaddr_in結構(指向to by local_address)指定了一個限制使用的端口) – Sam 2012-04-23 01:35:37

0

你並不需要root綁定端口> = 1024。您只需在ApplicationManifest.xml文件中具有INTERNET權限。

+0

這段代碼是爲藍牙實現的。不適用於互聯網目的。 – Sam 2012-04-18 07:10:34