② Xposed 提供的一些API
知道怎么创建运行一个Xposed项目,接着了解下都有哪些常用的API~
IXposedHookLoadPackage
→ App被加载时调用,用于App应用Hook回调的函数是:handleLoadPackage
;
XC_LoadPackage.LoadPackageParam
→ 包含与正在加载的应用程序相关的信息;
网络异常,图片无法展示
|
XposedHelpers.findAndHookMethod
(要Hook的类,classLoader,方法名,参数,XC_MethodHook回调对象)
Hook一个函数时使用,XC_MethodHook回调对象需重写两个函数:
beforeHookedMethod
(MethodHookParam param):方法调用前执行;afterHookedMethod
(MethodHookParam param):方法调用后执行;
注:可调用**
param.setResult
**()设置方法的返回值!
MethodHookParam
:包含与调用方法相关的信息:
网络异常,图片无法展示
|
比较关注的是这里的 thisObject
代表调用此方法的对象实例,如果是静态方法,会返回null,而例子中调用OnCreate()方法的是MainActivity,获得的自然是MainActivity的实例。
接着是 获取成员
,分私有与非私有,非私有直接调用下述方法即可获得成员:
Class c = lpparam.classLoader.loadClass("com.coderpig.cpwechatxposed.MainActivity"); Field field = c.getField("tv");
私有成员要先关闭安全访问检查(setAccessible):
Class c = lpparam.classLoader.loadClass("com.coderpig.cpwechatxposed.MainActivity"); Field field = c.getDeclaredField("tv"); field.setAccessible(true);
调用获取该对象:
TextView tv = (TextView) field.get(param.thisObject); tv.setText("贪玩难约");
IXposedHookZygoteInit
→ 在Zygote启动时调用,用于系统服务的Hook 回调initZygote();
IXposedHookInitPackageResources
→ 在资源布局初始化时会回被执行(inflate) 回调:handleInitPackageResources
(XC_InitPackageResources.InitPackageResourcesParam resparam)
InitPackageResourcesParam包含两个参数,包名和XResource(资源相关)
网络异常,图片无法展示
|
有了这个 XResource
对象,就可以拿到布局资源树了,通过重写 hookLayout
方法:
网络异常,图片无法展示
|
LayoutInflatedParam
,里面这个view就是布局资源树,可以拿到遍历,获取特定控件,做一些骚操作:
网络异常,图片无法展示
|
XposeHelpers提供了一些辅助方法:
callMethod
(Object obj,String methodName, Object... args):在APP中调用特定方法,参数依次是:调用方法的所在类,调用方法名,方法参数;
findClass
(String className,ClassLoader classLoader):获取class类实例,参数依次是类名,类加载器;
findMethodExact
:通过反射查找类的成员方法(可setAccessible(true)设置非私有);
findConstructorExact
:通过反射查找构造函数(同样可设置可访问下性);
findAndHookXXX
:查找并Hook;
setXxx
:通过反射设置对象数据成员的值;
setStaticXxx
:通过反射设置静态变量的值;
- XposedBridge.log("日志内容"):输入日志和写入到/data/xposed/debug.log,Xposed Installer日志那里可以看到!
- 内部类:通过$符号链接内部类;
- 只能Hook方法与构造方法,不能Hook接口和抽象方法;
③ 如何定位到方法调用点
知道哪些API可以耍了,接着就是如何定位到方法调用点了,方法一般有下述三种:
- ① 猜测验证法:适用于特定场景,而且具有一定Android开发经验,Hook微信运动改步数,如果你写过计步类的程序,不难想到 手机传感器 那一块去:
网络异常,图片无法展示
|
接着就是写代码验证的过程了,完整过程可以移步至:《抱歉,Xposed真的可以为所欲为——3.微信运动占领封面出售广告位》 自行查阅~
- ② ddms轨迹跟踪方法调用,比较呆的一种方法,效率较低,在没有好的入手点时可以先通过此方法模糊定位到Hook方法,不建议上来就跟,会跟晕的,完整过程可移步至:《抱歉,Xposed真的可以为所欲为——4.猜拳投骰子你能赢算我输》 自行查阅~
- ③ 反编译apk源代码:没加固的可以直接用jadx直接反编译,加固的需要自己脱出dex再反编译,然后去跟代码。另外直接用jadx反编译遇到大apk时容易直接卡死,笔者写了个脚本:
网络异常,图片无法展示
|
执行下py文件一键反编译,哈哈,至于简单加固脱壳可以见我之前写的逆向文章,完整过程可移步至:《抱歉,Xposed真的可以为所欲为——6.你的表白撤不回了》 自行查阅~
4、总结思考
在编写Xposed的过程中,让我对逆向有了写了解,相比起普通Android开发仔,在竞品分析时,我能更快的了解到实现方式,日常使用APP时,用得不爽,就写个Xposed或者脱壳修复二次打包。