Hook学习(四):寻找突破点-ServiceManager
来源:互联网 发布:js跨域的实现原理 编辑:程序博客网 时间:2024/05/17 23:00
看下源码,就明白如何Hook了
package android.os;public final class ServiceManager { private static final String TAG = "ServiceManager"; private static IServiceManager sServiceManager; private static HashMap<String, IBinder> sCache = new HashMap<String, IBinder>(); private static IServiceManager getIServiceManager() { if (sServiceManager != null) { return sServiceManager; } // Find the service manager sServiceManager = ServiceManagerNative.asInterface(BinderInternal.getContextObject()); return sServiceManager; } public static IBinder getService(String name) { try { IBinder service = sCache.get(name); if (service != null) { return service; } else { return getIServiceManager().getService(name); } } catch (RemoteException e) { Log.e(TAG, "error in getService", e); } return null; } public static void addService(String name, IBinder service) { try { getIServiceManager().addService(name, service, false); } catch (RemoteException e) { Log.e(TAG, "error in addService", e); } }}
完整的源码可看:
http://androidxref.com/7.1.1_r6/xref/frameworks/base/core/java/android/os/ServiceManager.java
ITelephony接口和ISms接口以及AIDL
在我们的Android 应用中,当需要实现电话拨号时,我们需要进行如下调用
ITelephony phone =(ITelephony)ITelephony.Stub.asInterface(ServiceManager.getService(“phone”))
phone.dial(“10086”);
对于短信 应用,我们需要的是调用SmsManager,代码如下
SmsManager manager = SmsManager.getDefault();
manager.sendTextMessage(“10086”,null,”hi,this is sms”,null,null);
这里,SmsManager对ISms做了一层包装,实质上是通过调用
ISms simISms = ISms.Stub.asInterface(ServiceManager.getService(“isms”));
simISms.sendRawPdu….应用都是采用AIDL来实现IPC的跨进程调度。
对于AIDL应用,调用进程方存在的是一个实现接口的Pro xy对象,通过Proxy对象与被调用进程中的Stub对象进行通讯来实现IPC的跨进程调度,所以,在被调用进程一端必定有一个ITelephony.Stub类以及ISms.Stub类的实现PhoneInterfaceManager和SimSmsInterfaceManager
ITelephony.Stub 的实现类为com.android.phone.PhoneInterfaceManager
ISms.Stub的实现类为com.android.internal.telephony.gsm.SimSmsInterfaceManager
从这两个类的构造器的调用代码里可以很清楚的看到进行了Service的注册工作
ServiceManager.addService(“phone”,this);
ServiceManager.addService(“isms”,this);PhoneApp,InCallScreen,PhoneUtils及其他相关类
从SimSmsInteferManager的相关方法实现中可以看到,具体就是调用GSMPhone的SmsDispatcher实例来进行相关操作的。
从PhoneInterfaceManager会维持一个Phone对象的引用,当拨号应用时,PhoneInterfaceManager会将构造好的 Intent传递给PhoneApp应用,该Intent的className指定则为InCallScreen,从中我们可以看到 InCallScreen具体是通过PhoneUtils调用Phone的相关方法来实现。
PhoneInterfaceManager怎么获取到对应的Phone对象,然后又怎么将Phone对象传递到InCallScreen中呢?
具体这里涉及到了PhoneApp这个类,从这个类维护了一个 PhoneInterfaceManager的引用(phoneMgr)以及一个Phone引用(phone),从该类的onCreate方法中我们可以 清楚的看到,PhoneApp通过PhoneFactory获取了一个Phone实例,并通过该实例实现了PhoneInterfaceManager对 象。因此,我们现在只需要关PhoneFactory具体提供的是一个什么样的Phone实例了。另外,PhoneApp类还提供了一个静态方法 getInstance供InCallScreen调用,InCallScreen正是通过调用该方法获得PhoneApp实例从而获得对应的Phone 实例的。接下来,我们通过查看PhoneFactory的方法可以看到,Phone对象对应的就是一个GSMPhone实例。
4.GSMPhone与RIL
从GSM的构造器可以看出,他依赖一个CommandInterface接口实例,通过PhoneFactory makeDefaultPhones方法,我们可以看到,根据系统 环境变量ro.radio.noril来判断是否需要采用RIL框架实现,如果该参数不为空,则采用Simultedcommands(主要是为了测试需要提供的模拟实现)否则,采用RIL。
5.关于C代码与硬件之间的交互
这部分工作其实就是C代码通过串口发送AT指令来拨号,收发短信。
- Hook学习(四):寻找突破点-ServiceManager
- Hook学习(三):寻找突破点
- 寻找突破点
- ServiceManager Hook过程
- ServiceManager Hook原理
- ServiceManager 学习
- ServiceManager 学习
- Binder学习笔记(四)—— ServiceManager如何响应checkService请求
- 迁移学习的挑战和六大突破点
- ServiceManager学习 (manager与Service之间关系)
- ServiceManager
- ServiceManager
- shell学习四十四天----寻找文件
- Binder学习一 ServiceManager初始化
- HOOK API入门篇(四)
- 5.机器学习的可行性与数据量关系,突破点
- 算法学习(四)寻找满足条件的两个数或者多个数
- ServiceManager启动过程(一)
- Codeforces Round #433 B.Maxim Buys an Apartment
- 项目1——C/C++语言中参数传递的三种方式
- TensorFlow
- 正则表达式
- LeetCode | 78. Subsets
- Hook学习(四):寻找突破点-ServiceManager
- Eclipse中配置mybatis-3-config.dtd
- 如何在Mac OS X中开启或关闭显示隐藏文件命令
- 9/7 javasScript对象、构造函数、数组的迭代方法
- 一个可以过滤其他开发者日志的LogUtil工具类,团队开发中的你值得拥有!
- RxJava2的介绍
- 数学建模的一些思考
- TCP发送缓冲区
- 编程语言寿命预测