1. 程式人生 > >Xposed框架的使用--簡單入門

Xposed框架的使用--簡單入門

##Xposed框架的使用

###1.xposed是什麼?
框架是一款開源框架,其功能是可以在不修改APK的情況下影響程式執行(修改系統)的框架服務,基於它可以製作出許多功能強大的模組,且在功能不衝突的情況下同時運作。Xposed 就好比是 Google 模組化手機的主體,只是一個框架的存在,在新增其他功能模組(Modules)之前,發揮不了什麼作用,但是沒了它也不行。也正因為如此,Xposed 具有比較高的可定製化程度。Moto X 使用者可定製手機的外觀、桌布、開機動畫等,Xposed 則允許使用者自選模組對手機功能進行自定義擴充。

###2.xposed框架的使用
xposed的主要作用是hook應用方法,動態劫持方法的執行。xposed的使用需要xposed框架.apk和XposedBridgeApi-54.jar配合使用 。而xposed框架apk可以看成是個Xposed 框架的管理工具,在這裡可以安裝、更新Xposed 框架,也可以解除安裝Xposed 框架,檢視安裝日誌。也可設定Xposed 框架安裝器是否聯網更新框架及模組。
xposed框架.apk需要root許可權,所以需要一臺root後的手機或者模擬器,這裡推薦使用模擬器即可。首先下載一個模擬器,常用的模擬器有bluestacks藍疊,夜神模擬器,genemotion等,由於genemotion的cpu框架是x86的,很多應用無法執行,所以選擇了夜神模擬器。下載地址:

https://www.yeshen.com/。下載安裝之後如下介面:

下載完成後直接拖到模擬器上安裝,安裝之後開啟apk,點選框架,進去點選安裝更新:

授予root許可權,然後重啟模擬器。xposed框架apk可以工作了,但是現在只是安裝好了xposed框架apk,並沒有任何hook模組工作。hook模組可以自己去下載,也可以自己編寫模組。
###3.xposed模組的編寫
下面通過簡單的demo演示如何編寫一個xposed模組,來hook住我們想要hook的方法。這裡就hook自己的app的一個載入廣告的程式碼,來動態攔截廣告的載入。

1.使用AS新建一個專案XposedDemo:

2.在MainActivity 模擬載入廣告的程式碼,正常點選載入廣告按鈕,會載入廣告,但是使用xposed對該方法進行hook之後,可以改變這個方法的執行。:

public class MainActivity extends AppCompatActivity {

private TextView tv_ad;
private Button btn_load_ad;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    tv_ad = findViewById(R.id.tv_ad);
    btn_load_ad = findViewById(R.id.btn_load_ad);

    btn_load_ad.setOnClickListener(new View.OnClickListener() {
        @Override
        public void onClick(View v) {
            tv_ad.setText(getTTAd());
        }
    });
}

public String getTTAd(){
    return "廣告載入成功";
}
}

在MainActivity 的佈局檔案如下:

<?xml version="1.0" encoding="utf-8"?>
<android.support.constraint.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">

<TextView
    android:id="@+id/tv_ad"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="等待廣告載入"
    app:layout_constraintBottom_toBottomOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintTop_toTopOf="parent" />

<Button
    android:id="@+id/btn_load_ad"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:text="載入廣告"/>
</android.support.constraint.ConstraintLayout>

2.下載XposedBridgeApi-54.jar的依賴包,地址https://pan.baidu.com/s/1subsZ5aUyQJPSENZtoWjEQ 密碼:iy2p 下載完成後在app目錄下建立資料夾mylib(名字隨意),並把XposedBridgeApi-54.jar複製到mylib下面,注意不能直接放到lib裡面,然後再app的build.gradle的dependencies加上provided fileTree(dir: ‘mylib’, include: [’.jar’]),或者compileOnly fileTree(dir: ‘mylib’, include: [’.jar’]),根據你的gradle版本選擇。

dependencies {
implementation fileTree(dir: 'libs', include: ['*.jar'])
implementation 'com.android.support:appcompat-v7:27.1.1'
implementation 'com.android.support.constraint:constraint-layout:1.1.3'
testImplementation 'junit:junit:4.12'
androidTestImplementation 'com.android.support.test:runner:1.0.2'
androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'

compileOnly fileTree(dir: 'mylib', include: ['*.jar'])

}

3.修改AndroidManifest.xml檔案,在applicatio標籤下面加入以下標籤:

<application
    android:allowBackup="true"
    android:icon="@mipmap/ic_launcher"
    android:label="@string/app_name"
    android:roundIcon="@mipmap/ic_launcher_round"
    android:supportsRtl="true"
    android:theme="@style/AppTheme">
    <activity android:name=".MainActivity">
        <intent-filter>
            <action android:name="android.intent.action.MAIN" />

            <category android:name="android.intent.category.LAUNCHER" />
        </intent-filter>
    </activity>

    <meta-data
        android:name="xposedmodule"
        android:value="true"/>
    <meta-data
        android:name="xposeddescription"
        android:value="這是一個xposed應用"/>
    <meta-data
        android:name="xposedminversion"
        android:value="54"/>
</application>

注意這裡面的三個meta-data標籤的name不能錯誤,不然xposed框架apk無法識別自定義編寫的xposed模組。

4.編寫hook工具類XposedHookUtil對getTTAd方法進行攔截替換,XposedHookUtil實現IXposedHookLoadPackage介面,複寫handleLoadPackage方法,並替換原有的getTTAd方法,來進行攔截。

public class XposedHookUtil implements IXposedHookLoadPackage {
String class_name = "com.hdc.xposeddemo.MainActivity";
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {

    Class clazz = loadPackageParam.classLoader.loadClass(class_name);
    XposedHelpers.findAndHookMethod(clazz, "getTTAd", new XC_MethodReplacement() {
        @Override
        protected Object replaceHookedMethod(MethodHookParam methodHookParam) throws Throwable {
            return "廣告被攔截了";
        }
    });
}
}

5.在main資料夾下建立資料夾assets,並在assets下面建立xposed_init文字檔案,注意這裡檔名必須是xposed_init。並在xposed_init裡面新增hook工具類的完整包名路徑:com.hdc.xposeddemo.xposed.XposedHookUtil

6.執行apk
點選run app按鈕執行apk,如果android studio 沒有找到夜神模擬器,可能是模擬器還沒有關聯起來。關聯方法:cmd 進入命令視窗,執行
cd C:\Program Files\Nox\bin,注意cd到你的夜神模擬器的安裝路徑,之後執行:nox_adb.exe connect 127.0.0.1:62001
然後AS可以關聯成功,執行apk。

點選載入廣告,這時候顯示廣告載入成功,因為還有使這個xposed模組工作。

7.安裝xposed模組
開啟Xposed框架apk,

點選模組,看到裡面有剛剛編寫的模組,勾選之後重啟:

重啟之後,xposed模組生效,點選載入廣告,顯示廣告被攔截了:

###總結
總的來說此demo也借鑑了許多前人的經驗,至此xposed框架的基本使用已經完成。如有錯誤,歡迎指正。