git鏈接:https://github.com/TheKeyDU/XposedTianFuTongJustJumpToQcCodeActivity/blob/master/README.md
原始是啓動SplashActivity,然後彈出root警告,然後進入主頁頁面。然後點擊掃碼才啓動掃碼的界面:
hook之後:
下面實現過程和失敗過程。
首先使用apktool和dx2jar.jar反編譯安裝包,但是發現加固了的,打開dex文件找不到activity之內的任何信息。放棄反編譯這條路。
然後使用“開發者助手”之內的軟件動態獲取這個界面的activity名字
然後獲得activity名稱就可以開始搞xposed。
接下來跳過xposed的開發環境配置,直接進入hook流程
XposedHelpers.findAndHookMethod(hook的類, hook的方法, 參數.class, new XC_MethodHook()
然後發現找不到這個類,然後又把MethodHookParam的所有的參數都輸出,發現還是找不到這個類。
最後發現現在一般的商業級apk都動態加載dex,然後找到了一種解決方法,hook 他的application。把application搞到之後,搞activity是輕而易舉,同時param.arg[0]就是context參數。有了context,hook方法也成功,現在就是無敵的了。可以對任意apk開始爲所欲爲
貼上全部hook代碼
import android.annotation.SuppressLint;
import android.app.Activity;
import android.app.Application;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.widget.Toast;
import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XC_MethodHook;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
/**
* Created by Administrator on 2020/1/7 11:43
*/
public class TftHook implements IXposedHookLoadPackage {
String 天府通app = "com.chinarainbow.tft";
String 天府通啓動類 = "com.chinarainbow.tft.mvp.ui.activity.SplashActivity";
String 天府通二維碼類 = "com.chinarainbow.tft.mvp.ui.activity.TFTQRActivity";
String 天府通創建 = "onCreate";
@Override
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam lpparam) throws Throwable {
if (lpparam.packageName.equals(天府通app)) {
XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
ClassLoader cl = ((Context) param.args[0]).getClassLoader();
final Context context= (Context) param.args[0];
Class<?> hookclass1 = null;
Class<?> hookclass2 = null;
hookclass1 = cl.loadClass(天府通啓動類);
hookclass2 = cl.loadClass(天府通二維碼類);
final Class<?> finalHookclass = hookclass2;
XposedHelpers.findAndHookMethod(hookclass1, 天府通創建, Bundle.class, new XC_MethodHook() {
@SuppressLint("WrongConstant")
@Override
protected void beforeHookedMethod(MethodHookParam param) throws Throwable {
super.beforeHookedMethod(param);
context.startActivity(new Intent(context, finalHookclass).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK));
Toast.makeText(context,"已直接跳轉到掃碼界面",1000).show();
((Activity) context).finish();
}
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
super.afterHookedMethod(param);
}
});
}
});
}
}
}
最後打包出來,apk居然還有1.6mb。這樣一個沒有界面的apk居然還要1.6mb,我覺得還可以壓縮一下。通過analyze zpk,發現主要是lib中有一些androidx的包。在這個沒有界面的apk中,完全可以刪掉。
去掉所有依賴,和打開混淆
buildTypes {
release {
shrinkResources true
minifyEnabled true
proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro'
}
}
dependencies {
compileOnly 'de.robv.android.xposed:api:82'
compileOnly 'de.robv.android.xposed:api:82:sources'
}
over,17kb。