图文精华

分享

Xposed框架阶段学术总结

[size=22.0000pt]     Xposed框架[size=10.5000pt]Xposed框架是一个功能非常强大的Android hook框架,有了它,我们就可以实现动态的修改某一app的某些功能,实现一些非常变态的功能。
[size=10.5000pt]首先,Xposed原理是在系统启动时,改造Zygote实现全局的修改,ZygoteAndroid系统中非常重要的一个组成,所有的应用启动都是基于它fork出来的子进程启动的,所以对它实现改造,就能实现对设备上所有的应用进行一系列操作。写xp模块来实现相应的功能,启动系统是,模块的功能就存在了,启动相应需要hookapp时,那么模块里面的逻辑就会生效。这也很合理的解释了为什么我们每次安装或更新模块时需要重启设备(模拟器)。
[size=10.5000pt]对于xp,我们最主要的是要学会如何写插件(模块),以Android Studio为例:
[size=10.5000pt]1. [size=10.5000pt]创建一个不需要界面android工程,并配置好相应的Androidmanifest.xml文件,主要有三个部分:
[size=10.5000pt]①添加<mete data
[size=10.5000pt]Android:name=[size=10.5000pt]”[size=10.5000pt]Xposedmodule[size=10.5000pt]”[size=10.5000pt]  
[size=10.5000pt]Android:value=[size=10.5000pt]”[size=10.5000pt]true[size=10.5000pt]”
[size=10.5000pt]②添加<mete data
[size=10.5000pt]Android:name=[size=10.5000pt]”[size=10.5000pt]Xposeddescription[size=10.5000pt]”[size=10.5000pt]  
[size=10.5000pt]Android:value=[size=10.5000pt]”[size=10.5000pt]XXX[size=10.5000pt]”
[size=10.5000pt]③添加<mete data
[size=10.5000pt]Android:name=[size=10.5000pt]”[size=10.5000pt]Xposedminversion[size=10.5000pt]”
[size=10.5000pt]Android:value=[size=10.5000pt]”[size=10.5000pt]54[size=10.5000pt]”
[size=10.5000pt]

[size=10.5000pt]
[size=10.5000pt]2. [size=10.5000pt]新建一个lib文件夹,导入Xposed.jar包(api-82.jar),同时在项目build.gradle文件里引用文件

[size=10.5000pt]
[size=10.5000pt]3. [size=10.5000pt]在项目的main下创建一个assets资源文件夹,并新建一个xposed_init文件,主要该名称不能变,xp根据它去找模块的入口点的。创建好文件后在里面写好你的xp入口点,格式为:包名+类名(根据你自己定义的项目文件结构填充)

[size=10.5000pt]
[size=10.5000pt]完成以上三个步骤,xp模块编写的准备工作就全部完成了,下面是写模块:
[size=10.5000pt]创建一个类,继承至IXposedHookLoadPackage并重写handleLoadPackage方法。根据handleLoadPackage的参数,我们可以获取到包名信息,在根据判断包名信息是否为我们想要hook的应用包名做判断,就可以精准的hook我们想要hookapp了,这个固定写法就做过多阐述。
[size=10.5000pt]介绍一下关于xp里最常用的两个方法beforeHookedMethodafterHookedMethod,见名知其意,hook方法之前要做什么,hook方法之后要做什么,自己diy的逻辑就写在方法体里面。我们一般用beforeHookedMethod来处理我们要hook的方法的参数,参数改变必定会影响目标程序中的hook的方法的执行逻辑或者返回值以达到我们想要的结果。对应的afterHookedMethod主要是用来处理返回值的,我们可以不管原程序执行的过程,直接重新修改方法的返回值已达到我们的目的。用beforeHookedMethod举例:

[size=10.5000pt]参数:①需要hook的目标方法的完整路径(包名+类名)
[size=10.5000pt] [size=10.5000pt]        [size=10.5000pt]        [size=10.5000pt]  ②类加载器
[size=10.5000pt] [size=10.5000pt]        [size=10.5000pt]        [size=10.5000pt]  hook的方法名
[size=10.5000pt]  ④参数列表,有多少个写多少个以逗号分割
[size=10.5000pt]  ⑤最后一个参数是一个obj,通过newXC_MethodHook,并重写beforeHookedMethod/afterHookedMethod来实现
[size=10.5000pt]   想要修改参数,就用param.arg[0]来修改就行了。Param来自于hookbeforeHookedMethod的参数,我们想要hook的方法的参数以数组的形式保存在param类中,要访问参数,需要param.arg[index]实现,按照数组的规定,下标0是第一个元素,所以在这里要注意别访问错了参数。
[size=10.5000pt]最后再说一下我们实战hook中会经常碰到的问题以及解决方案。
[size=10.5000pt]1. [size=10.5000pt]找不到我们要hook的类:出现这个问题的情况一般有三种:
[size=10.5000pt]①动态加载类,这是经常会碰到的问题,通过动态加载的类xp的普通hook是拿不到类的,这时候我们需要先hook ClassLoader类下的loadClass方法,这个类是类加载的父类,所有类的加载都会经过loadClass方法,通过hook它我们就可以拿到我们想要hook的类,基于它的基础下,再来实现我们的hook方法就可以解决动态加载类hook不到的问题

[size=10.5000pt]②目标程序有多个dex文件hook找不到我们的类,这个问题和上一个相似,我们可以先hook Application下的attach方法,通过attach方法的参数为context,我们处理它的参数通过context拿到classloder,后面再用classloder作为类加载器即可解决多dex hook不到方法的问题。

[size=10.5000pt]③多层次的内部类结构,这种问题比较少,因为类里面包含内部类甚至再包一层内部类而直接hook不到的问题,对于这种问题我一般采取的策略就是多hook几层

[size=10.5000pt]第二个问题,hook的目标方法参数为自定义类型,因为参数为自定义类型,我们又有特殊需求需要处理参数,这个问题我们可以通过反射来解决,xp也提供了反射,利用api反射获取原程序里面的类以拿到数据类型,再用setget来修改和获取对象里的值,当然也可以获取到类里面的字段和方法,实现修改默认值和主动调用,这个就不详细讲了。

[size=10.5000pt]以上就是我学习完Xposed框架阶段的心得体会,如有不对请指出。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

没找到任何评论,期待你打破沉寂

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则