Xposed hook

Xposed框架是一款可以在不修改APK的情況下影響程序運(yùn)行(修改系統(tǒng))的框架服務(wù)拗秘,通過替換/system/bin/app_process程序控制zygote進(jìn)程,使得app_process在啟動(dòng)過程中會(huì)加載XposedBridge.jar這個(gè)jar包祈惶,從而完成對Zygote進(jìn)程及其創(chuàng)建的Dalvik虛擬機(jī)的劫持雕旨。
基于Xposed框架可以制作出許多功能強(qiáng)大的模塊,且在功能不沖突的情況下同時(shí)運(yùn)作行瑞。此外奸腺,Xposed框架中的每一個(gè)庫還可以單獨(dú)下載使用,如Per APP Setting(為每個(gè)應(yīng)用設(shè)置單獨(dú)的dpi或修改權(quán)限)血久、Cydia突照、XPrivacy(防止隱私泄露)、BootManager(開啟自啟動(dòng)程序管理應(yīng)用)對原生Launcher替換圖標(biāo)等應(yīng)用或功能均基于此框架氧吐。

Xposed框架是基于一個(gè)Android的本地服務(wù)應(yīng)用XposedInstaller讹蘑,與一個(gè)提供API 的jar文件來完成的。所以筑舅,安裝使用Xposed框架需要完成以下幾個(gè)步驟:
安裝本地服務(wù)XposedInstaller
需要安裝XposedInstall.apk本地服務(wù)應(yīng)用座慰,能夠在其官網(wǎng)的framework欄目中找到,下載并安裝翠拣。地址為: http://repo.xposed.info/module/de.robv.android.xposed.installer版仔。
安裝好后進(jìn)入XposedInstaller應(yīng)用程序,會(huì)出現(xiàn)需要激活框架的界面,如下圖所示蛮粮。這里我們點(diǎn)擊“安裝/更新”就能完成框架的激活了益缎。部分設(shè)備如果不支持直接寫入的話,可以選擇“安裝方式”然想,修改為在Recovery模式下自動(dòng)安裝即可莺奔。


因?yàn)榘惭b時(shí)會(huì)存在需要Root權(quán)限,安裝后會(huì)啟動(dòng)Xposed的app_process变泄,所以安裝過程中會(huì)存在設(shè)備多次重新啟動(dòng)令哟。
TIPS:由于國內(nèi)的部分ROM對Xposed不兼容,如果安裝Xposed不成功的話妨蛹,強(qiáng)制使用Recovery寫入可能會(huì)造成設(shè)備反復(fù)重啟而無法正常啟動(dòng)屏富。
下載使用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復(fù)制到lib目錄(注意是lib目錄表窘,不是Android提供的libs目錄),然后將這個(gè)jar包添加到Build PATH中甜滨。

如果直接將jar包放置到了libs目錄下乐严,很可能會(huì)產(chǎn)生錯(cuò)誤: “IllegalAccessError: Class ref in pre-verified class resolved to unexpected implementation” 估計(jì)Xposed作者在其框架內(nèi)部也引用了BridgeApi,這樣操作避免重復(fù)引用衣摩。
實(shí)戰(zhàn)昂验,登陸劫持(原理)
使用CydiaSubstrate進(jìn)行注入,還能做登陸劫持
對一個(gè)應(yīng)用程序的登陸功能進(jìn)行劫持艾扮,并把賬號密碼打印出來既琴。
常見的登陸劫持,就是使用了Hook技術(shù)來完成的泡嘴。常見到的登陸例子甫恩。

其對應(yīng)的登陸流程代碼如下所示:

[java] view plaincopy

// 登陸按鈕的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();  
    }  
}  

});

登陸界面上面的用戶信息都是存儲(chǔ)在EditText控件上,通過用戶手動(dòng)點(diǎn)擊“登陸”按鈕才會(huì)將上面的信息發(fā)送至服務(wù)器端抛虫,去驗(yàn)證賬號與密碼是否正確松靡。這樣就很簡單了,只需要找到開發(fā)者在使用EditText控件的getText方法后進(jìn)行網(wǎng)絡(luò)驗(yàn)證的方法建椰,Hook該方法雕欺,就能劫持到用戶的賬戶與密碼劫了。
TIPS:當(dāng)然,我們也可以仿照上之前CydiaSubstrate的廣告注入例子屠列,做一個(gè)一模一樣的Activity蛛枚,在劫持原Activity優(yōu)先彈出來,達(dá)到欺騙用戶獲取密碼的目的脸哀。
具體流程如下:



登陸劫持(編碼)
選擇使用Xposed框架來操作蹦浦。使用Xposed進(jìn)行Hook操作主要就是使用到了Xposed中的兩個(gè)比較重要的方法,handleLoadPackage獲取包加載時(shí)候的回調(diào)并拿到其對應(yīng)的classLoader撞蜂;findAndHookMethod對指定類的方法進(jìn)行Hook盲镶。它們的詳細(xì)定義如下所示:

[java] view plaincopy

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

使用Xposed進(jìn)行Hook也分為如下幾個(gè)步驟:
1. 在AndroidManifest.xml文件中配置插件名稱與Api版本號

[xml] view plaincopy

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

</application>

2. 新建一個(gè)入口類并繼承并實(shí)現(xiàn)IXposedHookLoadPackage接口
如下操作,我們新建了一個(gè)com.example.loginhook.Main的類蝌诡,并實(shí)現(xiàn)IXposedHookLoadPackage接口中的handleLoadPackage方法溉贿,將非com.example.login包名的應(yīng)用過濾掉,即我們只操作包名為com.example.login的應(yīng)用浦旱。如下所示:

