Xposed框架
Xposed 框架是一門神器,可以在不修改APK的情況下影響程序的運行(修改系統)的框架,在它的基礎上增加一些模塊可以實現各種強大功能。比如自定義狀態欄、數據監控等。
他是GITHUBS上的大rovo89設計的一個針對Android平臺的動態劫持項目。通過替換/system/bin/app_process程序控制zygote進程,使得app_process在啓動過程中會加載XposedBridge.jar這個jar包,從而完成對Zygote進程及其創建的Dalvik虛擬機的劫持。
Zygote
從字面是翻譯過來是 <生物>合子,受精卵
在Android系統中,所有的應用程序進程以及系統服務進程SystemServer都是由Zygote進程孕育(fork)出來的,這受精卵的名稱還真是名副其實。
入門涉及到的東西如下
- xposed installer apk(上官網可以下載)
- 一臺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自己寫的應用,那麼其他的也是同理可得。
本人新手,如果有什麼理解不對的地方,還望指教!謝謝