正文
病毒在将dex注入system_server之后,一般都会对外提供接口,以便对framework达到灵活的控制等目的,最佳方式当然是将自己添加到系统Binder服务中,这样在服务端和客户端就少了传递和获取Binder对象的代码,全部由系统来完成,也更加稳定。
原理很简单,直接上伪码:
private boolean addSelfToAppBindArgs(){
//确保mAppBindArgs被初始化
if (Build.VERSION.SDK_INT >= LOLLIPOP_MR1) {
ActivityManagerService.getCommonServicesLocked.invoke(this
.mAMS, new Object[]{false});
} else {
ActivityManagerService.getCommonServicesLocked.invoke(this
.mAMS, new Object[]{true});
}
//获取mAppBindArgs
HashMap appBindArgs = ActivityManagerService.mAppBindArgs.get(this.mAMS);
if (appBindArgs == null) {
return false;
}
appBindArgs.put(SERVICE_NAME, this);
return true;
}
客户端代码:
IBinder iBinder = ServiceManager.checkService.invoke(new Object[]{SERVICE_NAME});
service = IXXService.Stub.asInterface(iBinder);//获取到病毒提供的接口
客户端在获取到Binder对象之后,通过调用接口,就可以随意灵活的操控Framework框架层了,比如劫持PMS隐藏应用程序,劫持LocationManagerService位置欺骗。。。。
参考
http://liwenkun.xyz/2016/12/05/how-android-apps-get-system-services/
https://jaq.alibaba.com/community/art/show?articleid=342