利用Ptrace在Android平台实现应用程序控制
2013-11-15 14:55
288 查看
利用Ptrace在Android平台实现应用程序控制
转自harry_lime的空间
http://hi.baidu.com/harry_lime/item/9a23bbd9ebd936b1260ae7db但凡做过安全软件的人都知道,API Hook和App Control是经常要实现的功能。
为了实现这两个功能,最常用的方法就是写driver,在kernel中拦截检查相应的调用。这种做法的好处是大小通吃,不用关心系统里面到底有多少进程,反正你要做的操作最终总要过我这一关。而缺点就是在kernel中拦截往往得不到我想要的一些参数而无法做出正确的判断。举个例子,手机平台中很多应用都会发短信,我想组织某些应用发短信而允许另一些应用发短信。而发短信的操作并不是由每个应用直接调用的,它们把发送请求发给一个叫SmsService的服务进程,由这个服务进程再调用系统API来发短信。当我们在Kernel里面拦截到这个API的时候,发现调用者都是SmsService,无法区分原始请求者,因而无法做到有目的的拦截。
为了解决上面提到的问题,很多厂商开始想办法Hook SmsService,在SmsService里面可以区分请求的应用和请求的内容,进而做到有区分的拦截。那么如何Hook SmsService 呢?在Linux/Unix/Mac/iOS系统里面最简单的办法可能就是Ptrace了。所以说利用Ptrace可以很容易的做到精准打击,可以具体到Hook每个进程里面的每个点,这是它的优点。那么再说一下它的缺点,如果你想Hook多个进程,你就要给每个进程准备不同的代码,除非你可以找到SmsService这样的“关口”,即便找到了关口,还要提放有没有办法绕过它。
综上所述,Ptrace是一个用来实现API Hook和App Control 的好工具。很多情况下它的缺点可以被忽视,尤其在Android这种很容易找到"关口"的平台上。因此很多Android上的安全软件都是利用Ptrace来实现API Hook和App Control的。
前面扯的有点多,先来说一下这次的目标:
平台:Android 2.3
实现:利用Ptrace剥夺某些应用请求service的功能
1. 编写测试程序SmsSender1
SmsSender1非常简单,它有一个Activity,在onCreate的时候发送一条SMS. 我们的目标就是拦截这个应用请求系统Service的能力而不影响其他应用。
servicemanager是我们用Ptrace要修改的目标。为什么选servicemanager? 根据Android的架构,系统的各种service (比如phone, sms, camera)是手机核心功能的“关口”,而servicemanager就是这些service的总"关口"。每个service都要到servicemanager注册,而每个app要想获取服务,需要先到servicemanager来查询各个服务的ID,然后才能根据ID和相应的service利用binder进行通信。所以说把住了servicemanager,就把住了所有关键的服务。
那么从何下手呢?
俗话说源码之前,了无秘密。既然有Android源码,就看源码来加速我们的研究。看了源码以后发现servicemanager里面有一个loop,用来处理各种请求,算是个下手的好地方:
具体如何实现?我们现在有两个选择:
选择1, 写一个trace程序,利用Ptrace attach到servicemanager进程,在函数svcmgr_handler中添加断点。中断之后trace根据txn->sender_euid的值来修改相应的寄存器或者内存值,达到改变程序流程的目的。这种做法需要trace一直运行,处于调试servicemanager的状态,每次svcmgr_handler都需要从trace过一次。如果trace挂了会导致不可预料的结果。
选项2,写一个trace程序,只运行一次,利用Ptrace attach到servicemanager进程,在text段修改svcmgr_handler的逻辑并插入我们的代码,然后dettach. 这样的话trace不必长期运行,也不用每次调用都过trace,稳定性和效率都大大提高。
就技术而言,选项2需要考虑更多的问题,也更复杂。但我还是喜欢选项2,呵呵,后面就按照选项2来实现。
3. 编写injection的汇编代码
反编译servicemanager,定位到svcmgr_handler函数:
其中0x8950,0x8952,0x8954,0x8956四条指令对应于源码中这两行:
我们先将SmsSender1安装到Android上,并查看它的uid. 我们知道在Android系统中每个app都被分配了一个用户,利用用户来进行权限管理,而uid就是用户id,用户分配表可以在/data/system/packages.list里面找到:
可见我们要屏蔽的uid是10038,所以我们的判断逻辑代码编写如下:
另外别忘了我们覆盖了servicemanager两条指令LDR R3,[R0]; LDR R2,[R4];,如果uid!=10013,我们需要让程序按照原来的逻辑执行下去,所以line8-9是补充执行被我们覆盖的两条指令。
好了,万事俱备只欠东风,接下来我们可以开始编写trace程序了。
3. 编写trace程序
我们最终完成的trace程序如下:
我觉得程序已经写的很明白了,不需要再进一步解释了,后面开始实测。
4. 测试
先运行模拟器,上传trace程序。运行SmsSender1和系统自带的SMS程序,均可正常运行发送短信。
然后ps查看servicemanager的pid,发现是28. 运行trace 28, 修改内存,inject代码,发现我们的代码已成功写入:
然后运行系统自带的SMS,可正常运行发送短信。运行SmsSender1,无法正常运行。
事实证明App Control获得成功,哇咔咔~~
相关文章推荐
- 利用Ptrace在Android平台实现应用程序控制
- 利用Ptrace在Android平台实现应用程序控制
- 利用Ptrace在Android平台实现应用程序控制
- 利用Ptrace在Android平台实现应用程序控制
- 利用Ptrace在Android平台实现应用程序控制[转]
- Android平台利用CUDA框架实现并行开发
- Android平台下利用zxing实现二维码开发
- Python实现利用socket连接adb控制android设备
- 如何利用google原生包在android平台上实现语音识别
- Android平台利用OkHttp3模拟登录实现教务平台
- Android平台利用OpenCL框架实现并行开发初试
- Android平台下利用zxing实现二维码开发
- Android平台下利用zxing实现二维码开发
- 如何利用google原生包在android平台上实现语音识别
- Android平台下利用zxing实现二维码开发
- android平台利用iptables控制网络访问
- Android平台下利用zxing实现二维码开发
- [Micropython]TPYBoard v202 利用单片机快速实现家庭智能控制平台
- Android平台下利用zxing实现二维码开发
- Android的消息推送系列之利用第三方平台实现消息推送