Xposed框架之函数Hook学习
作者:Fly2015
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安装以后的效果图:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
三、Hook模块的实现
1.加入meta-data元素
一个Xposed 模块就是一个Android app,不须要实现 Activity。本例中的Hook模块叫com.xposeddemo, 以下是这个实例的 AndroidManifest.xml 文件,注意当中定义了三项 meta-data元素:
1).xposedmodule
2).xposeddescription 加载Hook 模块之后显示的信息
3).xposedminversion 填写导入的jar包的版本
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
2.加入XposedBridgeApi-54.jar包
当中 xposedminversion 是指 XposedBridge library的版本信息。须要将 XposedBridge library 拷贝到 lib文件夹(注意是lib 文件夹不是 libs文件夹)。假设没有lib文件夹,在project文件夹下新建一个lib文件夹,将下载好的XposedBridgeApi-54.jar包放入当中,然后在project里右键–Build
Path–Add to Build Path.
XposedBridgeApi-54.jar包的下载地址:
3.加入xposed_init文件
在assets文件夹下新建一个xposed_init文件。
内容为:包名+类名。如:com.xposeddemo.Module
4.在Hooking Android App中查找Hook的关键点
要被Hook的Android App就使用非虫大神的书中第4章用的crackme02.apk应用程序。
程序执行的界面例如以下:
watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" alt="">
对该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须要的模块导入project以后。在写代码的时候。会有提示:
XposedHook演示样例代码的实现:
确定了crackme02.apk的Hook点。我们能够确定要Hook函数所在的包为com.droider.crackme0201,要Hook函数所在的类为com.droider.crackme0201.MainActivity。要被Hook的函数为privateboolean
checkSN(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应程序。依照输入要求输入任意的username和注冊码该程序就会验证通过(例如以下图)。
因为在博客上的排版不好,已经将笔记整理成了文档,XposedHook演示样例代码改动一下就能够拿来使用。文档和演示样例代码的下载地址:http://download.csdn.net/detail/qq1084283172/8873927
參考的网址:
http://0nly3nd.sinaapp.com/?p=613
http://www.freebuf.com/articles/terminal/56453.html
2015.6.18
Xposed框架之函数Hook学习的更多相关文章
- Xposed 框架 hook 简介 原理 案例 MD
Markdown版本笔记 我的GitHub首页 我的博客 我的微信 我的邮箱 MyAndroidBlogs baiqiantao baiqiantao bqt20094 baiqiantao@sina ...
- Xposed框架中XSharePreference的使用
本文博客地址:https://blog.csdn.net/QQ1084283172/article/details/81194406 在Xposed框架的模块编写中,通常希望我们自己写的Android ...
- 小米5安装Xposed框架——需要解锁刷机
Xposed官网 https://forum.xda-developers.com/xposed 官方模块厂库 https://repo.xposed.info/ 中文站点 https://xpose ...
- XPosed框架_简单的应用
0. Xposed框架简介 关于Xposed框架相信大家应该不陌生了,他是Android中Hook技术的一个著名的框架,而Xposed框架是免费的而且还是开源的,本文主要介绍如何通过这个框架来进行系统 ...
- Xposed那些事儿 — xposed框架的检测和反制
之前看到有人发了关于使用xposed屏蔽抖音检测xposed的思路(https://www.52pojie.cn/thread-684757-1-1.html),贴出了部分伪代码,但觉抖音写的蛮有意思 ...
- [转]Android中Xposed框架篇—利用Xposed框架实现拦截系统方法
一.前言 关于Xposed框架相信大家应该不陌生了,他是Android中Hook技术的一个著名的框架,还有一个框架是CydiaSubstrate,但是这个框架是收费的,而且个人觉得不怎么好用,而Xpo ...
- [转载] Android中Xposed框架篇---利用Xposed框架实现拦截系统方法
本文转载自: http://www.wjdiankong.cn/android%E4%B8%ADxposed%E6%A1%86%E6%9E%B6%E7%AF%87-%E5%88%A9%E7%94%A8 ...
- 【转】不需要 Root,也能用上强大的 Xposed 框架:VirtualXposed
如果你喜欢折腾 Android 设备,那么你应该对 Xposed 的大名有所耳闻. 这个第三方框架,让许多 Android 玩家都爱不释手.通过对系统框架的「偷天换日」,它可以修改系统与应用的各种数据 ...
- android黑科技系列——Xposed框架实现拦截系统方法详解
一.前言 关于Xposed框架相信大家应该不陌生了,他是Android中Hook技术的一个著名的框架,还有一个框架是CydiaSubstrate,但是这个框架是收费的,而且个人觉得不怎么好用,而Xpo ...
随机推荐
- 常见的DNS攻击——偷(劫持)、骗(缓存投毒)、打(DDos)
常见的DNS攻击包括: 1) 域名劫持 通过采用黑客手段控制了域名管理密码和域名管理邮箱,然后将该域名的NS纪录指向到黑客可以控制的DNS服务器,然后通过在该DNS服务器上添加相应域名纪录,从而使网民 ...
- 如何解读「量子计算应对大数据挑战:中国科大首次实现量子机器学习算法」?——是KNN算法吗?
作者:知乎用户链接:https://www.zhihu.com/question/29187952/answer/48519630 我居然今天才看到这个问题,天……本专业,有幸听过他们这个实验的组会来 ...
- 数论之证明数n等于其因数的欧拉函数值之和
定理: 任何正整数n等于其因数的欧拉函数值之和,即∑d|nφ(d)=n 证明: 设一个集合{1/n,2/n,3/n,...,(n-1)/n,n/n} 对于上述的分式集合,若我们都将其化简至最简形式,设 ...
- vue2.0 兄弟组件数据传递方法
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...
- 如何知道 CPU 是否支持虚拟化技术(VT)
作者: Sk 译者: LCTT geekpi 我们已经知道如何检查你的 Linux 操作系统是 32 位还是 64 位以及如何知道你的 Linux 系统是物理机还是虚拟机.今天,我们将学习另一个有用的 ...
- JavaScript:理解事件循环
话说js是单线程的,它通过浏览器事件循环轮询事件队列,来实现异步.然而,事件循环的时机是什么时候?浏览器是如何帮助JS引擎线程实现异步的? 浏览器页面进程的四个线程 首先说一下,chrome会为每一个 ...
- NodeJS学习笔记 (32)安全加密-tls
https://github.com/chyingp/nodejs-learning-guide
- POJ-2785 Values whose Sum is 0 Hash表
题目链接:https://cn.vjudge.net/problem/POJ-2785 题意 给出四组数,每组有n个数 现从每组数中取一个数作为a,b,c,d 问有几组这样的a+b+c+d=0 思路 ...
- HDU-2045 不容易系列之(3)—— LELE的RPG难题 找规律&递推
题目链接:https://cn.vjudge.net/problem/HDU-2045 找规律 代码 #include <cstdio> long long num[51][2]; int ...
- [洛谷P1939]【模板】矩阵加速(数列)
题目大意:给你一个数列a,规定$a[1]=a[2]=a[3]=1$,$a[i]=a[i-1]+a[i-3](i>3)$求$a[n]\ mod\ 10^9+7$的值. 解题思路:这题看似是很简单的 ...