使用渗透测试框架Xposed Framework hook调试Android APP
Xposed Framework 是一个很强大的渗透测试框架,本文中讲述如何用 Xposed Framework hook 一个Android APP中的一个方法并绕过登录验证。
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 安装程序)
3.Testing Android App
Xposed Framework 就是一个 apk 包,下载到后用下面的命令安装到手机上:
adb install <xposed-installer-you-just-downloaded>.apk
安装好之后,打开 Xposed ,下面是截图:
Modules 下面是一些可用的模块
实现一个模块
一个 Xposed 模块就是一个 Android app,不需要实现 Activity,本例中的 module 叫com.bypass.validation, 下面是这个实例的 AndroidManifest.xml 文件,注意其中定义了三项 meta-data:
1.Module name
2.Module Description
3.Module Minimum Version
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.bypass.validation" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="15" android:targetSdkVersion="15" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <meta-data android:name="xposedmodule" android:value="true"/> <meta-data android:name="xposeddescription" android:value="Hooking Module for Bypassing Validation" /> <meta-data android:name="xposedminversion" android:value="30" /> </application> </manifest>
其中 xposedminversion 是指 XposedBridge library 的版本,需要将 Xposed Library 复制到 lib目录(注意是 lib 目录不是 libs 目录),然后将这个 jar 包添加到 Build PATH 中,jar 包可以在这里下载。
然后在 src 目录下面建立一个 java 文件,就叫 bypass.java 吧,并在 assets 目录中新建一个叫xposed_init 的文件,里面写上刚才建立的 java 文件的包路径,这样,我们的apk 就可以被识别为一个 Xposed 模块了
现在来看看要 hook 的 apk 包,要 hook,关键是要知道 hook 的点,即要明确要 hook 的函数名,实际使用中可以用 jeb 等反编译工具得到需要 hook 的函数名,我们这里就直接看样例 app 的源码吧:
从源码中可以看到,MainActivity 的验证逻辑很简单,只要用户输入的密码和定义的 password 相等,就可通过验证(checkLogin 方法)。
实现模块还要完成下面几个步骤
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