From:使用渗透测试框架 Xposed 框架 hook 调试 Android APP:https://www.freebuf.com/articles/terminal/56453.html
Xposed框架分析:https://blog.csdn.net/zjx839524906/article/details/81046844
xposted框架 原理
Xposed框架之函数Hook学习:https://www.cnblogs.com/csnd/p/11800719.html
如何看待阿里开源的 dexposed 框架?:https://www.zhihu.com/question/31894163
Epic——ART上的Dexposed(无侵入式Hook框架):https://bbs.pediy.com/thread-222931.htm
【搬砖】无需 Root 也能使用 Xposed:https://www.52pojie.cn/thread-679501-1-1.html
Android中Xposed框架篇—利用Xposed框架实现拦截系统方法:http://www.520monkey.com/archives/895
关键字:xposed hook:https://www.baidu.com/s?wd=xposed%20hook
1. 什么是 hook
hook 本质就是劫持函数调用,但由于处于 linux 用户态,每个进程都有自己独立的进程空间,所以必须先注入到所要 hook 的进程空间,修改其内存中的进程代码,替换其过程表的符号地址。
Android 中一般通过 ptrace 函数附加进程,然后向远程进程注入 so 库,从而达到监控以及远程进程关键函数挂钩。
Hook 的难点在于寻找函数的入口点、替换函数,这就涉及到函数的连接与加载机制。
Android 中一般存在两种 hook:sdk hook,ndk hook。native hook 的难点在于理解 ELF 文件与学习 ELF 文件,Java 层 Hook 则需要了解虚拟机的特性与 java 上的反射使用。另外还存在全局 hook,即结合 sdk hook 和 ndk hook,xposed 就是一种典型的全局 hook 框架。
2. Xposed
xposed 原理
Xposed 是 Android 平台下的一个著名hook框架,其原理是通过修改替换 /system/bin/app_process 程序控制 zygote 进程,使app_process 在启动过程中加载 xposedBrider.jar 包,从而完成对 zygote 进程以及其创建的虚拟机劫持。基于 xposed 框架可以制作出许多功能强大的模块,其在功能不冲突的情况下同时运作。
Xposed 工程
Xposed 源码地址为:https://github.com/rovo89
Xposed 文件下载地址为:http://dl-xda.xposed.info/framework/
工程主要包括 5 部分:
- Xposed:独立实现了一版 Xposed版的 zyogte,即生成用来替换 /system/bin/app_process 的可执行文件,该文件在系统启动时在 init.rc 中被调用,启动 Zygote 进程,init.zygote.rc 中源码如下:
service zygote /system/bin/app_process -Xzygote /system/bin --zygote --start-system-serverclass mainsocket zygote stream 660 root systemonrestart write /sys/android_power/request_state wakeonrestart write /sys/power/state ononrestart restart mediaonrestart restart netd
- XposedBridge:Xposed 框架的 Java 部分,编译输出为 XposedBridge.jar (编写 hook 需要导入)为开发者提供接口
- android_art:Xposed 框架的 C++ 部分,对 XposedBridge 的补充
- XposedTools:框架编译工具,因为 Xposed 和 XposedBridge 编译依赖于 Android 源码,而且还有一些定制化的东西。
- XposedInstaller:Xposed 插件管理和功能选择应用,界面如下图所示, 其功能包括启动 Xposed 框架,下载和启用指定插件,或禁用插件等。
Xposed 框架
Xposed Framework 是一个很强大的渗透测试框架,本文中讲述如何用 Xposed Framework hook 一个Android APP中的一个方法并绕过登录验证。
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
For Android 5.0 or higher (Lollipop/Marshmallow), these versions don't work! Use this instead:
http://forum.xda-developers.com/showthread.php?t=3034811
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
Xposed Framework 原理简述
Xposed Framewrork 也使用了模块化的扩展模式,可以通过编写模块来满足不同的需求,比如有一个模块叫 3dot menu,可以在每一个 APP 界面中添加一个三点按钮,20MP sensor for Superior Auto 可以扩展 sony 相机,所有 Xposed Framework 能够实现的功能都是通过模块的方式实现的,这里提供了一些例子模块:example modules。
如果想了解更多关于 Xposed Framework 的详情,出门右转 :Xposed Framework
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 替换过的进程文件,并且,Xposed Framework 还定义了一个 jar 包,系统启动的时候,也会加载这个包:
/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar
环境要求
- 1. Rooted Device / Emulator (已 root 的手机或者模拟器)
- 2. Xposed Installer ( 通过 Xposed Installer.apk 安装 xposed )
- 3. Testing Android App
Xposed Framework 就是一个 apk 包,下载到后用下面的命令安装到手机上:
adb install <xposed-installer-you-just-downloaded>.apk
现在安装 Xposed 比较方便,因为 Xposed 作者开发了一个 Xposed Installer App,下载后按照提示傻瓜式安装(前提是 root 手机)。其实它的安装过程是这个样子的:首先探测手机型号,然后按照手机版本下载不同的刷机包,最后把 Xposed 刷机包刷入手机重启就 好。刷机包下载 里面有所有版本的刷机包。
刷机包解压打开里面的 文件 构成是这个样子的:
Xposed 原理简介及其精简化:https://www.jianshu.com/p/6b4a80654d4e
META-INF/ 里面有文件配置脚本 flash-script.sh 配置各个文件安装位置。
system/bin/ 替换zygote进程等文件
system/framework/XposedBridge.jar jar包位置
system/lib system/lib64 一些so文件所在位置
xposed.prop xposed版本说明文件
所以安装 Xposed 的过程就上把上面这些文件放到手机里相同文件路径下。
通过查看文件安装脚本发现:Xposed 就是修改替换了 /system/bin/app_process 文件,app_process 是 zygote 的进程文件。所以 Xposed 通过替换的 zygote 进程实现了控制手机上所有 app 进程。因为所有 app 进程都是由 Zygote fork 出来的。
Xposed 的基本原理是修改了 ART/Davilk 虚拟机,将需要 hook 的函数注册为 Native 层函数。当执行到这一函数时,虚拟机会优先执行 Native层函数,然后再去执行 Java层函数,这样完成函数的 hook。
安装好之后,打开 Xposed ,下面是截图:
Modules 下面是一些可用的模块
3. 模块 和 实现一个模块
一个Xposed模块 就是 一个 Android app。
- 如果你只是 hook,那么可以选择 add no activity
- 但是如果有和自身app交互,那么就选择 empty activity
实现模块要完成下面几个步骤
- 1. 实现 IXposedHookLoadPackage接口
- 2. 指定要 hook 的包名 ( 这里是 com.attify.vuln )
- 3. 判断当前加载的包是否是指定的包 ( 在接口方法中判断)
- 4. 指定要 hook 的方法名
- 5. 实现 beforeHookedMethod方法 和 afterHookedMethod方法 ( hook的具体功能 )
下图是模块的核心代码,上述各项都已经具备
这里的包名是com.attify.vuln,
if(lpparam.packageName.equals("com.attify.vuln"))
上面这一行代码指定了只有当 com.attify.vuln 这个包加载的时候,才会触发一系列的 hook 行为,当这行为触发的时候,de.robv.android.xposed.XposedHelpers 类的 findAndHookMethod 方法就会被调用,并在适当的时候执行前置方法(beforeHookedMethod)和后置方法(afterHookedMethod),这里绕过验证方法只需要让传递到 checkLogin 方法的两个参数相等即可,so easy。当 checkLogin 方法被调用前调用我们实现的模块,并执行前置函数,就可以使得传递给 checkLogin 函数的两个参数相等。
最后环节
把我们实现的模块安装到设备上,如下图:
勾选我们刚才安装的模块,并重启系统,等系统重启之后,打开样例 app,在输入密码的地方输入任意字符,因为我们实现的那个模块会执行
param.args[1] = param.args[0];
这行代码,所以输入任意密码都会通过验证,如下图
整个模块执行过程的 log 信息可以在 Xposed log 中查看到,如下图
由日志可以看到,hook 的关键代码 (前置函数) 执行前,checkLogin 方法的两个参数是不同的,而在后置函数执行的时候,两个参数已然相等了:)
[参考来源 attify,译/实习编辑 吴知,转载请注明来自FreeBuf黑客与极客(FreeBuf.COM)]shi
4. 示例
示例 1:Android Studio + Xposed 实现简单的 hook
************************ 这三个示例重点看,理解 xposed 的 hook **********************************
- 1. Android Studio + Xposed实现简单的hook(详细篇):https://www.52pojie.cn/thread-873366-1-1.html
- 2. Xposed 使用经验:https://www.52pojie.cn/thread-728459-1-1.html
- 3. Android逆向Hook学习——第一篇:Xposed:https://www.52pojie.cn/thread-873013-1-1.html
查看 Xposed 的 log
不能导入模块参考:
Why Xposed cannot load module?:https://forum.xda-developers.com/xposed/xposed-load-module-t3771921
The thing is you are including Xposed API into your module which is not OK. Yo have to configure the gradle for Xposed lib to be "provided" not "compiled".
*****************************************************************************************************
示例 2 :crackme 的 Hook 并打印用户名和密码
Form:https://www.bilibili.com/video/BV1UE411A7rW?p=73
https://www.52pojie.cn/thread-232658-1-1.html
Android入门破解题目(EX05_01_.apk、Crackme02.apk、CrackMe-F1F2.apk)
https://blog.csdn.net/m0_38071863/article/details/102931100
第一个Android crackme:https://www.cnblogs.com/flycat-2016/p/5521979.html
示例破解程序
工程目录:
示例 hook 代码:
hook 后,无论输入什么,都可以注册成功,因为hook 修改了返回值,使返回值一直是 true
hook 系统函数(拦截系统函数),篡改 IMEI 号:( getDeviceId 函数没有参数 )
去优酷广告
示例 3:Hook 人人直播.apk
From( hook解密算法 ):https://www.bilibili.com/video/BV1UE411A7rW?p=75
"人人直播" 登录协议分析:https://www.cnblogs.com/LuLuLuHao