Xposed學習入門篇

Xposed框架

Xposed 框架是一門神器,可以在不修改APK的情況下影響程序的運行(修改系統)的框架,在它的基礎上增加一些模塊可以實現各種強大功能。比如自定義狀態欄、數據監控等。
他是GITHUBS上的大rovo89設計的一個針對Android平臺的動態劫持項目。通過替換/system/bin/app_process程序控制zygote進程,使得app_process在啓動過程中會加載XposedBridge.jar這個jar包,從而完成對Zygote進程及其創建的Dalvik虛擬機的劫持。

Zygote

從字面是翻譯過來是 <生物>合子,受精卵
在Android系統中,所有的應用程序進程以及系統服務進程SystemServer都是由Zygote進程孕育(fork)出來的,這受精卵的名稱還真是名副其實。


入門涉及到的東西如下

  1. xposed installer apk(上官網可以下載)
  2. 一臺root過的4.0以上的手機(這裏使用夜神模擬器做演示)

開始安裝Xposed框架安裝器

安裝成功根據提示重啓
重啓激活成功後顯示

開發Xposed Model

項目目錄結構

這裏寫圖片描述

  • 添加依賴

新建一個普通的android項目,添加依賴XposedBridge.jar
jar下載 https://yunpan.cn/cM8Iv4UHXUQsk 訪問密碼 e503
這裏有個地方要注意,XposedBridge.jar不能用compile來引用,應該用provided,不然在運行中會發生衝突,gradle文件如下圖

這裏寫圖片描述

  • AndroidMannifest.xml內容
         <meta-data
            android:name="xposedmodule"
            android:value="true"/>
        <meta-data
            android:name="xposeddescription"
            android:value="Xposed模塊test"/>
        <meta-data
            android:name="xposedminversion"
            android:value="54"/><!-- 對應的XposedBridge版本號 -->
  • 編寫hook代碼,即劫持代碼

這裏我寫的是隻hook測試app獲取的imei,imsi

package com.ycss.xposed;

import android.telephony.TelephonyManager;

import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodReplacement;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;

/**
 * TODO:
 * Created by ycss
 * on 2016/8/30 0030.
 */
public class XModelTest implements IXposedHookLoadPackage{

    @Override
    public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
        //我們可以根據包名去hook對應程序的方法,這裏我選擇hook我們的測試app
        if (loadPackageParam.packageName.equals("com.ycss.test")){
            //getDeviceId爲我們正常情況下獲取Imei的方法
            XposedHelpers.findAndHookMethod(TelephonyManager.class, "getDeviceId", new XC_MethodReplacement() {
                @Override
                protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
                    return "已經被HOOK";
                }
                 //getSubscriberId爲我們正常情況下獲取Imsi的方法
            XposedHelpers.findAndHookMethod(TelephonyManager.class, "getSubscriberId", new XC_MethodReplacement() {
                @Override
                protected Object replaceHookedMethod(MethodHookParam param) throws Throwable {
                    return "已經被HOOK";
                }
            });
            });

        }
    }
}


  • xposed_init內容

/assets/xposed_init要寫入指定Hook類的路徑,不然安裝時會報錯。這裏我們填上剛纔寫的那個Hook類路徑

com.ycss.xposed.XModelTest 

這時候我們的hook代碼就已經寫好了。接下來我們寫下我們的測試demo

package com.ycss.test;//我們在上面索要hook的指定包名

import android.content.Context;
import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.telephony.TelephonyManager;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        TextView tvImei= (TextView) findViewById(R.id.tv_imei);
        TextView tvImsi= (TextView) findViewById(R.id.tv_imsi);
        TelephonyManager tm = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE);
        tvImei.setText("大家好,我是IMEI:"+tm.getDeviceId());//getDeviceId即我們要hook的方法名
        tvImsi.setText("大家好,我是IMSI:"+tm.getSubscriberId());//getSubscriberId即我們要hook的方法名
    }
}
  • 測試App運行效果,正常情況下,IMEI跟IMSI顯示的是如圖內容

這裏寫圖片描述

  • 這個時候我們再運行我們的hook程序

    安裝成功,會提示如圖

    這裏寫圖片描述

這個時候我們要給模塊激活,勾選中模塊之後,選擇重啓 ,兩種重啓方式都可以

這裏寫圖片描述
這裏寫圖片描述

  • 重啓成功後,這個時候我們再打開我們的測試App,這時候IMEI跟IMSI已經變更成我們HOOK方法中所設置的返回內容了

這裏寫圖片描述

結尾

這個簡單的xposed模塊就這麼完成了。文中用到的資源都有提供下載。
通過簡單的例子,能夠HOOK自己寫的應用,那麼其他的也是同理可得。
本人新手,如果有什麼理解不對的地方,還望指教!謝謝

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章