使用渗透测试框架XposedFrameworkhook调试AndroidAPP

  • A+
所属分类:移动安全

XposedFramework是一个很强大的渗透测试框架,本文中讲述如何用XposedFrameworkhook一个AndroidAPP中的一个方法并绕过登录验证。

XposedFramework原理简述

XposedFramewrork也使用了模块化的扩展模式,可以通过编写模块来满足不同的需求,比如有一个模块叫 3dotmenu,可以在每一个APP界面中添加一个三点按钮,20MPsensorforSuperiorAuto 可以扩展sony相机,所有XposedFramework能够实现的功能都是通过模块的方式实现的,这里提供了一些例子模块:examplemodules。

如果想了解更多关于XposedFramework的详情,出门右转:XposedFramework

Zygote是Android的核心,每打开一个app,Zygote就会fork一个虚拟机实例来运行app,XposedFramework深入到了Android核心机制中,通过改造Zygote来实现一些很牛逼的功能。Zygote的启动配置在/init.rc 脚本中,由系统启动的时候开启此进程,对应的执行文件是/system/bin/app_process,这个文件完成类库加载及一些函数调用的工作。

当系统中安装了XposedFramework之后,会对 app_process进行扩展,也就是说,XposedFramework会拿自己实现的app_process 覆盖掉Android原生提供的 app_process文件,当系统启动的时候,就会加载由XposedFramework替换过的进程文件,并且,XposedFramework还定义了一个jar包,系统启动的时候,也会加载这个包:

/data/data/de.robv.android.xposed.installer/bin/XposedBridge.jar 环境要求

1.RootedDevice/Emulator(已root的手机或者模拟器)

2.XposedInstaller(Xposed安装程序)

3.TestingAndroidApp

XposedFramework就是一个apk包,下载到后用下面的命令安装到手机上:

adb install <xposed-installer-you-just-downloaded>.apk

安装好之后,打开Xposed,下面是截图:

Modules下面是一些可用的模块

实现一个模块

一个Xposed模块就是一个Androidapp,不需要实现Activity,本例中的module叫com.bypass.validation,下面是这个实例的AndroidManifest.xml文件,注意其中定义了三项meta-data:

1.Modulename 
2.ModuleDescription 
3.ModuleMinimumVersion

<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是指XposedBridgelibrary的版本,需要将XposedLibrary复制到lib目录(注意是lib目录不是libs目录),然后将这个jar包添加到BuildPATH中,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方法的两个参数相等即可,soeasy。当checkLogin方法被调用前调用我们实现的模块,并执行前置函数,就可以使得传递给checkLogin函数的两个参数相等。

最后环节

把我们实现的模块安装到设备上,如下图:

勾选我们刚才安装的模块,并重启系统,等系统重启之后,打开样例app,在输入密码的地方输入任意字符,因为我们实现的那个模块会执行

param.args[1] = param.args[0]; 这行代码,所以输入任意密码都会通过验证,如下图

整个模块执行过程的log信息可以在Xposedlog中查看到,如下图

由日志可以看到,hook的关键代码(前置函数)执行前,checkLogin方法的两个参数是不同的,而在后置函数执行的时候,两个参数已然相等了:)

  • 我的微信
  • 这是我的微信扫一扫
  • weinxin
  • 我的微信公众号
  • 我的微信公众号扫一扫
  • weinxin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: