Xposed Framework 是一个很强大的渗透测试框架,本文中只讲述如何用 Xposed Framework hook 一个 android app 中的一个方法并绕过登录验证,如果想了解更多关于 Xposed Framework 的详情,出门右转 : Xposed Framework
Xposed Framewrork 也使用了模块化的扩展模式,可以通过编写模块来满足不同的需求,比如有一个模块叫 3dot menu ,可以在每一个 APP 界面中添加一个三点按钮, 20MP sensor for Superior Auto 可以扩展 sony 相机,所有 Xposed Framework 能够实现的功能都是通过模块的方式实现的,这里提供了一些例子模块: example modules 。
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)]