Xposed Android Java Hook
2016-05-13 10:39
603 查看
官网文档这个链接:https://github.com/rovo89/XposedBridge/wiki/Development-tutorial,看E文麻烦请看下面即可
Xposed Java Hook有点是非常简单,缺点是需要重启手机非常麻烦。
Xposed是Android下Java层的开源Hook框架类似的有cydiasubstrate框架并且据说cydiasubstrate框架能实现Android的Java层和Native层的函数的Hook。学习Android的逆向也有一段时间了,记录一下学习Xposed框架的过程。
Xposed框架的学习网站: http://repo.xposed.info/
一、Xposed框架实现Hook的原理介绍
Zygote是 Android 的核心,每运行一个 app,Zygote 就会 fork 一个虚拟机实例来运行 app,Xposed Framework 深入到了 Android 核心机制中,通过改造 Zygote 来实现一些很牛逼的功能。Zygote 的启动配置在/init.rc 脚本中,由系统启动的时候开启此进程,对应的执行文件是/system/bin/app_process,这个文件完成类库加载及一些函数调用的工作。
当系统中安装了 Xposed Framework 之后,会对 app_process 进行扩展,也就是说,Xposed Framework 会拿自己实现的 app_process 覆盖掉 Android 原生提供的 app_process 文件,当系统启动的时候,就会加载由 Xposed Framework 替换过的进程文件,并且,XposedFramework 还定义了一个 jar 包,系统启动的时候,也会加载这个包:
/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar
二、Xposed框架运行的条件
1.RootedDevice / Emulator (已 root 的手机或者模拟器)
2.XposedInstaller (Xposed 安装程序下载)
3.HookingAndroid App (要被Hook的目标App)
XposedFramework 就是一个apk包也就是上面下载的Xposed安装程序,下载后用下面的命令安装到手机上或者模拟器:
adb install de.robv.android.xposed.installer_v32_de4f0d.apk
安装好之后,打开 Xposed ,下面是截图:
Xposed安装以后的效果图:
三、Hook模块的实现
1.添加meta-data元素
一个Xposed 模块就是一个Android app,不需要实现 Activity,本例中的Hook模块叫com.xposeddemo, 下面是这个实例的 AndroidManifest.xml 文件,注意其中定义了三项 meta-data元素:
1).xposedmodule
2).xposeddescription 载入Hook 模块之后显示的信息
3).xposedminversion 填写导入的jar包的版本号
2.添加XposedBridgeApi-54.jar包
其中 xposedminversion 是指 XposedBridge library的版本号信息,需要将 XposedBridge library 复制到 lib目录(注意是 lib 目录不是 libs目录),如果没有lib目录,在工程目录下新建一个lib文件夹,将下载好的XposedBridgeApi-54.jar包放入其中,然后在工程里 右键–Build Path–Add to Build Path.
XposedBridgeApi-54.jar包的下载地址:
http://dl-1.va.us.xda-developers.com/2/7/4/8/8/7/8/XposedBridgeApi-54.jar?key=lqjljy-2L4Sk3lItcQkWoQ&ts=1434529310
3.添加xposed_init文件
在assets目录下新建一个xposed_init文件。
内容为:包名+类名,如:com.xposeddemo.Module
4.在Hooking Android App中查找Hook的关键点
要被Hook的Android App就使用非虫大神的书中第4章用的crackme02.apk应用程序。
程序运行的界面如下:
对该apk进行反编译的代码截图:
注册码的校验函数:
通过对crackme02.apk反编译发现只要注册码验证函数checkSN返回值是true就表明注册码验证通过,我们的Hook点就是checkSN函数。
5.针对Hooking Android App的Hook关键点实现Hook模块
1).实现 IXposedHookLoadPackage接口
2).确定要Hook的Android App的包名
3).判断要Hook的包名
4).确定要Hook的AndroidApp的方法
5).具体实现Android App的函数Hook,调用XposedHelpers.findAndHookMethod(“包名+类名”, lpparam.classLoader, “要hook的函数名称”, 第一个参数类型, 第二个参数类型….., new XC_MethodHook() {
protectedvoidbeforeHookedMethod(MethodHookParam param) {
//函数执行之前要做的操作
}
protectedvoidafterHookedMethod(MethodHookParam param) {
//函数执行之后要做的操作
}
});
将编写XposedHook需要的模块导入工程以后,在写代码的时候,会有提示:
XposedHook示例代码的实现:
确定了crackme02.apk的Hook点,我们可以确定要Hook函数所在的包为com.droider.crackme0201,要Hook函数所在的类为com.droider.crackme0201.MainActivity,要被Hook的函数为private booleancheckSN(StringuserName, String sn)。
见编写的XposedHook示例代码:
上面这一行代码指定了只有当com.droider.crackme0201 这个包加载的时候,才会触发一系列的 hook 行为,当这行为触发的时候,de.robv.android.xposed.XposedHelpers 类的 findAndHookMethod 方法就会被调用,并在适当的时候执行前置方法(beforeHookedMethod)和后置方法(afterHookedMethod),在本次的示例中只要修改checkSN函数的返回值即可实现注册的验证绕过。
在Xposed框架中安装刚才已经编写好的Hook模块XposedDemo如上图所示,然后重启手机或者模拟器,我们编写的XposedDemo模块在手机或者模拟器重启以后就会生效的,点击运行crackme02.apk应程序,按照输入要求输入随意的用户名和注册码该程序就会验证通过(如下图)。
转自:
http://www.2cto.com/os/201507/415267.html
Xposed Java Hook有点是非常简单,缺点是需要重启手机非常麻烦。
Xposed是Android下Java层的开源Hook框架类似的有cydiasubstrate框架并且据说cydiasubstrate框架能实现Android的Java层和Native层的函数的Hook。学习Android的逆向也有一段时间了,记录一下学习Xposed框架的过程。
Xposed框架的学习网站: http://repo.xposed.info/
一、Xposed框架实现Hook的原理介绍
Zygote是 Android 的核心,每运行一个 app,Zygote 就会 fork 一个虚拟机实例来运行 app,Xposed Framework 深入到了 Android 核心机制中,通过改造 Zygote 来实现一些很牛逼的功能。Zygote 的启动配置在/init.rc 脚本中,由系统启动的时候开启此进程,对应的执行文件是/system/bin/app_process,这个文件完成类库加载及一些函数调用的工作。
当系统中安装了 Xposed Framework 之后,会对 app_process 进行扩展,也就是说,Xposed Framework 会拿自己实现的 app_process 覆盖掉 Android 原生提供的 app_process 文件,当系统启动的时候,就会加载由 Xposed Framework 替换过的进程文件,并且,XposedFramework 还定义了一个 jar 包,系统启动的时候,也会加载这个包:
/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar
二、Xposed框架运行的条件
1.RootedDevice / Emulator (已 root 的手机或者模拟器)
2.XposedInstaller (Xposed 安装程序下载)
3.HookingAndroid App (要被Hook的目标App)
XposedFramework 就是一个apk包也就是上面下载的Xposed安装程序,下载后用下面的命令安装到手机上或者模拟器:
adb install de.robv.android.xposed.installer_v32_de4f0d.apk
安装好之后,打开 Xposed ,下面是截图:
Xposed安装以后的效果图:
三、Hook模块的实现
1.添加meta-data元素
一个Xposed 模块就是一个Android app,不需要实现 Activity,本例中的Hook模块叫com.xposeddemo, 下面是这个实例的 AndroidManifest.xml 文件,注意其中定义了三项 meta-data元素:
1).xposedmodule
2).xposeddescription 载入Hook 模块之后显示的信息
3).xposedminversion 填写导入的jar包的版本号
2.添加XposedBridgeApi-54.jar包
其中 xposedminversion 是指 XposedBridge library的版本号信息,需要将 XposedBridge library 复制到 lib目录(注意是 lib 目录不是 libs目录),如果没有lib目录,在工程目录下新建一个lib文件夹,将下载好的XposedBridgeApi-54.jar包放入其中,然后在工程里 右键–Build Path–Add to Build Path.
XposedBridgeApi-54.jar包的下载地址:
http://dl-1.va.us.xda-developers.com/2/7/4/8/8/7/8/XposedBridgeApi-54.jar?key=lqjljy-2L4Sk3lItcQkWoQ&ts=1434529310
3.添加xposed_init文件
在assets目录下新建一个xposed_init文件。
内容为:包名+类名,如:com.xposeddemo.Module
4.在Hooking Android App中查找Hook的关键点
要被Hook的Android App就使用非虫大神的书中第4章用的crackme02.apk应用程序。
程序运行的界面如下:
对该apk进行反编译的代码截图:
注册码的校验函数:
通过对crackme02.apk反编译发现只要注册码验证函数checkSN返回值是true就表明注册码验证通过,我们的Hook点就是checkSN函数。
5.针对Hooking Android App的Hook关键点实现Hook模块
1).实现 IXposedHookLoadPackage接口
2).确定要Hook的Android App的包名
3).判断要Hook的包名
4).确定要Hook的AndroidApp的方法
5).具体实现Android App的函数Hook,调用XposedHelpers.findAndHookMethod(“包名+类名”, lpparam.classLoader, “要hook的函数名称”, 第一个参数类型, 第二个参数类型….., new XC_MethodHook() {
protectedvoidbeforeHookedMethod(MethodHookParam param) {
//函数执行之前要做的操作
}
protectedvoidafterHookedMethod(MethodHookParam param) {
//函数执行之后要做的操作
}
});
将编写XposedHook需要的模块导入工程以后,在写代码的时候,会有提示:
XposedHook示例代码的实现:
确定了crackme02.apk的Hook点,我们可以确定要Hook函数所在的包为com.droider.crackme0201,要Hook函数所在的类为com.droider.crackme0201.MainActivity,要被Hook的函数为private booleancheckSN(StringuserName, String sn)。
见编写的XposedHook示例代码:
package com.xposeddemo; import de.robv.android.xposed.IXposedHookLoadPackage; import de.robv.android.xposed.XC_MethodHook; import de.robv.android.xposed.XC_MethodHook.MethodHookParam; import de.robv.android.xposed.XposedBridge; import de.robv.android.xposed.XposedHelpers; import de.robv.android.xposed.callbacks.XC_LoadPackage.LoadPackageParam; public class Module implements IXposedHookLoadPackage { @Override public void handleLoadPackage(LoadPackageParam lpparam) throws Throwable { // 判断是否是要Hook的包名(被Hook函数所在的包为com.droider.crackme0201) 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()); } }); } } }
上面这一行代码指定了只有当com.droider.crackme0201 这个包加载的时候,才会触发一系列的 hook 行为,当这行为触发的时候,de.robv.android.xposed.XposedHelpers 类的 findAndHookMethod 方法就会被调用,并在适当的时候执行前置方法(beforeHookedMethod)和后置方法(afterHookedMethod),在本次的示例中只要修改checkSN函数的返回值即可实现注册的验证绕过。
在Xposed框架中安装刚才已经编写好的Hook模块XposedDemo如上图所示,然后重启手机或者模拟器,我们编写的XposedDemo模块在手机或者模拟器重启以后就会生效的,点击运行crackme02.apk应程序,按照输入要求输入随意的用户名和注册码该程序就会验证通过(如下图)。
转自:
http://www.2cto.com/os/201507/415267.html
相关文章推荐
- Android系统模拟位置的使用方法
- Android学习资料整理
- Android 获取手机本地图片所在的位置
- Android 百度地图定位功能
- Android学习笔记七:sqlite3中的数据类型
- mac android配置adb
- Android中JNI编程出现“Invalid arguments ' Candidates are: void * malloc(?) '”的解决方案
- android 学习笔记之六 动态获取权限
- Android checkBox,类似这个控件。
- Android 中 Handler 引起的内存泄露 在Android常用编程中,Handler在进行异步操作并处理返回结果时经常被使用。其实这可能导致内存泄露,代码中哪里可能导致内存泄露,又是如何
- Android studio 2.0后添加jar文件到工程
- Android中Service类onStartCommand
- Android 广告轮播图
- Android获取View的截图,包括各种Layout的截图
- android 百度导航引擎初始化失败找不到libgnustl_shared.so以及百度鹰眼轨迹异常的问题
- 【Android】ListView监听上下滑动(设置滚动监听判断ListView的滚动方向同时获取屏幕高度、ListView实际高度,判断是否需要展示返回顶部按钮(具体逻辑请看代码--附有详细注释)。
- Android系统内存不足时,组建回收顺序问题
- android adb常用指令
- android数据库Sqlite(3)
- android studio 配置git,绕过曾经掉下去的坑