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的,很多應用無法執行,所以選擇了夜神模擬器。下載地址:
下載完成後直接拖到模擬器上安裝,安裝之後開啟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框架的基本使用已經完成。如有錯誤,歡迎指正。