2016-12-22 175 views
0

我想訪問系統模型以獲取主註冊ID。如何在Android應用程序中安裝SWI處理程序

表是我學習,應該有三個步驟:

  1. 進入從用戶模式管理模式,通過SWI指令
  2. 切換到系統模式使用MSR指令在超級模式
  3. 得到主通過調用以下代碼在系統模式下注冊ID:

    MRC p15, 0, R0, c0, c0, 0 
    

我想在Android操作系統中實現它。確切地說,我想在我的應用程序運行時獲得主註冊ID。

現在我堅持如何安裝我的SWI處理程序。

根據ARM doc,當我在Android上測試它時,會創建一個異常。

是否有人遇到同樣的問題,解決它幫到底〜

PS:

/* 
* my install handler code 
*/ 
unsigned installHandler(unsigned location, unsigned *vector) { 
    unsigned vec, oldVec; 
    vec = (location - (unsigned) vector - 0x8) | 0xe59ff000; 
    oldVec = *vector; 
    *vector = vec; 
    return oldVec; 
} 
+1

我的猜測是Android OS不允許應用程序安裝SWI處理程序,因爲這會破壞安全模型。應用程序不應該能夠在管理員模式下運行自己的代碼。另外請注意,他的OS可能已經安裝了SWI處理程序來處理系統調用。 –

回答

3

你所試圖做的是錯在許多方面。


引用您鏈接在同一個文檔:

當執行SWI指令時,處理器進入超級用戶模式

現在假設任何應用程序可以安裝一個SWI處理程序,這相當於說任何應用程序都可以在管理員模式下運行。
反過來,這相當於說應用程序是OS的一部分,因此可以規避其保護。

所以J.Doe想要賺錢,寫了一個應用程序,每一個你鎖定你的手機,它打電話給他的premium-rate number,從而消耗你的信用和賺錢。
它可以做到這一點,因爲操作系統可以做到這一點,應用程序是操作系統,對吧?
此外,操作系統無法停止此應用程序,因爲它沒有更多權限。

這不會是很好的,這就是爲什麼操作系統,尤其是移動操作系統,具有保護之間用戶模式監督模式有明顯的區別。
應用程序以用戶模式運行,以便操作系統可以對它們進行沙箱。


從低級角度來看,您所做的也是錯誤的。

  • 存儲的絕對地址:
    你試圖使用加載PC方法

    用這種方法來安裝SWI處理程序,該程序計數器直接被迫處理程序地址處理器放在一個合適的內存位置(在向量地址的4KB之內)

  • 將一條指令放入載入程序計數器的向量中,其中包含所選內存位置的內容。

所以location參數(這應該是一個指針,而不是一個int)爲將處理器的完整地址寫的地址,而不是處理程序的地址。
但是,也許你已經知道,但還有另一個陷阱需要注意。

SWI處理函數對於由swi公開的每個可能的函數都是唯一的,一般實現讀取swi指令並基於其「註釋」位跳轉到正確的函數。
簡而言之,即使可以安裝一個SWI處理程序,它將取代操作系統,這是不好的。


你可能會面臨XY problem,任何理智的用戶將正好讓一個應用程序的訪問特權寄存器,因爲他們註定成爲唯一的系統程序員有用。

其中一些可能包含未暴露給用戶模式應用程序的敏感信息,如果操作系統確定這些信息可以被披露,它將提供適當的接口來讀取它。
Android是Linux系統,請檢查/proc文件系統和類似文件,看看是否可以找到您要查找的內容。

+0

感謝您的耐心回覆。這非常有幫助。同時,我意識到我的問題描述可能會引發XY問題。實際上,我想要問的是**找到一種方法在Android應用**上的ARM平臺上獲得主註冊ID。在我看到您的答案之前,我相信我在主要內容中描述的步驟是最好的方法。然而,這是一個死路一條。最後,我仍然想知道是否有一個可行的方法來實現它。 – saisam

+0

@saisam當您的應用在非ARM平臺上運行時,您希望發生什麼? –

+0

@lan Cook在這種情況下忽略它。 – saisam

相關問題