Android中使用”hacker”方式解决ServiceManager的权限限制问题(1)

缘由

有一个系统,需要我们的解决方案,但是却没有提供BSP的源码。

我们的方案有一个So文件,并在其中有注册service,但是启动后发现service并没有注册成功,查询log发现是:

看起来是我们不具备权限,然后确定了一下SElinux的状态,发现是没有开启的,而servicemanager对添加service的权限的检查是位于其代码中的。

关于ServiceManager是如何检查权限的可以参考一下stackoverflow中的答案,或者自己看看servicemanager的源码。

参考的链接为这个,从这里面我们可以得知权限的检查写死在了对应的source code中(Android 4.4),暂时没有配置文件,这个和SeLinux不一样。

判断逻辑

ServiceManager的判断逻辑为:

  • 1. uid判断是否为system
  • 2. 是否在可信任的表格中

如果两个都不是,那么就认为没有权限,然后打印出前面的话来。这个对应的代码为:

另外这个allowed的数组为:

从里面的注释可以看出,以后这个可能会变成使用通配符方式,或者是配置文件的方式,但是现在还是直接写死了。

如果要让我们的service可以成功注册,那么可以:

  1. 直接将前面的return 0改成return 1即可
  2. 将我们的service添加到allowed数组中

我们先使用第一种方式来完成。

反汇编完成

获取servicemanager elf文件

这个非常容易,直接adb pull即可,这个servicemanager位于/system/bin下面。

定位需要更改的位置

我们使用反汇编工具,加载这个ELF文件,然后根据前面的log提示,搜索这个位置即可:


然后jump进去:


然后其伪代码为:

根据if判断,知道我们需要到sub_7D4中修改

我们先在function/symbol list中找到这symbol:


然后再jump过去:


框中就是我们前面提到的return 0,这个就是我们需要更改的位置。

其伪代码和前面的ServiceManager中的判断非常类似:


修改

在修改之前我们需要找到其对应instruction,这个在IDA Pro中非常容易,直接在hex view中sync对应的窗口过来即可:


在这里其对应对位置为:


因为ARM是小端模式,所以高低字节序相反,因此前面MOVS R0, 0对应的指令是0x2000。

指令说明

我们非常清楚根据APCS(arm procedure call standard), 此文档可以google或者baidu,也可以到我的资源中下载(http://download.csdn.net/detail/sy373466062/9592421), R0是作为返回值,因此直接改这一条就够了。

显然0x200是2个Byte,因此是Thumb指令,我们可以查询一下这个指令,然后将其改成MOVS R0, 1 

对此,我们参考Thumb指令的说明文档非常容易更改。

在Thumb指令文档中(下载地址:http://download.csdn.net/detail/sy373466062/9592423),可以看到:


从这个指令可以看出前面的Rd就是我们这里面的R0, 后面的offset8立即数,为0,我们这里需要改成1,因此,重新拼接一下就是:0x2001。 

关于指令的修改可以参考:

http://stackoverflow.com/questions/9279451/armv7-word-patch-cbnz

如果觉得要找这些比较麻烦,那么可以使用ARM ASM Converter软件来转换,直接在软件的底下输入指令,然后点击convert即可:


这个软件业给出了Thumb指令为2001,这个软件可以从我的资源下载(http://download.csdn.net/detail/sy373466062/9592450

修改

我们使用010Editor或者UE等一些软件来修改比较合适,例如在010Editor中找到对应的位置(0x800),然后直接更改即可:


修改完成后保存,为了确保我们修改正确,可以比较一下:


然后就可以push进去测试了。

测试

因为我们是add_service,因此可以先在log中看是否还有Permission Denied的提示,同时也可以使用下面的命令来查看我的service注册成功没有:

 

Leave a Reply

Your email address will not be published. Required fields are marked *