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动态调试的一种重要方法,刚刚入了个门,以后有更多的见解还会继续分享。
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动态调试的一种重要方法,刚刚入了个门,以后有更多的见解还会继续分享。
相关文章推荐
- .NET技术学习笔记:
- C#技术内幕 学习笔记
- Java2核心技术第七版的学习笔记(二):.The Java Programming Environment(Java的环境)
- 《JAVA2核心技术 卷一 基础知识(原书第七版)》《Core java2,Volume I-Fondamentsls Seven Edition》 学习笔记(一)
- Java开发学习笔记之一:JavaEE分层及客户层技术
- jsp---学习笔记(五)核心技术-语法详解
- vc技术内幕学习笔记
- 模式对话框和通用控件(『VC++技术内幕』学习笔记(9))
- 《JAVA2核心技术 卷一 基础知识(原书第七版)》《Core java2,Volume I-Fondamentsls Seven Edition》 学习笔记(二)BREAK和CONTINUE的区别
- 《JAVA2核心技术 卷一 基础知识(原书第七版)》《Core java2,Volume I-Fondamentsls Seven Edition》 学习笔记(三)对象的克隆
- COM技术内幕学习笔记
- 我的Hook学习笔记
- 学习笔记之 O/R 映射技术的王牌Hibernate框架
- Java2核心技术第七版的学习笔记(一):An Introduction to Java(Java的介绍)
- Chap 7 学习笔记-事件驱动编程技术和回送
- 数据库开发技术与工程实践 学习笔记
- 学习笔记之什么是持久化和对象关系映射ORM技术
- 测试驱动开发(tdd)学习笔记 (2) 工具,技术 junit
- C#技术内幕 学习笔记
- Hook API的学习笔记