App进程启动过程
AppProcess —> startActivity—>AMS(system Server) —> 发送fork命令、参数—> Zygote —->fork并执行ActivityThread main函数
- 1.startActivity/startService等操作
- 2.AMS检测是否需要启动新进程
- 3.如果需要,通过localSocket通知Zygote进程fork一个新进程
- 4.在新进程中调用ActivityThread main函数
- 5.ActivityThread main函数中获取AMS的client,然后向AMS注册ApplicationThread对象
- 6.AMS通过ApplicationThread Binder对象向客户端发送BindApplication消息,ActivityThread通过handlerBindApplication函数处理该消息,完成Instrumentation的加载和app的Application对象创建
- 7.AMS再发送launchActivity/createService等消息启动Activity/启动服务
插件化关键技术:binderHook
问题:
1. AMS函数:需要拦截startActivity/startService/bindService等函数
2. PMS函数:需要拦截getPackageInfo等函数,告诉插件,你已经被安装到系统了,请放心
3. 需要绕过系统APPOPS校验
解决:
1.Hook AMS 客户端:当进程中有人调用startActivity函数的时候,我们拦截之,并将intent替换为占坑的Activity
2.Hook PMS 客户端:在插件进程调用getPackageInfo函数的时候,伪造一个PackageInfo对象,返回给插件
3.Hook 所以Binder客户端的所有函数,将插件的包名 替换为我们自己的
icon.png