這是一篇最新的Xposed模塊編寫教程

!!前言

Xposed框架是一款開源框架,其功能是可以在不修改APK的情況下影響程序運行(修改系統)的框架服務,基于它可以制作出許多功能強大的模塊,且在功能不沖突的情況下同時運作。也正因為如此,Xposed 具有比較高的可定制化程度。
作為一個爬蟲工程師如果你只會frida的話,那你可要開始水一下這篇文章了。


image.png

Xposed 模塊編寫簡介

Xposed 框架的原理就不多說了,它部署在ROOT后的安卓手機上,通過替換/system/bin/app_process程序控制zygote進程,使得app_process在啟動過程中會加載XposedBridge.jar這個jar包,從而完成對Zygote進程及其創建的Dalvik虛擬機的劫持??梢宰屛覀冊诓恍薷腁PK源碼的情況下,通過自己編寫的模塊來影響程序運行的框架服務,實現類似于自動搶紅包、微信消息自動回復等功能。

其實,從本質上來講,Xposed 模塊也是一個 Android 程序。但與普通程序不同的是,想要讓寫出的Android程序成為一個Xposed 模塊,要額外多完成以下四個硬性任務:

1、讓手機上的xposed框架知道我們安裝的這個程序是個xposed模塊。
2、模塊里要包含有xposed的API的jar包,以實現下一步的hook操作。
3、這個模塊里面要有對目標程序進行hook操作的方法。
4、要讓手機上的xposed框架知道,我們編寫的xposed模塊中,哪一個方法是實現hook操作的。
  • 這就引出我即將要介紹的四大件(與前四步一一對照):

1、AndroidManifest.xml
2、XposedBridgeApi-xx.jar 與 build.gradle
3、實現hook操作的具體代碼
4、xposed_Init

牢記以上四大件,按照順序一個一個實現,就能完成我們的第一個Xposed模塊編寫。下面我們就開始吧!

邁開第一步,新建項目并編輯AndroidManifest.xml

    1. 創建android項目:選擇File-->new--> New project--> Empty Activity
image.png
  • 2、我們可以把項目查看方式設置為Project模式,以方便查看。然后在 “項目名稱/app/src/main/”目錄下找到AndroidManifest.xml,雙擊之,并在指定位置插入以下三段代碼:


    image.png

    插入之后,如果你把手機連上AndroidStudio ,點擊“編譯”或者“運行”的話,手機就會啟動剛剛編寫的這個程序。而在手機里的Xposed框架中也會顯示出這個模塊:

image.png

說明Xposed框架已經認出了我們寫的程序。但先別高興太早——雖然框架已經覺得他是一個Xposed模塊了,但我們自己心里清楚,這個模塊還啥都不會干呢。下一步,我們讓這個模塊長點本事。

走出第二步,搞定XposedBridgeApi-xx.jar 與 build.gradle

我們知道,Xposed模塊主要功能是用來Hook其他程序的各種函數。但是,如何讓前一步中的那個“一窮二白”的模塊長本事呢?那就要引入 XposedBridgeApi.jar 這個包,你可以理解為一把兵器,模塊有了這把寶刀才能施展出Hook本領。以前,都需要手動下載諸如XposedBridgeApi-54.jar 、 XposedBridgeApi-82.jar 等jar包,然后手工導入到libs目錄里,才能走下一步道路。其實在AndroidStudio 3.1里面,我們完全不用這么麻煩,只需要多寫一行代碼,就讓AndroidStuido自動給我們配置XposedBridgeApi.jar !下面操作開始(序號接著上一節):

  • 3、在 “項目名稱/app/src/main/”目錄下找到build.gradle,在圖示位置加上:

    repositories {
      jcenter()
    }
    

以及

compileOnly 'de.robv.android.xposed:api:82'
compileOnly 'de.robv.android.xposed:api:82:sources'

這句代碼是告訴AndroidStuido使用jcenter作為代碼倉庫,從這個倉庫里遠程尋找 de.robv.android.xposed:api:82 這個API。這個網上很少有Xposed教程介紹它的?。ㄎ覀儾挥米约赫襒posedBridgeApi.jar了。注意!此處要用compileOnly這個修飾符!網上有些寫的是provide ,現在已經停用了?。┤鐖D:


image.png

寫完之后, build.gradle會提示文件已經修改,是否同步。點擊 “sync now”。

好了,現在寶刀已經到手。下一步,就要開始“施展刀法”(編寫hook代碼)了。


邁開第三步,實現hook操作的具體代碼

  • 4、在“施展刀法”(編寫hook代碼)之前,我們先要立一個靶子。在界面上畫一個按鈕,并在MainAcitiviy里寫代碼如下:

    package com.gd.xposed;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.view.View;
    import android.widget.Button;
    import android.widget.Toast;
    public class MainActivity extends AppCompatActivity {
        private Button button;
        @Override
        protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        button = (Button) findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
        public void onClick(View v) {
              Toast.makeText(MainActivity.this, toastMessage(), Toast.LENGTH_SHORT).show();
            }
        });
      }
      public String toastMessage() {
            return "你學會了嗎?";
      }
    

    }

image.png

image.png

這個靶子很簡單:MainActivity界面有個按鈕,點擊按鈕后會彈出一個toast提示,該提示的內容由 toastMessage() 方法提供,而toastMessage()的返回值為“你學會了嗎?”:


image.png

下面我們正式開始“施展刀法”(編寫hook代碼) 來hook我們的MainActivity并修改這個類的toastMessage()方法,讓它的返回值為“你已成功踏入xposed第一步!”:

  • 5、在MainActivity的同級路徑下新建一個類“HookTest.java”,代碼如下:


    image.png

    由代碼可知,我們是通過IXposedHookLoadPackage接口中的handleLoadPackage方法來實現Hook并篡改程序的輸出結果的。代碼中“com.gd.xposed”是目標程序的包名,"com.gd.xposed.MainActivity" 是想要Hook的類, "toastMessage"是想要Hook的方法。我們在afterHookedMethod方法(用來定義Hook了目標方法之后的操作)中,修改了toastMessage()方法的返回值為“你已被劫持”。

OK,以上用來hook的代碼編寫完畢,讓我們進行下一步操作。

最后一步,添加入口點

右鍵點擊 “main ” 文件夾 , 選擇new --> Folder -->Assets Folder,新建assets 文件夾:


image.png

然后右鍵點擊 assets文件夾, new--> file,文件名為xposed_init(文件類型選text),并在其中寫上入口類的完整路徑(就是自己編寫的那一個Hook類),這樣, Xposed框架就能夠從這個 xposed_init 讀取信息來找到模塊的入口,然后進行Hook操作了:


image.png
image.png

然后點擊小三角“運行”!在Xposed框架里找到自己寫的模塊,打上勾,重啟——點開自己的程序看看,是不是toast的提示已經變了?

image.png

哈哈,是不是挺簡單的呢?你學費了嗎?
俗話說:好記性不如爛筆頭!
本文參考:https://www.freebuf.com/articles/terminal/189021.html

?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,818評論 6 531
  • 序言:濱河連續發生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發現死者居然都...
    沈念sama閱讀 98,185評論 3 414
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人,你說我怎么就攤上這事?!?“怎么了?”我有些...
    開封第一講書人閱讀 175,656評論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長。 經常有香客問我,道長,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 62,647評論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當我...
    茶點故事閱讀 71,446評論 6 405
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發上,一...
    開封第一講書人閱讀 54,951評論 1 321
  • 那天,我揣著相機與錄音,去河邊找鬼。 笑死,一個胖子當著我的面吹牛,可吹牛的內容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,041評論 3 440
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 42,189評論 0 287
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后,有當地人在樹林里發現了一具尸體,經...
    沈念sama閱讀 48,718評論 1 333
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 40,602評論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發現自己被綠了。 大學時的朋友給我發了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 42,800評論 1 369
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級特大地震影響,放射性物質發生泄漏。R本人自食惡果不足惜,卻給世界環境...
    茶點故事閱讀 44,045評論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 34,419評論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至,卻和暖如春,著一層夾襖步出監牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 35,671評論 1 281
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 51,420評論 3 390
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 47,755評論 2 371

推薦閱讀更多精彩內容