获取系统隐藏API远程调用服务方法-挂断电话

 

 

 

--------拦截黑名单号码电话----------

sdk1.5之前的挂断电话非常容易endCall

sdk升级到2.0之后,sdkAPIendCall去掉了(隐藏了)。

系统API方法被隐藏后,对我们是不可见的,只能通过反射获取。

 

 

我们获取到的上层应用API中的TelephonyManageer只是系统TelephonyManageer的一个代理类只包有限的一组方法。

 

getSystemService源代码是通过mbase调用,而mabase最终的类型是context类型。通过断点调试Context context = 

 

getApplication();获取到context实际类型的android.app.ContextImpl,在系统源代码app包中中查找ContextImpl

 

找到获取getSystemSerive方法。发现getSystemService方法在系统源代码中是由ServcieManger调用,因此我们需要通过反射获取到ServiceManager

手机在开机时系统服务会被初始化并启动,所以我们可以通过反射获取系统servicemanager,通过远程调用,调用服务的挂断电话的方法。

 

 

实现步骤:

1.通过反射获取到系统serviceManageer

2.反射获取servcieManagergetServcie方法。

3.调用getservice方法获取到远程服务的代理IBinder对象。

4.配置远程服务的aidl文件,在系统源代码中搜索(使用everythingItelephony .aidl打开查看包名,在src目录下创建一个相同的包名,将aidl复制到包内。发现aidl报错,打开它提示找不到couldn't find import for class android.telephony.NeighboringCellInfo,如果aidl中有一个东西找不到说明它也是一个aidl,搜索到NeighboringCellInfo.aidl创建相同包名复制进去。

5.gen目录下会自动生成一个ITelephony,可看到内部类Stub继承了Binder实现了ITelephnoy,所以它的对象可以直接调用远程服务的方法,使用它内部类的asInterfaceIBinder对象转化为ITelephnoy接口类型。

  注:因为远程服务的中间人IBinder实现了接口传递的也是是接口类型,本地onservcieConnection方法获取的是Ibinder对象,所以需要转化为ITelephnoy接口类型。

否则无法调用远程服务的方法。

6.ITelephnoy接口类型对象调用endCall挂断电话。

 

 

--------------------代码实例------------------

//利用系统隐藏API挂断电话

private void endCall() {

try {

Class serviceManagerClass = Class.forName("android.os.ServiceManager");

Method method = serviceManagerClass.getMethod("getService"new Class[]{String.class});

IBinder b = (IBinder) method.invoke(nullTELEPHONY_SERVICE);

ITelephony iTelephony = ITelephony.Stub.asInterface(b);

iTelephony.endCall();

catch (ClassNotFoundException e) {

e.printStackTrace();

catch (NoSuchMethodException e) {

e.printStackTrace();

catch (IllegalArgumentException e) {

e.printStackTrace();

catch (IllegalAccessException e) {

e.printStackTrace();

catch (InvocationTargetException e) {

e.printStackTrace();

catch (RemoteException e) {

e.printStackTrace();

}

}

 

}

你可能感兴趣的:(Android技术)