您的位置:首页 > 移动开发

使用渗透测试框架Xposed Framework hook调试Android APP

2015-07-15 08:31 435 查看
原文地址:http://www.freebuf.com/articles/terminal/56453.html



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 .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
xmlns:android="http://schemas.android.com/apk/res/android"     package="com.bypass.validation"     android:versionCode="1"     android:versionName="1.0" >      android:minSdkVersion="15" android:targetSdkVersion="15" />      android:allowBackup="true" android:icon="@drawable/ic_launcher"    android:label="@string/app_name" android:theme="@style/AppTheme" >               android:name="xposedmodule"          android:value="true"/>              android:name="xposeddescription"         android:value="Hooking Module for Bypassing Validation" />              android:name="xposedminversion"         android:value="30" />


其中 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 方法的两个参数是不同的,而在后置函数执行的时候,两个参数已然相等了:)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: