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。