2016-12-22 116 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

相关问题