Xposed框架實現(xiàn)Android中的Hook

Hook.jpg

前幾天受高人指點意外發(fā)現(xiàn)了開啟Android世界的新大陸邓嘹,就是這個叫Hook(''鉤子'')的東西。聽起來很神奇惰说,周末抽時間研究了一番,發(fā)現(xiàn)確實是一個值得去研究的技術缘回。


什么是 Hook助被?

江湖上稱它為“鉤子”,它能夠在事件傳送到終點前截獲并監(jiān)控事件的傳輸切诀。它能夠將自己的代碼“融入”被鉤住的進程中揩环,成為目標進程的一部分。這么說來幅虑,它可以Hook住系統(tǒng)的API丰滑,然后通過注入自己代碼的方式去改變系統(tǒng)方法的行為、以及對系統(tǒng)方法的監(jiān)聽倒庵;除此以外褒墨,它還能通過實現(xiàn)一個程序,去篡改其他應用程序的行為擎宝。

原理:Hook技術本質是函數(shù)調用郁妈,由于處于Linux用戶狀態(tài),每個進程有自己獨立的進程控件绍申,所以必須先注入所要Hook的進程空間噩咪,修改其內(nèi)存中進程代碼,替換過程表的符號地址极阅,通過ptrace函數(shù)附加進程胃碾,向遠程進程注入so庫,從而達到監(jiān)控以及遠程進程關鍵函數(shù)掛鉤


Xposed框架

要是說起這個框架筋搏,那可就真的牛逼了仆百。什么微信自動搶紅包、微信步數(shù)作弊......這些騷操作都是這個框架干出來的奔脐。
在Android系統(tǒng)中俄周,應用程序進程以及系統(tǒng)服務進程都是由Zygote 進程 fork 出來的。Xposed框架深入到Android核心機制中髓迎,正式通過改造Zygote 進程來實現(xiàn)一系列的操作峦朗。
其使用方法我這里不做過多的說明,百度就能有一大堆的使用教程竖般。

關于Xposed框架的具體實現(xiàn)原理甚垦,我建議可以參考Dalvik虛擬機原理及Xposed hook原理這篇文章。


劫持登錄Demo

又是這個栗子...不過不要緊,我們最重要的是學習原理和用法艰亮,一通百通闭翩。

  btnHook.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                String userName = etUserame.getText().toString();
                String userPassword = etPassword.getText().toString();
                if (checkInfo(userName, userPassword)) {
                    Toast.makeText(getApplicationContext(), "登錄成功", Toast.LENGTH_SHORT).show();
                } else {
                    Toast.makeText(getApplicationContext(), "登錄失敗", Toast.LENGTH_SHORT).show();
                }
            }
        });

private boolean checkInfo(String userName, String userPassword) {
        return userName.equals("jy") && userPassword.equals("123");
    }

我模擬了一個登錄的情景,并規(guī)定只有輸入用戶名和密碼分別是jy和123的條件下才能正常登錄迄埃。
為了實現(xiàn)劫持登錄的效果疗韵,這里新建一個類去實現(xiàn) IXposedHookLoadPackage,然后重寫 handleLoadPackage 方法侄非。

 /**
     * 包加載時候的回調
     */

    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {

        XposedBridge.log("Loaded app : " + lpparam.packageName);

        XposedHelpers.findAndHookMethod("cn.edu.hrbeu.jy.hooktest.MainActivity", lpparam.classLoader, "checkInfo",
                String.class, String.class, new XC_MethodHook() {
                    @Override
                    protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
                        XposedBridge.log("hook start");
                        XposedBridge.log("參數(shù)1: " + param.args[0]);
                        XposedBridge.log("參數(shù)2: " + param.args[1]);
                    }

                    @Override
                    protected void afterHookedMethod(MethodHookParam param) throws Throwable {
                        XposedBridge.log("劫持前返回的result: " + param.getResult());
                        param.setResult(true);
                        XposedBridge.log("劫持后返回的result: " + param.getResult());
                        XposedBridge.log("hook finish");
                    }
                });
    }

在啟動了任意應用程序之后蕉汪,都會執(zhí)行一次這個方法,然后根據(jù) packageName 來找到你需要去Hook的某個app的某個方法逞怨。這里者疤,我找到了我的 MainActivity 以及驗證登錄信息的 checkInfo() 方法。
findAndHookMethod()中有兩個回調方法叠赦,根據(jù)名字可以看出一個是方法執(zhí)行前的回調驹马,另一個是方法執(zhí)行之后的回調。

先來看看程序界面和運行結果:

11111111.png
執(zhí)行結果.png

