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 方法的兩個參數是不同的,而在后置函數執行的時候,兩個參數已然相等了:)