【学习笔记】基于xposed的入门和安全漏洞的实战

入门

1、新建工程(高德地图demo),对一般的方法进行hook。
1) 集成XposedBridgeApi-54.jar ,按照版本去下载集成,如果是as的话,scope为Provided
2)在AndroidManifest.xml文件中添加如下配置:

<!-- xposed支持 -->
        <meta-data
            android:name="xposedmodule"
            anafterHookedMethoddroid:value="true" />
        <meta-data
            android:name="xposedminversion"
            android:value="54" />
        <meta-data
            android:name="xposeddescription"
            android:value="xposeddemo" />

3) 在assets文件夹下定义访问入口xposed_init文件,内容书写为核心hook类的存放路径。
4)写一个类继承IXposedHookLoadPackage,在handleLoadPackage里写相关处理代码

// 只处理目标app
if (!loadPackageParam.packageName.equals("com.hgsoft.wk.main")) {
           return;
 }

4)安装后,在Xposed Installer中激活该模块并重启手机
5)打开目标app,在Xposed Installer里的日志模块可以看到log
2、注意的点
1)hook方法:findAndHookMethod

public static Unhook findAndHookMethod(String className, ClassLoader classLoader, String methodName, Object... parameterTypesAndCallback) {
        return findAndHookMethod(findClass(className, classLoader), methodName, parameterTypesAndCallback);
}

第一个参数是类名称,第二个参数是ClassLoader,一般里面参数有提供,直接引用,如果是class里面的class,要用$,第三个参数是要hook的方法名,第四个是可以多个参数,放hook的方法的参数列表,最后的参数是hook的回调。
比如:

XposedHelpers.findAndHookMethod("org.json.JSONObject", loadPackageParam.classLoader, "put",
                String.class, boolean.class, new XC_MethodHook());

2)hook构造方法:findAndHookConstructor

public static Unhook findAndHookConstructor(String className, ClassLoader classLoader, Object... parameterTypesAndCallback) {
        return findAndHookConstructor(findClass(className, classLoader), parameterTypesAndCallback);
}

关于构造方法这个没有用出效果来,比较郁闷,以后尝试出来再补充。。。。。。
3)关于回调XC_MethodHook

protected void beforeHookedMethod(MethodHookParam param) throws Throwable {};
protected void afterHookedMethod(MethodHookParam param) throws Throwable {};

MethodHookParam的用法上,args方法的参数列表,thisObject提供方法的类,getResult方法的返回值,可以通过setResult设置方法的返回值。

实战

1、反编译周报日报,然后对定位这块进行hook。
找到 class BdLocation extends CordovaPlugin,分析里面所有的方法,尝试对他们进行hook.

class MyBDLocationListener implements BDLocationListener {
        MyBDLocationListener() {
        }
        public void onReceiveLocation(BDLocation bdLocation) 

找到上面代码块后,准备hook onReceiveLocation,写个程序hook上去后发现posed框架没有报错,但就是什么都没有反应。查了一下官方说明,xposed只能hook普通方法或者构造方法,不能hook接口和抽象类。只能作罢,找其他的方法hook。

在尝试hook 类BdLocation里的其他方法后,发现都没有反应,故猜想是因为继承了CordovaPlugin的原因,具体没有深究,等以后有机会再研究是不是因为CordovaPlugin的原因,并且怎么去hook cordova的东西。

最后进行了一次尝试,看到app里面用到org.json.JSONObject的put,那么就开始hook put吧

XposedHelpers.findAndHookMethod("org.json.JSONObject", loadPackageParam.classLoader, "put", String.class, boolean.class, new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        super.beforeHookedMethod(param);
                        XposedBridge.log("hello->weekreport:before put=" + param.args[0] + "," + param.args[1]);
                        if (param.args[0].equals("inScope")) {
                            param.args[1] = false;
                        }
                    }
                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        super.afterHookedMethod(param);
                        XposedBridge.log("hello->weekreport:after put=" + param.args[0] + "," + param.args[1]);
                    }
                });

可以看到,把值inScope改成了false,运行,终于跑进去方法里面,激动啊。改完后app的定位就一直失效。

引用一下OverAndroid博客提到的功能:
_ ▪ 渗透测试_
_ ▪ 测试数据构造_
_ ▪ 环境监控_
_ ▪ 动态埋点_
_ ▪ 热补丁_
_ ▪ 自动化录制_

学习链接:
https://github.com/rovo89/XposedBridge/wiki/
https://segmentfault.com/a/1190000002883122
http://blog.csdn.net/wzgiceman/article/details/50607020