Xposed模块编写的那些事 8090安适门户
配景论述
Android是一种基于Linux的自由及开放源代码的操纵系统,由Google公司和开罢休机联盟带领及开发。由于其开放的特质,吸引了一多量硬件厂商和软件开发者。第三方的统计数据显示,2016年Android占有的市场份额高达76.4%,远远赶过其他智能手机厂商。
大量的Android os装机量,在丰富安卓系统使用场景的同时,也催生出了许多安适问题。xposed框架供给了不需要改削系统源码就能灵活定制系统成果的能力,极大的便利了安适研究人员的事情。且xposed操作了JNI机制改削Java framework的成果实现,没有涉及arm本地指令的适配事情,所以很少呈现兼容性问题。本文是为了辅导大家了解下此框架的能力以及实现方法,最终打造一款属于本身的“神器”。
本文总计5个章节,以xposed的使用需求作为切入点,由浅入深地介绍了模块的编写实战、模块编写进阶篇和常用模块编写以及异常情况&后续展望。本文来源于平时的实践,用作大家互订交流与学习。
xposed 使用需求
我们在选择使用xposed成果模块的时候,可能基于以下需求之一:
[1]监控app行为:检察关键api 的挪用日志,用于特定方针的行为分析。
[2]定制系统成果:转变原先函数的措置惩罚惩罚逻辑,自界说api行为。
[3]沙箱成果定制:主要存眷反环境检测(上述两点存眷app自己),如:恶意样天职析,模拟器需要尽可能的“真实”以便触发样本行为。
固然,实际的需求并不会仅仅局限于此,可能会更多。这里列出的需求点也只是小我私家的总结,如有遗漏,敬请奉告。终究需求驱动学习,文章的出发点也是但愿堆积有着配合需求点的小伙伴,大家有个讨论处所,配合学习和进步。好,其它话不久不多说,接下来进入xposed模块的编写实战。
xposed 模块编写实战
xposed 模块的能力包孕以下几个方面:
[1] 对普通函数或者结构函数有感化(针对具体实现类,不包孕接口,抽象类的实现函数也可以hook)。
[2] 对方针函数进行 before、after 代码插桩,多用于操纵(检察或改削)api的入参以及返回值。
[3] 方针函数替换,多用于成果变换、版本升级。
接下来,我们列举下 xposed 模块编写可能遇到的实际场景(假设阅读本文之前,读者拥有根基的模块编写经验)。在这个demo中,我将尽可能全面的再现需要hook操纵的场景。好比:函数体、结构函数、匿名类、匿名内部类以及类的值域。
上述demo中存在
(1)静态field变量sMoney
(2)隐藏函数hidden_fun(触发的条件相对苛刻)
(3)内部类inner_class
(4)匿名内部类Animal animal = new Animal(){}
(5)结构函数demo()
我们逐个回顾下相应问题的解决要领:
(1)静态field变量sMoney的值的改削和获取,可以直接使用xposed供给的XposedHelpers类相关成果函数。具体操纵可以类比以下示例代码片段:
/*
* Hook field
* class: com.example.inner_class_demo.demo
* field: sMoney
*/
Class clazz = XposedHelpers.findClass("com.example.inner_class_demo.demo",lpparam.classLoader);
XposedHelpers.setStaticObjectField(clazz,"sMoney",110);
Field sMoney = clazz.getDeclaredField("sMoney");
sMoney.setAccessible(true);
System.out.println(sMoney.get(null));
(2)主动挪用隐藏函数hidden_fun(这一类函数是指触发条件对照苛刻的函数,但是我们又需要了解它的输入、输出的大抵关系),需要通过clazz来新建实例,最后将此实例与函数名组装成XposedHelpers.callMethod() 的实参需求形式。具体操纵可以类比以下示例代码片段:
/*
* Call hidden function
* class : com.example.inner_class_demo.demo
* function: hidden_fun()
*/
Class clazz = XposedHelpers.findClass("com.example.inner_class_demo.demo",lpparam.classLoader);
XposedHelpers.callMethod(constructor.newInstance(),"hidden_fun");
以上代码仅适用于存在无参结构函数的类,如果方针类没有无参结构函数,那就麻烦一点了,需要按照结构函数参数类型,反射寻找结构函数,接着才华类似上述操纵。具体操纵可以类比以下示例代码片段:
假设此时的结构函数仅有以下函数,即public demo(){}不存在的情形:
public demo(String str){...}
/*
* Call hidden function
* class : com.example.inner_class_demo.demo
* function: hidden_fun()
*/
Class clazz = XposedHelpers.findClass("com.example.inner_class_demo.demo",lpparam.classLoader);
Constructor constructor = clazz.getConstructor(String.class);
XposedHelpers.callMethod(constructor.newInstance("..."),"hidden_fun");
(3)内部类inner_class作为Android编程过程常见的一种编程方法,这里为了demo的全面,也将其列出。其实内部类整个措置惩罚惩罚过程与普通类极其相似,具体操纵可以类比以下示例代码片段:
/*
* Hook the function of inner class
* class : com.example.inner_class_demo.demo$inner_class
* function: secret(String , boolean)
*/
XposedHelpers.findAndHookMethod("com.example.inner_class_demo.demo$inner_class", lpparam.classLoader,
"secret", String.class, boolean.class, new XC_MethodHook() {
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
温馨提示: 本文由杰米博客推荐,转载请保留链接: https://www.jmwww.net/file/pc/12561.html