主要類介紹
IXposedHookLoadPackage.java 接口
@Override public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { }
方法:handleLoadPackage,在加載應用程序包的時候,執行這個方法
參數:XC_LoadPackage.LoadPackageParam,這個參數包含了加載的應用程序的一些基本信息
XposedHelpers.java
XposedHelpers.findAndHookMethod(Class<?> clazz, String methodName, Object... parameterTypesAndCallback) { @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { { @Override protected Object replaceHookedMethod(MethodHookParam param) throws Throwable { return object ; } }); } });
方法:findAndHookMethod,是一個輔助方法,可以通過靜態導入使用
參數:
第一個參數爲包名.類名;
第二個參數固定爲lpparam.classLoader
第三個參數爲方法名(要被hook的函數名)
第四,五…個參數爲函數參數(用類型.class表示)
最後一個參數爲new XC_MethodHook() {…}XposedBridge.java
public static synchronized void log(String text) { Log.i("Xposed", text); if(logWriter != null) { logWriter.println(text); logWriter.flush(); } }
方法:log,顧名思義是日誌打印的方法。輸出到標準的logcat以及寫入到/data/xposed/debug.log 這個文件中
XposedBridge.hookAllMethods(Class<?> hookClass, String methodName, XC_MethodHook callback) { });
XposedBridge.hookAllConstructors(Class<?> hookClass,XC_MethodHook callback) { });
方法:hookAllMethods/hookAllConstructors,用於hook某個類中所有方法或者構造函數
參數:
第一個參數爲包名.類名;
第二個參數,方法名(hookAllConstructors無此參數)
第三個參數,方法回調
Hook
在Xposed框架,最基本的核心就是對方法的hook,所以尋找目標的正確類和方法名就變得尤爲重要。
- 針對系統應用,可以通過google開放的源碼進行查看相應的類和方法
- 針對第三方應用,可以通過反編譯目標程序,查看目標源碼。(常見的反編譯工具可以百度上搜一搜)
上一篇文章中提到的就是對於系統的方法進行劫持Hook傳送門
接下來我們來hook一下第三方的應用
Hook第三方應用
demo代碼
public class MainActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
TextView tvName= (TextView) findViewById(R.id.tv_name);
TextView tvInfo= (TextView) findViewById(R.id.tv_info);
Test001 test001=new Test001("我是車","我是有四個輪子的高檔車");
tvName.setText(test001.getName());
tvInfo.setText(test001.getDes());
}
正常顯示內容
hook內容,hook Test001 這個類的getDes方法
public class XModuleTest001 implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
//將包名不是com.ycss.test_001的應用剔除
if (!loadPackageParam.packageName.equals("com.ycss.test_001")) {
return;
}
XposedBridge.log("Loaded app: " + loadPackageParam.packageName);
XposedHelpers.findAndHookMethod("com.ycss.test_001.Test001", loadPackageParam.classLoader, "getDes", new XC_MethodHook() {
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
String str =(String)param.getResult();
XposedBridge.log("劫持後返回的內容" + (String)param.getResult());
param.setResult("我的輪子已經被hook了,成破車了");
}
});
}
}
效果圖如下