[java] view plaincopy

public class Main implements IXposedHookLoadPackage {

/** 
 * 包加載時(shí)候的回調(diào) 
 */  
public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {  
    // 將包名不是 com.example.login 的應(yīng)用剔除掉  
    if (!lpparam.packageName.equals("com.example.login"))  
        return;  
    XposedBridge.log("Loaded app: " + lpparam.packageName);  
}  

}

3. 聲明主入口路徑
需要在assets文件夾中新建一個(gè)xposed_init的文件宇色,并在其中聲明主入口類。如這里我們的主入口類為com.example.loginhook.Main颁湖。


4. 使用findAndHookMethod方法Hook劫持登陸信息
這是最重要的一步宣蠕,所分析的都需要到這一步進(jìn)行操作。分析的登陸程序甥捺,劫持就是需要Hook其com.example.login.MainActivity中的isCorrectInfo方法抢蚀。我們使用Xposed提供的findAndHookMethod直接進(jìn)行MethodHook操作(與Cydia很類似)。在其Hook回調(diào)中使用XposedBridge.log方法镰禾,將登陸的賬號密碼信息打印至Xposed的日志中皿曲。具體操作如下所示:

[java] view plaincopy

import static de.robv.android.xposed.XposedHelpers.findAndHookMethod;
public class Main implements IXposedHookLoadPackage {

/** 
 * 包加載時(shí)候的回調(diào) 
 */  
public void handleLoadPackage(final LoadPackageParam lpparam) throws Throwable {  

    // 將包名不是 com.example.login 的應(yīng)用剔除掉  
    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("參數(shù)1 = " + param.args[0]);  
                    XposedBridge.log("參數(shù)2 = " + param.args[1]);  
                }  

                @Override  
                protected void afterHookedMethod(MethodHookParam param) throws Throwable {  
                    XposedBridge.log("劫持結(jié)束了~");  
                    XposedBridge.log("參數(shù)1 = " + param.args[0]);  
                    XposedBridge.log("參數(shù)2 = " + param.args[1]);  

                }  
            });  
}  

}

5. 在XposedInstaller中啟動(dòng)我們自定義的模塊
編譯后安裝在Android設(shè)備上的模塊應(yīng)用程序不會(huì)立即的生效,需要在XpasedInstaller模塊選項(xiàng)中勾選待啟用的模塊才能讓其正常的生效吴侦。如:


6. 重啟驗(yàn)證
重啟Android設(shè)備屋休,進(jìn)入XposedInstaller查看日志模塊,因?yàn)槲覀冎笆褂玫氖荴posedBridge.log方法打印log备韧,所以log都會(huì)顯示在此處劫樟。發(fā)現(xiàn)需要劫持的賬號密碼都顯示再來此處。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末盯蝴,一起剝皮案震驚了整個(gè)濱河市毅哗,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌捧挺,老刑警劉巖虑绵,帶你破解...
    沈念sama閱讀 218,036評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異闽烙,居然都是意外死亡翅睛,警方通過查閱死者的電腦和手機(jī)声搁,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,046評論 3 395
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捕发,“玉大人疏旨,你說我怎么就攤上這事≡幔” “怎么了檐涝?”我有些...
    開封第一講書人閱讀 164,411評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長法挨。 經(jīng)常有香客問我谁榜,道長,這世上最難降的妖魔是什么凡纳? 我笑而不...
    開封第一講書人閱讀 58,622評論 1 293
  • 正文 為了忘掉前任窃植,我火速辦了婚禮,結(jié)果婚禮上荐糜,老公的妹妹穿的比我還像新娘巷怜。我一直安慰自己,他們只是感情好暴氏,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,661評論 6 392
  • 文/花漫 我一把揭開白布延塑。 她就那樣靜靜地躺著,像睡著了一般偏序。 火紅的嫁衣襯著肌膚如雪页畦。 梳的紋絲不亂的頭發(fā)上胖替,一...
    開封第一講書人閱讀 51,521評論 1 304
  • 那天研儒,我揣著相機(jī)與錄音,去河邊找鬼独令。 笑死端朵,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的燃箭。 我是一名探鬼主播冲呢,決...
    沈念sama閱讀 40,288評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼招狸!你這毒婦竟也來了敬拓?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,200評論 0 276
  • 序言:老撾萬榮一對情侶失蹤裙戏,失蹤者是張志新(化名)和其女友劉穎乘凸,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體累榜,經(jīng)...
    沈念sama閱讀 45,644評論 1 314
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡营勤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,837評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片葛作。...
    茶點(diǎn)故事閱讀 39,953評論 1 348
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡寿羞,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出赂蠢,到底是詐尸還是另有隱情绪穆,我是刑警寧澤,帶...
    沈念sama閱讀 35,673評論 5 346
  • 正文 年R本政府宣布虱岂,位于F島的核電站霞幅,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏量瓜。R本人自食惡果不足惜司恳,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,281評論 3 329
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望绍傲。 院中可真熱鬧扔傅,春花似錦、人聲如沸烫饼。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,889評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽杠纵。三九已至荠耽,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間比藻,已是汗流浹背铝量。 一陣腳步聲響...
    開封第一講書人閱讀 33,011評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留银亲,地道東北人慢叨。 一個(gè)月前我還...
    沈念sama閱讀 48,119評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像务蝠,于是被迫代替她去往敵國和親拍谐。 傳聞我的和親對象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 44,901評論 2 355

推薦閱讀更多精彩內(nèi)容