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 Architecture(App架構入門,示例程式碼演示)
面臨的問題 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