您的位置:首页 > 其它

Xposed hook技术学习笔记

2016-12-31 17:11 330 查看
最近做一个安卓apk的逆向,需要用到xposed 中的hook技术,所以便学习了一下,在此纪录一下。

demo:apk用的是非虫大神的一个demo例子:crackme02

首先需要在manifest中填写三段

 <!--添加标识-->

        <meta-data 

        android:name="xposedmodule" 

        android:value="true"/>

        

        <!--载入Hook模块之后显示的信息-->

    <meta-data

        android:name="xposeddescription"

        android:value="Xposed Demo For Hook !" />

   

    <!--规定jar包的版本信息-->

    <meta-data

        android:name="xposedminversion"

        android:value="30" />      //网上的例子中此处一般为54,这是支持的最低的xposedbridge.jar的版本,由于新版的xposed框架不是用好用,很多人还在用2.5.1版本,该版本框架用的是较低版本xposedbridge.jar.所以还是改一下吧。

接下来就是指定入口,在assets下创建一个名为xposed_init文件 输入apk包名及实现的类名。这里我们新建一个类名为:Module

下面开始实现这个类

首先指定需要hook的函数所在的activity,其次获取需要hook的函数名。废话不多说,如下所示。

if (lpparam.packageName.equals("com.droider.crackme0201")){
XposedBridge.log("Loaded App:" + lpparam.packageName);

//查找要Hook的函数
XposedHelpers.findAndHookMethod(
"com.droider.crackme0201.MainActivity", //被Hook函数所在的类com.droider.crackme0201.MainActivity
lpparam.classLoader, 
"checkSN",     //被Hook函数的名称checkSN
String.class, //被Hook函数的第一个参数String
String.class, //被Hook函数的第二个参数String
new XC_MethodHook(){
@Override
protected void beforeHookedMethod(MethodHookParam param)
throws Throwable {
// Hook函数之前执行的代码

//传入参数1
XposedBridge.log("beforeHookedMethod userName:" + param.args[0]); 
//传入参数2 
XposedBridge.log("beforeHookedMethod sn:" + param.args[1]);
//函数返回值
XposedBridge.log("beforeHookedMethod result:" + param.getResult());
}

@Override
protected void afterHookedMethod(MethodHookParam param)
throws Throwable {
// Hook函数之后执行的代码

//通过对checkSN函数的分析发现,只要修改函数的返回值即可实现注册的破解
param.setResult(true);
//改变返回值

//传入参数1
XposedBridge.log("afterHookedMethod userName:" + param.args[0]); 
//传入参数2 
XposedBridge.log("afterHookedMethod sn:" + param.args[1]);
//函数返回值
XposedBridge.log("afterHookedMethod result:" + param.getResult());
}
});
}

主要是afterhookedmothod函数,这个函数实现了对函数返回值的更改,即将返回值改为了true。因为我们通过分析非虫大神的demo可知,checksn这个函数是对输入进行校验,如果正确则返回true。所以只要修改了返回值,则可以成功注册。

这是一种不改变apk源码的情况下而影响apk运行结果的方法,应该算是apk动态调试的一种重要方法,刚刚入了个门,以后有更多的见解还会继续分享。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: