
---【DroidPlugin框架分析】
文章平均质量分 89
Achillisjack
这个作者很懒,什么都没留下…
展开
-
插件进程死亡检测
3插件进程死亡检测插件进程死亡时,宿主是如何知道的呢?通过RemoteCallbackList机制。还有万一宿主挂掉了呢,插件进程是如何知道的?插件进程启动的时候,创建宿主Application并调用其onCreate(),因此会调用到PluginHelper的applicationOnCreate()方法。前面论述过,除了进行Hook 初始化之外,还进行了启动并绑定PluginM原创 2017-08-02 18:43:50 · 823 阅读 · 0 评论 -
进程管理--之三
2.4 进程垃圾回收2.4.1 进程回收MyActivityManagerService的runProcessGC主要逻辑如下,1,调用ActivityManager的getRunningAppProcesses方法获取当前宿主框架的运行进程,ActivityManager am = (ActivityManager) mHostContext.getSystemService(C原创 2017-08-01 08:03:38 · 455 阅读 · 0 评论 -
进程管理--之二
2.2 service 和activity相同的是,在ServcesManager的handleCreateServiceOne方法匹配,加载完成插件的service之后,就会调用PluginManager的onServiceCreated进行service管理。PluginManager.getInstance().onServiceCreated(stubInfo, info);原创 2017-08-01 08:03:22 · 416 阅读 · 0 评论 -
进程管理--之一
2,进程管理其实,android系统所说的进程管理,就是对四大组件的管理,因为其他的类基本是一些普通的类。当然, droidplugin框架中的进程管理,也是四大组件的管理。Android 系统中的进程管理在此就不论述了。进程管理的结构图如下,这些类的构造方法在此就不论述了,都比较简单。PluginManager是客户端,对应的服务端是IpluginManagerI原创 2017-08-01 08:02:43 · 474 阅读 · 0 评论 -
组件加载
1,组件加载1.1 四大组件加载1,activity加载方法还是在ActivityThread的performLaunchActivity方法中,匹配完成之后,ComponentName component = r.intent.getComponent();if (component == null) { component = r.intent.resolveA原创 2017-08-01 08:02:12 · 637 阅读 · 0 评论 -
IO重定向
IO重定向其实所谓的“重定向”不过就是替换一下要访问的路径。插件程序的所有数据都是放在宿主程序的目录下的,方便统一管理。因此,当插件访问“/data/data/插件包名/xxx”时,需要把路径替换成“/data/data/插件宿主包名/Plugin/插件包名/data/插件包名/xxx”。具体是实现在LibCoreHookHandle里,libcore主要是一些系统调用的实现(如ope原创 2017-08-01 08:01:38 · 1731 阅读 · 1 评论 -
Hook匹配过程----之二
8.2 Service匹配PluginManager的resolveService方法调用流程图如下,IpluginManagerImpl的resolveService方法如下,List infos = IntentMatcher.resolveServiceIntent(mContext, mPluginCache, intent, resolvedType, flags原创 2017-08-01 08:00:22 · 490 阅读 · 0 评论 -
Hook匹配过程----之一
8 Hook匹配过程1, activityIpackageManagerHookHandle中Hook了resolveIntent和queryIntentActivities方法,也就是activity 的匹配过程只需要看这2个方法,resolveIntent的beforeInvoke方法有关代码如下,ResolveInfo info = PluginManager.getIn原创 2017-08-01 07:59:52 · 771 阅读 · 0 评论 -
插件加载---之二
7.3 PackageParser插件的解析就是将获取插件的信息填到对应的变量中。PluginPackageParser构造方法主要逻辑如下,1,构造PackageParser对象,mParser = PackageParser.newPluginParser(hostContext);2,解析插件mParser.parsePackage(pluginFile, 0);原创 2017-08-01 07:59:17 · 459 阅读 · 0 评论 -
插件加载---之一
7,插件加载插件其实是Apk安装包,如果要使用必须先要安装和解析,以便知道插件Apk的相关信息。1,安装、更新插件,使用如下方法:int PluginManager.getInstance().installPackage(String filepath, int flags)2, 卸载插件,使用如下方法:int PluginManager.getInstance().de原创 2017-08-01 07:58:34 · 613 阅读 · 0 评论 -
四大组件的匹配过程
6 四大组件的匹配过程在AndroidManifest.xml中,除了这些静态注册的receiver,每个插件中的activity或者service也有可能声明intent filter。四大组件注册完成之后,都会有一个查找匹配的过程。前面论述的都是包含包名和类名的情况,在此论述一下intent的匹配过程。6.1 activity把要启动的activity替换成了stub ac原创 2017-08-01 07:57:52 · 936 阅读 · 0 评论 -
ContentProvider Hook
5 ContentProvider HookContentProvider的Hook和 service类似,都是通过代理分发技术来实现,必须要实现增删改查四个方法。还有一点不同的是,可以监听数据库的变化。同样的,也有注册,换马甲以及脱马甲过程。5.1 ContentProvider注册同样的, provider个数和service一样的少,因为使用没有Activity那么频繁。原创 2017-07-31 10:27:51 · 629 阅读 · 0 评论 -
BroadcastReceiver Hook
4, BroadcastReceiver HookBroadcastReceiver分为三个步骤: 注册, 发送和接收.并且BroadcastReceiver按照注册分为动态广播和静态广播。当然,插件中的静态广播按照动态广播进行处理。并且宿主根本不知道插件程序会注册哪些receiver,AndroidManifest.xml也不会有这些receiver。还有一个问题,静态广播时原创 2017-07-31 10:27:35 · 830 阅读 · 0 评论 -
Instrumentation Hook
3, Instrumentation Hook其实, Instrumentation的Hook应该放在PMS和AMS之前论述的,那么,Instrumentation是什么呢?Instrumentation,每一个应用程序只有一个Instrumentation对象,每个Activity内都有一个对该对象的引用。Instrumentation可以理解为应用进程的管家,ActivityTh原创 2017-07-31 10:27:16 · 743 阅读 · 0 评论 -
Service Hook
2, Service HookService和Activity很类似,都有穿马甲和脱马甲的过程,但是细节不同。有2种方法启动一个service, startService和bindService。在此就以startService为例进行论述。2.1 service注册AndroidManifest.xml里面的确注册了大量的service,但不是空的。<service a原创 2017-07-31 10:26:50 · 576 阅读 · 0 评论 -
Activity Hook
1, Activity HookActivity,Service等组件是有生命周期的,它们统一由系统服务AMS管理;Activity的详细启动流程在此就不论述了。主要步骤如下,1, 从App进程调用startActivity等一系列方法;2, 通过IPC调用进入系统进程system_server,完成Activity管理以及一些校检工作;3, 回到APP进程完成真正的Act原创 2017-07-31 10:26:20 · 657 阅读 · 0 评论 -
AMS Hook
2,AMS HookAMS 的详细Hook点请看这篇文章, http://blog.youkuaiyun.com/u012439416/article/details/70665923Hook AMS只需要简单的Hook ActivityManagerNative的gDefault变量就可以了。该变量定义如下,private static final Singleton gDefault原创 2017-07-31 10:26:03 · 473 阅读 · 0 评论 -
PMS Hook
1,PMS Hook和一般服务不同的是,AMS和PMS使用了另外一种Hook方式,虽然Hook的代码结构完全相同。PMS通过getPackageManager这个方法来获取, ContextImpl类的getPackageManager方法如下,public PackageManager getPackageManager() { if (mPackageManager !原创 2017-07-31 10:25:40 · 1806 阅读 · 0 评论 -
API Hook总结之五
6.12 WindowSessionWindowSession相关的结构图如下,Hook 类IWindowSessionHookHook 代理类IWindowSessionInvokeHandle Hook 方法实现类addaddToDisplay原创 2017-07-31 10:25:28 · 361 阅读 · 0 评论 -
API Hook总结之四
6.9 WifiManager Hook结构图如下,Hook 类IWifiManagerBinderHookHook 代理类IWifiManagerHookHandle Hook 方法实现类getScanResultsgetBatchedScanResults原创 2017-07-31 10:25:10 · 515 阅读 · 0 评论 -
API Hook总结之三
6.6 MountService Hook结构图如下,Hook 类IMountServiceBinderHookHook 代理类IMountServiceHookHandleHook 方法实现类mkdirsIMountServiceHookHandle的内原创 2017-07-31 10:24:37 · 360 阅读 · 0 评论 -
API Hook总结之二
6.3,GraphicsStats Hook结构图如下,Hook 类IGraphicsStatsBinderHookHook 代理类IGraphicsStatsHookHandleHook 方法实现类requestBufferForProcessIGrap原创 2017-07-30 09:38:54 · 652 阅读 · 0 评论 -
API Hook总结之一
6,API Hook总结实际上, droidplugin框架一共Hook了十多个服务对应的API接口, ServiceManager和LocationManager API的Hook在前面已经详细论述了。这些Hook一般都是在HookFactory的installHook方法中构造和安装的。其实主要就是三要素,Hook类, Hook 代理类以及Hook 方法实现类。6.1, A原创 2017-07-30 09:34:06 · 804 阅读 · 0 评论 -
LoactionManager Hook原理
5 LoactionManager原理5.1 结构图类似于ServiceManager,相关结构图如下,ILocationManagerBinderHook中实现了createHookHandle和getOldObj方法,父类BinderHook实现了invoke和onInstall方法。ILocationManagerHookHandle是一个独立的类,实现了in原创 2017-07-30 09:26:04 · 610 阅读 · 0 评论 -
ServiceManager Hook原理
4. ServiceManager Hook原理如果调用getSystemService方法获取系统服务对应的API接口,mLoactionManager = (LoactionManager) getSystemService(Context.LOCATION_SERVICE);获取系统服务的使用其实就分为两步IBinder b = ServiceManager.getServi原创 2017-07-30 09:15:58 · 1090 阅读 · 0 评论 -
ServiceManager Hook过程
3, ServiceManager Hook过程每一个Hook系统服务的API都对应着一个ServiceManagerCacheBinderHook对象。下面接着上个章节分析。3.1 Hook Ibinder对象首先调用子类的getServiceName方法获取被Hook的系统方法名称,IlocationManagerBinderHook的getServiceName方法如下,原创 2017-07-30 09:10:08 · 783 阅读 · 0 评论 -
LocationManagerService API的Hook解析
2 LocationManagerService API的Hook解析LocationManagerService主要和定位有关,平时在android开发中,都是直接使用系统提供的API接口来间接使用系统服务,这些API都是通过aidl跨进程调用系统服务的。使用定位服务步骤如下,首先获取LocationManager,mLocationManager = (LocationMa原创 2017-07-30 08:58:51 · 3886 阅读 · 0 评论 -
系统API的Hook
1,系统API的Hook首先论述一下系统服务的API的Hook,然后论述四大组件的Hook。因为在android系统中,一切皆服务,在开发过程中,大量使用的是四大组件。首先有一个问题,为什么需要Hook系统服务的api?DroidPlugin插件框架管理插件使得插件就像是主程序一样,因此插件需要使用主程序的剪切版,插件之间也会共用剪切版;其他的一些系统服务也类似,这样就可以达到原创 2017-07-30 08:49:37 · 1241 阅读 · 0 评论 -
DroidPlugin框架初始化
3,初始化AndroidManifest.xml中首先申请了大量的权限,当然这些权限都是为了插件使用。另外除了宿主进程以外,还有另外的8个进程,这8个进程其实就是插件进程。在每个插件进程中,注册了二十多个包含四种启动方式的Activity;注册了一个Service和一个ContentProvider。当然,在DroidPlugin框架中,宿主进程和插件进程之间都是相互独立的,所以交原创 2017-07-30 08:46:08 · 572 阅读 · 0 评论 -
动态代理机制
动态代理说白了就是实现拦截功能。可以利用该机制重写一个类,覆盖android系统中的类,这样可以实现一些特殊的功能。2,动态代理机制1,定义接口和实现public interface UserService { public String getName(int id); public Integer getAge(int id); } 实现类p原创 2017-07-30 08:36:37 · 407 阅读 · 0 评论 -
DroidPlugin 使用方法
1,DroidPlugin 使用方法https://github.com/Qihoo360/DroidPlugin/blob/master/readme_cn.md说明了DroidPlugin的使用方法以及特点。HOST程序:插件的宿主。插件:免安装运行的APK限制和缺陷:1,无法在插件中发送具有自定义资源的Notification,例如:a. 带自定义RemoteLayo原创 2017-07-30 08:32:37 · 6128 阅读 · 0 评论