Android Hook神器——XPosed入門(登陸劫持示範)

來源:互聯網
上載者:User

標籤:android   廣告   登陸劫持   hook   xposed   

如果想飛得高,就該把地平線忘掉。

前段時間寫了一篇有關於CydiaSubstrate的廣告注入的文章(地址:http://blog.csdn.net/yzzst/article/details/47318751),大家都直呼過癮。但是,真正瞭解這一方面的同學應該這道,其實還有一個比CydiaSubstrate更出名的工具:XPosed。

不是因為Xposed比CydiaSubstrate做的多好,而是Xposed是徹底開源的。今天,我們就向大家簡單的介紹一下Xposed,並書寫一個簡單的登陸劫持demo,讓大家快速的入門學習Xposed。

Xposed

Xposed架構是一款可以在不修改APK的情況下影響程式運行(修改系統)的架構服務,通過替換/system/bin/app_process程式控制zygote進程,使得app_process在啟動過程中會載入XposedBridge.jar這個jar包,從而完成對Zygote進程及其建立的Dalvik虛擬機器的劫持。

基於Xposed架構可以製作出許多功能強大的模組,且在功能不衝突的情況下同時運作。

此外,Xposed架構中的每一個庫還可以單獨下載使用,如Per APP Setting(為每個應用設定單獨的dpi或修改許可權)、Cydia、XPrivacy(防止隱私泄露)、BootManager(開啟自啟動程式管理應用)對原生Launcher替換表徵圖等應用或功能均基於此架構。

官網地址:http://repo.xposed.info/。
源碼地址:https://github.com/rovo89。

Xposed架構是基於一個Android的本地服務應用XposedInstaller與一個提供API 的jar檔案來完成的。

所以,安裝使用Xposed架構我們需要完成以下幾個步驟:

安裝本地服務XposedInstaller
需要安裝XposedInstall.apk本地服務應用,我們能夠在其官網的framework欄目中找到,下載並安裝。地址為:

http://repo.xposed.info/module/de.robv.android.xposed.installer

安裝好後進入XposedInstaller應用程式,會出現需要啟用架構的介面,8-5所示。這裡我們點擊“安裝/更新”就能完成架構的啟用了。部分裝置如果不支援直接寫入的話,可以選擇“安裝方式”,修改為在Recovery模式下自動安裝即可。

因為安裝時會存在需要Root許可權,安裝後會啟動Xposed的app_process,所以安裝過程中會存在裝置多次重新啟動。

TIPS:由於國內的部分ROM對Xposed不相容,如果安裝Xposed不成功的話,強制使用Recovery寫入可能會造成裝置反覆重啟而無法正常啟動。

下載使用API庫

其API庫XposedBridgeApi-.jar(version是XposedAPI的版本號碼,如我們這裡是XposedBridgeApi-54.jar)檔案,我們能夠在Xposed的官方支援xda論壇找到,其地址為:

http://forum.xda-developers.com/xposed/xposed-api-changelog-developer-news-t2714067

下載完畢後我們需要將 Xposed Library 複製到 lib目錄(注意是 lib 目錄不是Android提供的 libs 目錄),然後將這個 jar 包添加到 Build PATH 中

如果直接將jar包放置到了libs目錄下,很可能會產生錯 誤“IllegalAccessError: Class ref in
pre-verified class resolved to unexpected
implementation”。
估計Xposed作者在其架構內部也引用了BridgeApi,這樣操作避免重複引用。

實戰,登陸劫持(原理)

之前跟大家也說過使用CydiaSubstrate進行廣告注入(地址:http://blog.csdn.net/yzzst/article/details/47318751),很多網友問我,就只能簡單的注入一個廣告,還能做什麼嗎?

登陸劫持!!!,你沒聽錯,今天我們這裡就簡單的示範一下,如何對一個應用程式的登陸功能進行劫持,並把帳號密碼列印出來。

如我們常見的登陸劫持,就是使用到了Hook技術來完成的。那麼這個登陸劫持是如何完成的呢?下面我們就具體來看看,一個我們在開發中常見到的登陸例子。首先我們看看一個常見的登陸介面是什麼樣子的。

其對應的登陸流程代碼如下所示:

// 登陸按鈕的onClick事件mLoginButton.setOnClickListener(new OnClickListener() {    @Overridepublic void onClick(View v) {    // 擷取使用者名稱        String username = mUserEditText.getText() + "";        // 擷取密碼        String password = mPasswordEditText.getText() + "";        if (isCorrectInfo(username, password)) {            Toast.makeText(MainActivity.this, "登陸成功!", Toast.LENGTH_LONG).show();        } else {            Toast.makeText(MainActivity.this, "登陸失敗!", Toast.LENGTH_LONG).show();        }    }});

我們會發現,登陸介面上面的使用者資訊都是儲存在EditText控制項上,然後通過使用者手動點擊“登陸”按鈕才會將上面的資訊發送至伺服器端去驗證帳號與密碼是否正確。這樣就很簡單了,駭客們只需要找到開發人員在使用EditText控制項的getText方法後進行網路驗證的方法,Hook該方法,就能劫持到使用者的賬戶與密碼劫了。

TIPS:當然,我們也可以仿照上之前CydiaSubstrate的廣告注入例子(地址:http://blog.csdn.net/yzzst/article/details/47318751),做一個一模一樣的Activity,在劫持原Activity優先彈出來,達到欺騙使用者擷取密碼的目的。

具體流程如下:

實戰,登陸劫持(編碼)

明白了原理下面我們就實際的操作一次,這裡我們選擇使用Xposed架構來操作。使用Xposed進行Hook操作主要就是使用到了Xposed中的兩個比較重要的方法,handleLoadPackage擷取包載入時候的回調並拿到其對應的classLoader;findAndHookMethod對指定類的方法進行Hook。它們的詳細定義如下所示:

  /**     * 包載入時候的回調     */public void handleLoadPackage(final LoadPackageParam lpparam)/**     * Xposed提供的Hook方法     *      * @param className 待Hook的Class     * @param classLoader classLoader     * @param methodName 待Hook的Method     * @param parameterTypesAndCallback hook回調     * @return      */Unhook findAndHookMethod(String className, ClassLoader classLoader, String methodName, Object... parameterTypesAndCallback) 

當然,我們使用Xposed進行Hook也分為如下幾個步驟:

1. 在AndroidManifest.xml檔案中配置外掛程式名稱與Api版本號碼

<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="一個登陸劫持的範例" />        <!-- 最低版本號碼 -->        <meta-data            android:name="xposedminversion"            android:value="30" /></application>

2. 建立一個入口類並繼承並實現IXposedHookLoadPackage介面

如下操作,我們建立了一個com.example.loginhook.Main的類,並實現IXposedHookLoadPackage介面中的handleLoadPackage方法,將非com.example.login包名的應用過濾掉,即我們只操作包名為com.example.login的應用。如下所示:

public class Main implements IXposedHookLoadPackage {    /**     * 包載入時候的回調     */    public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {        // 將包名不是 com.example.login 的應用剔除掉        if (!lpparam.packageName.equals("com.example.login"))            return;        XposedBridge.log("Loaded app: " + lpparam.packageName);    }}

3. 聲明主入口路徑

需要在assets檔案夾中建立一個xposed_init的檔案,並在其中聲明主入口類。如這裡我們的主入口類為com.example.loginhook.Main

4. 使用findAndHookMethod方法Hook劫持登陸資訊

這是最重要的一步,我們之前所分析的都需要到這一步進行操作。如我們之前所分析的登陸程式,我們需要劫持就是需要Hook其com.example.login.MainActivity中的isCorrectInfo方法。我們使用Xposed提供的findAndHookMethod直接進行MethodHook操作(與Cydia很類似)。在其Hook回調中使用XposedBridge.log方法,將登陸的帳號密碼資訊列印至Xposed的日誌中。具體操作如下所示:

import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;public class Main implements IXposedHookLoadPackage {    /**     * 包載入時候的回調     */    public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {        // 將包名不是 com.example.login 的應用剔除掉        if (!lpparam.packageName.equals("com.example.login"))            return;        XposedBridge.log("Loaded app: " + lpparam.packageName);        // Hook MainActivity中的isCorrectInfo(String,String)方法        findAndHookMethod("com.example.login.MainActivity", lpparam.classLoader, "isCorrectInfo", String.class,                String.class, new XC_MethodHook() {                    @Override                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {                        XposedBridge.log("開始劫持了~");                        XposedBridge.log("參數1 = " + param.args[0]);                        XposedBridge.log("參數2 = " + param.args[1]);                    }                    @Override                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {                        XposedBridge.log("劫持結束了~");                        XposedBridge.log("參數1 = " + param.args[0]);                        XposedBridge.log("參數2 = " + param.args[1]);                    }                });    }}

5. 在XposedInstaller中啟動我們自訂的模組
編譯後安裝在Android裝置上的模組應用程式不會立即的生效,我們需要在XpasedInstaller模組選項中勾選待啟用的模組才能讓其正常的生效。如

6. 重啟驗證
重啟Android裝置,進入XposedInstaller查看日誌模組,因為我們之前使用的是XposedBridge.log方法列印log,所以log都會顯示在此處。我們發現我們需要劫持的帳號密碼都顯示再來此處。

TIPS:這裡我們是通過逆向分析該登陸頁面的登入判斷調用函數來完成Hook與劫持工作的。有些讀者應該想出來了,我們能不能直接Hook系統中提供給我們的控制項EditText(輸入框控制項)中的getText()方法進行Hook呢?這樣我們就能夠對系統中所有的輸入進行監控劫持了。這裡留給大家一個思考,感興趣的讀者可以嘗試一下。

最後,希望交流學習的,可以加一下我的個人,大家相互學習進步。

/*
* @author zhoushengtao(周聖韜)
* @since 2015年8月14 日 12:17:22
* @weixin stchou_zst
* @blog http://blog.csdn.net/yzzst
* @交流學習QQ群:341989536
* @私人QQ:445914891
/

著作權聲明:轉載請標註:http://blog.csdn.net/yzzst 。 本文為博主原創文章,未經博主允許不得轉載。

Android Hook神器——XPosed入門(登陸劫持示範)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.