可以看到的是除秀,我輸入的內(nèi)容與我之前設定的賬號密碼并不同糯累,但還是顯示了登錄成功。來簡單分析一下:

首先册踩,我輸入了錯誤的賬號密碼泳姐,所以正常情況我的checkInfo()方法會返回 false 。所以劫持前的result 會返回 false,就像Log日志里面的一樣。然后我將 param.setResult(true);將返回的結果設置成了 true...再作為最終的結果返回诚镰,所以說無論我輸入什么都會顯示登錄成功...


分析

雖然我做的只是最簡單的修改了自己實現(xiàn)的方法,但是其實無論是系統(tǒng)API 還是說別的app里面的方法扒怖,只要知道方法名和參數(shù)類型较锡,理論上我們都可以去Hook住它們业稼,并且可以監(jiān)聽或者修改這些方法的一些行為。

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末蚂蕴,一起剝皮案震驚了整個濱河市低散,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌骡楼,老刑警劉巖熔号,帶你破解...
    沈念sama閱讀 211,376評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異鸟整,居然都是意外死亡引镊,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,126評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來弟头,“玉大人吩抓,你說我怎么就攤上這事「昂蓿” “怎么了疹娶?”我有些...
    開封第一講書人閱讀 156,966評論 0 347
  • 文/不壞的土叔 我叫張陵,是天一觀的道長伦连。 經(jīng)常有香客問我雨饺,道長,這世上最難降的妖魔是什么惑淳? 我笑而不...
    開封第一講書人閱讀 56,432評論 1 283
  • 正文 為了忘掉前任额港,我火速辦了婚禮,結果婚禮上歧焦,老公的妹妹穿的比我還像新娘锹安。我一直安慰自己,他們只是感情好倚舀,可當我...
    茶點故事閱讀 65,519評論 6 385
  • 文/花漫 我一把揭開白布叹哭。 她就那樣靜靜地躺著,像睡著了一般痕貌。 火紅的嫁衣襯著肌膚如雪风罩。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,792評論 1 290
  • 那天舵稠,我揣著相機與錄音超升,去河邊找鬼。 笑死哺徊,一個胖子當著我的面吹牛室琢,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播落追,決...
    沈念sama閱讀 38,933評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼盈滴,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了轿钠?” 一聲冷哼從身側響起巢钓,我...
    開封第一講書人閱讀 37,701評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎疗垛,沒想到半個月后症汹,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,143評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡贷腕,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,488評論 2 327
  • 正文 我和宋清朗相戀三年背镇,在試婚紗的時候發(fā)現(xiàn)自己被綠了咬展。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,626評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡瞒斩,死狀恐怖挚赊,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情济瓢,我是刑警寧澤荠割,帶...
    沈念sama閱讀 34,292評論 4 329
  • 正文 年R本政府宣布,位于F島的核電站旺矾,受9級特大地震影響蔑鹦,放射性物質發(fā)生泄漏。R本人自食惡果不足惜箕宙,卻給世界環(huán)境...
    茶點故事閱讀 39,896評論 3 313
  • 文/蒙蒙 一嚎朽、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧柬帕,春花似錦哟忍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至凤跑,卻和暖如春爆安,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仔引。 一陣腳步聲響...
    開封第一講書人閱讀 31,977評論 1 265
  • 我被黑心中介騙來泰國打工扔仓, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人咖耘。 一個月前我還...
    沈念sama閱讀 46,324評論 2 360
  • 正文 我出身青樓翘簇,卻偏偏與公主長得像,于是被迫代替她去往敵國和親儿倒。 傳聞我的和親對象是個殘疾皇子版保,可洞房花燭夜當晚...
    茶點故事閱讀 43,494評論 2 348

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

  • Android 自定義View的各種姿勢1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,757評論 25 707
  • 安全博客 > 技術研究 > 淺談android hook技術 淺談android hook技術 您當前的位置:...
    光劍書架上的書閱讀 6,152評論 0 8
  • 前言 Xposed這位老兄大家可能不認識,微信自動搶紅包大家聽過吧义桂、微信記錄器作弊大家聽過吧找筝、地理位置模擬大家聽過...
    王永迪閱讀 30,976評論 15 62
  • 嘿!親愛的老爸慷吊,我愛你。 前幾天和發(fā)小聊天曹抬,她對我講:小卿溉瓶,還記得小時候去你家玩,在你家院子里畫個圈圈玩捉迷藏的游...
    愿與卿語閱讀 462評論 0 4
  • 數(shù)據(jù)可視化的意義 1. 表達觀點 人類是視覺動物,一張簡單的數(shù)據(jù)可視化圖表在傳遞大量信息的同時堰酿,能更加直觀地闡述觀...
    耗子吳閱讀 2,570評論 1 21