From d3b397a0e2017aee7bb4899005a412a9fbc6e33c Mon Sep 17 00:00:00 2001 From: lateautumn4lin Date: Tue, 15 Sep 2020 18:50:13 +0800 Subject: [PATCH] =?UTF-8?q?feat=EF=BC=9A=E5=A2=9E=E5=8A=A0=E9=80=9A?= =?UTF-8?q?=E8=BF=87=E4=BB=8E=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E6=8C=87?= =?UTF-8?q?=E5=AE=9Ahook=E5=8C=85=E5=90=8D=E5=88=97=E8=A1=A8=E7=9A=84?= =?UTF-8?q?=E5=8A=9F=E8=83=BD=EF=BC=8C=E8=B7=9D=E7=A6=BB=E8=87=AA=E5=8A=A8?= =?UTF-8?q?=E5=8C=96=E7=9A=84=E9=81=93=E8=B7=AF=E5=8F=88=E8=BF=9B=E4=BA=86?= =?UTF-8?q?=E4=B8=80=E6=AD=A5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 2 +- .../headwolf/entry/BaseEntry.java | 58 +++++++++++++++++-- .../headwolf/entry/RealEntry.java | 2 +- 3 files changed, 54 insertions(+), 8 deletions(-) diff --git a/README.md b/README.md index 0b46bf4..da600e3 100644 --- a/README.md +++ b/README.md @@ -92,7 +92,7 @@ step3: run the test project E.g kuaishou ## Usage -**step1:** 在源码中加入hook app的包名,由于技术lj,没有能够实现自动加载配置文件、后续实现 +~~**step1:** 在源码中加入hook app的包名,由于技术lj,没有能够实现自动加载配置文件、后续实现~~ >路径:com.lateautumn4lin.headwolf.entry.BaseEntry diff --git a/app/src/main/java/com/lateautumn4lin/headwolf/entry/BaseEntry.java b/app/src/main/java/com/lateautumn4lin/headwolf/entry/BaseEntry.java index 59949b8..b496cdf 100644 --- a/app/src/main/java/com/lateautumn4lin/headwolf/entry/BaseEntry.java +++ b/app/src/main/java/com/lateautumn4lin/headwolf/entry/BaseEntry.java @@ -14,7 +14,10 @@ import android.content.pm.PackageManager; import com.lateautumn4lin.headwolf.MyApplication; import com.lateautumn4lin.headwolf.commons.Logger; +import java.io.BufferedReader; import java.io.File; +import java.io.InputStream; +import java.io.InputStreamReader; import java.lang.reflect.Method; import java.util.ArrayList; import java.util.List; @@ -22,6 +25,8 @@ import java.util.concurrent.ArrayBlockingQueue; import java.util.concurrent.BlockingQueue; import java.util.concurrent.ThreadPoolExecutor; import java.util.concurrent.TimeUnit; +import java.util.zip.ZipEntry; +import java.util.zip.ZipFile; import dalvik.system.PathClassLoader; import de.robv.android.xposed.IXposedHookLoadPackage; @@ -35,7 +40,7 @@ import de.robv.android.xposed.callbacks.XC_LoadPackage; */ public class BaseEntry implements IXposedHookLoadPackage { private static String modulePackage = MyApplication.class.getPackage().getName(); - private static List hookPackages = new ArrayList(); + private static List hookPackages = null; private final String handleHookClass = RealEntry.class.getName(); private final String handleHookMethod = "handleLoadPackage"; private static BlockingQueue blockingQueue = new ArrayBlockingQueue<>(30); @@ -44,15 +49,27 @@ public class BaseEntry implements IXposedHookLoadPackage { */ public static ThreadPoolExecutor threadPoolExecutor = new ThreadPoolExecutor(50, 50, 1, TimeUnit.MINUTES, blockingQueue); - static { - hookPackages.add("com.smile.gifmaker"); - } - @Override public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { try { +// 根据配置文件设置需要hook的包名 + try { + Context context = (Context) XposedHelpers.callMethod( + XposedHelpers.callStaticMethod( + XposedHelpers.findClass( + "android.app.ActivityThread", + loadPackageParam.classLoader + ), + "currentActivityThread" + ), + "getSystemContext" + ); + setNeedHookPackage(context); + } catch (Exception e) { + Logger.loge(String.format("Set NeedHookPackage Accounding:%s Error", modulePackage)); + } // 包含配置文件中配置的包名则进入真正Hook逻辑 - if (hookPackages.contains(loadPackageParam.packageName)) { + if ((hookPackages != null) && (hookPackages.contains(loadPackageParam.processName)) && (!loadPackageParam.processName.equals(modulePackage))) { try { XposedHelpers.findAndHookMethod(Application.class, "attach", Context.class, new XC_MethodHook() { @Override @@ -121,4 +138,33 @@ public class BaseEntry implements IXposedHookLoadPackage { return null; } } + + /** + * Sets need hook package. + * + * @param context the context + */ + private void setNeedHookPackage(Context context) { + ArrayList NeedHookPackage = new ArrayList(); + try { + String path = findApkFile(context, modulePackage).toString(); + ZipFile zipFile = new ZipFile(path); + ZipEntry zipEntry = zipFile.getEntry("assets/config"); + InputStream inputStream = zipFile.getInputStream(zipEntry); + InputStreamReader in = new InputStreamReader(inputStream); + BufferedReader br = new BufferedReader(in); + String line; + StringBuilder sb = new StringBuilder(); + while ((line = br.readLine()) != null) { + sb.append(line); + if (line.contains(".name")) { + String[] new_line = line.split("="); + NeedHookPackage.add(new_line[1]); + } + } + hookPackages = NeedHookPackage; + } catch (Exception e) { + Logger.loge(e.toString()); + } + } } diff --git a/app/src/main/java/com/lateautumn4lin/headwolf/entry/RealEntry.java b/app/src/main/java/com/lateautumn4lin/headwolf/entry/RealEntry.java index 8885dc7..22cd1f8 100644 --- a/app/src/main/java/com/lateautumn4lin/headwolf/entry/RealEntry.java +++ b/app/src/main/java/com/lateautumn4lin/headwolf/entry/RealEntry.java @@ -29,7 +29,7 @@ public class RealEntry implements IXposedHookLoadPackage { public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable { try { // 测试 - Logger.logi("999"); + Logger.logi("test"); Logger.logi(String.format("Begin Real Hook Logic About:%s", loadPackageParam.packageName)); // step1:获取context Context context = (Context) XposedHelpers.callMethod(