diff --git a/headwolf/.idea/codeStyles/Project.xml b/headwolf/.idea/codeStyles/Project.xml
new file mode 100644
index 0000000..681f41a
--- /dev/null
+++ b/headwolf/.idea/codeStyles/Project.xml
@@ -0,0 +1,116 @@
+
+
+
+
+
+
+
+
+
+
+
+
+ xmlns:android
+
+ ^$
+
+
+
+
+
+
+
+
+ xmlns:.*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*:id
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ .*:name
+
+ http://schemas.android.com/apk/res/android
+
+
+
+
+
+
+
+
+ name
+
+ ^$
+
+
+
+
+
+
+
+
+ style
+
+ ^$
+
+
+
+
+
+
+
+
+ .*
+
+ ^$
+
+
+ BY_NAME
+
+
+
+
+
+
+ .*
+
+ http://schemas.android.com/apk/res/android
+
+
+ ANDROID_ATTRIBUTE_ORDER
+
+
+
+
+
+
+ .*
+
+ .*
+
+
+ BY_NAME
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/headwolf/app/src/main/assets/config b/headwolf/app/src/main/assets/config
index 4bac3d8..d78d6aa 100644
--- a/headwolf/app/src/main/assets/config
+++ b/headwolf/app/src/main/assets/config
@@ -1,4 +1,6 @@
remote_server=192.144.152.23
package_name=com.lateautumn4lin.headwolf
-package_kuaishou=com.smile.gifmaker
-package_pdd=com.xunmeng.pinduoduo
\ No newline at end of file
+group_pdd.name=com.xunmeng.pinduoduo
+group_pdd.home=com.xunmeng.pinduoduo.ui.activity.HomeActivity
+group_kuaishou.name=com.smile.gifmaker
+group_kuaishou.home=com.yxcorp.gifshow.HomeActivity
\ No newline at end of file
diff --git a/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/Config.java b/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/Config.java
index 547a261..68fa5e0 100644
--- a/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/Config.java
+++ b/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/Config.java
@@ -7,6 +7,8 @@ package com.lateautumn4lin.headwolf;
* @date 2020/9/10 13:40
*/
+import com.google.gson.Gson;
+import com.google.gson.JsonObject;
import com.lateautumn4lin.headwolf.commons.Logger;
import com.lateautumn4lin.headwolf.handlers.KuaishouHandler;
import com.lateautumn4lin.headwolf.utils.PropertiesAssistant;
@@ -15,7 +17,6 @@ import com.virjar.sekiro.api.SekiroRequestHandler;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
-import java.util.Properties;
import java.util.UUID;
import static java.util.Arrays.asList;
@@ -25,7 +26,8 @@ import static java.util.Arrays.asList;
* The type Config.
*/
public class Config {
- private static Properties propertiesAssistant = PropertiesAssistant.getProperties();
+ private static HashMap propertiesAssistant = PropertiesAssistant.getJsonProperties();
+ // 预先把handlers文件夹下面的类实现
private static List handlers = asList(
(SekiroRequestHandler) new KuaishouHandler()
);
@@ -44,7 +46,7 @@ public class Config {
/**
* The Groups.
*/
- static private HashMap groups = GetAllPackageGroups();
+ static private HashMap> groups = GetAllPackageGroups();
/**
* Get package name string.
@@ -52,8 +54,7 @@ public class Config {
* @return the string
*/
public static String GetPackageName() {
- Properties propertiesAssistant = PropertiesAssistant.getProperties();
- return propertiesAssistant.getProperty("package_name");
+ return propertiesAssistant.get("package_name").toString();
}
@@ -63,7 +64,7 @@ public class Config {
* @return the remote server
*/
public static String getRemoteServer() {
- return propertiesAssistant.getProperty("remote_server");
+ return propertiesAssistant.get("remote_server").toString();
}
/**
@@ -84,13 +85,18 @@ public class Config {
*
* @return the hash map
*/
- public static HashMap GetAllPackageGroups() {
- Properties propertiesAssistant = PropertiesAssistant.getProperties();
- HashMap all_package_groups = new HashMap();
+ public static HashMap> GetAllPackageGroups() {
+ HashMap> all_package_groups = new HashMap>();
try {
- for (String name : propertiesAssistant.stringPropertyNames()) {
- if (name.contains("package_") ^ name.contains("name")) {
- all_package_groups.put(propertiesAssistant.getProperty(name), name);
+ for (Object group : propertiesAssistant.keySet()) {
+ if (((String) group).contains("group")) {
+ HashMap same_group = new HashMap();
+ JsonObject GroupInfo = (new Gson()).toJsonTree(propertiesAssistant.get(group)).getAsJsonObject();
+ String name = GroupInfo.get("name").toString().replace("\"", "");
+ String home = GroupInfo.get("home").toString().replace("\"", "");
+ same_group.put("home", home);
+ same_group.put("group", group.toString());
+ all_package_groups.put(name, same_group);
}
}
} catch (Exception e) {
@@ -107,7 +113,17 @@ public class Config {
* @return the group
*/
public static String GetGroup(String type_name) {
- return groups.get(type_name);
+ return groups.get(type_name).get("group");
+ }
+
+ /**
+ * Get home string.
+ *
+ * @param type_name the type name
+ * @return the string
+ */
+ public static String GetHome(String type_name) {
+ return groups.get(type_name).get("home");
}
/**
@@ -116,13 +132,10 @@ public class Config {
* @return the string
*/
public static List GetHookPackages() {
- Properties propertiesAssistant = PropertiesAssistant.getProperties();
List inner_hook_packages = new ArrayList();
try {
- for (String name : propertiesAssistant.stringPropertyNames()) {
- if (name.contains("package_") ^ name.contains("name")) {
- inner_hook_packages.add(propertiesAssistant.getProperty(name));
- }
+ for (String name : groups.keySet()) {
+ inner_hook_packages.add(name);
}
} catch (Exception e) {
Logger.loge(e.toString());
diff --git a/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/MainActivity.java b/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/MainActivity.java
index 839e4cf..b4e9987 100644
--- a/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/MainActivity.java
+++ b/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/MainActivity.java
@@ -5,7 +5,6 @@ import androidx.appcompat.app.AppCompatActivity;
import android.os.Bundle;
import com.lateautumn4lin.headwolf.commons.Logger;
-import com.tencent.mmkv.MMKV;
/**
@@ -18,15 +17,5 @@ public class MainActivity extends AppCompatActivity {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Logger.logi("StartUp MainActivity");
-// try {
-// String rootDir = MMKV.initialize("/data/user/0/com.lateautumn4lin.headwolf/files/mmkv");
-// MMKV kv = MMKV.mmkvWithID("test", MMKV.MULTI_PROCESS_MODE);
-// Logger.logi("mmkv root: " + rootDir);
-// kv.encode("string", "Hello from mmkv");
-// String str = kv.decodeString("string");
-// Logger.logi("Get MMKV:" + str);
-// } catch (Exception e) {
-// Logger.loge(e.toString());
-// }
}
}
\ No newline at end of file
diff --git a/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/entry/BaseEntry.java b/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/entry/BaseEntry.java
index 0f604e3..8f23b1a 100644
--- a/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/entry/BaseEntry.java
+++ b/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/entry/BaseEntry.java
@@ -16,6 +16,7 @@ import com.lateautumn4lin.headwolf.commons.Logger;
import java.io.File;
import java.lang.reflect.Method;
+import java.util.ArrayList;
import java.util.List;
import dalvik.system.PathClassLoader;
@@ -29,21 +30,18 @@ import de.robv.android.xposed.callbacks.XC_LoadPackage;
* The type Base entry. 第一层Hook入口
*/
public class BaseEntry implements IXposedHookLoadPackage {
- private String modulePackage = null;
- private static List hookPackages = null;
+ private String modulePackage = "com.lateautumn4lin.headwolf";
+ private static List hookPackages = new ArrayList();
private final String handleHookClass = RealEntry.class.getName();
private final String handleHookMethod = "handleLoadPackage";
+ static {
+ hookPackages.add("com.smile.gifmaker");
+ }
+
@Override
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
try {
-// 延迟初始化静态变量
- if (modulePackage == null) {
- modulePackage = Config.GetPackageName();
- }
- if (hookPackages == null) {
- hookPackages = Config.GetHookPackages();
- }
// 包含配置文件中配置的包名则进入真正Hook逻辑
if (hookPackages.contains(loadPackageParam.packageName)) {
try {
diff --git a/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/entry/RealEntry.java b/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/entry/RealEntry.java
index d2f358f..cb84bcd 100644
--- a/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/entry/RealEntry.java
+++ b/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/entry/RealEntry.java
@@ -20,6 +20,7 @@ import de.robv.android.xposed.IXposedHookLoadPackage;
import de.robv.android.xposed.XposedHelpers;
import de.robv.android.xposed.callbacks.XC_LoadPackage;
+
/**
* The type Real entry.
*/
@@ -27,6 +28,8 @@ public class RealEntry implements IXposedHookLoadPackage {
@Override
public void handleLoadPackage(final XC_LoadPackage.LoadPackageParam loadPackageParam) throws Throwable {
try {
+// 测试
+ Logger.logi("5555");
Logger.logi(String.format("Begin Real Hook Logic About:%s", loadPackageParam.packageName));
// step1:获取context
Context context = (Context) XposedHelpers.callMethod(
@@ -39,11 +42,13 @@ public class RealEntry implements IXposedHookLoadPackage {
),
"getSystemContext"
);
-// step2:获取包名对应的需要注册的handler以及home_class
- Class HomeClass = loadPackageParam.classLoader.loadClass("com.yxcorp.gifshow.HomeActivity");
HashMap associate_handlers = ClassesReaderAssistant.reader(context, loadPackageParam.packageName);
-// step3:由注册类进行handler注册
- Register.GroupRegister(loadPackageParam, HomeClass, associate_handlers);
+// step2:由注册类进行handler注册
+ if (Register.GroupRegister(loadPackageParam, associate_handlers)) {
+ Logger.logi(String.format("Real Hook Logic About:%s Success", loadPackageParam.packageName));
+ } else {
+ Logger.logi(String.format("Real Hook Logic About:%s Error", loadPackageParam.packageName));
+ }
} catch (Exception e) {
Logger.loge(e.toString());
}
diff --git a/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/initialization/Register.java b/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/initialization/Register.java
index 136b8df..2009397 100644
--- a/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/initialization/Register.java
+++ b/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/initialization/Register.java
@@ -29,14 +29,14 @@ public class Register {
* Base register boolean.
*
* @param loadPackageParam the load package param
- * @param home_class the home class
* @param associate_handlers the associate handlers
* @return the boolean
*/
- public static Boolean GroupRegister(final XC_LoadPackage.LoadPackageParam loadPackageParam, Class home_class, final HashMap associate_handlers) {
- final String group_name = Config.GetGroup(loadPackageParam.packageName);
+ public static Boolean GroupRegister(final XC_LoadPackage.LoadPackageParam loadPackageParam, final HashMap associate_handlers) {
try {
- XposedHelpers.findAndHookMethod(home_class, "onCreate", Bundle.class, new XC_MethodHook() {
+ Class HomeClass = loadPackageParam.classLoader.loadClass(Config.GetHome(loadPackageParam.packageName));
+ final String group_name = Config.GetGroup(loadPackageParam.packageName);
+ XposedHelpers.findAndHookMethod(HomeClass, "onCreate", Bundle.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
Logger.logi(String.format("Group Register:%s Begin ClientId:%s", group_name, Config.getClientId()));
diff --git a/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/utils/PropertiesAssistant.java b/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/utils/PropertiesAssistant.java
index a8251b9..63fd936 100644
--- a/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/utils/PropertiesAssistant.java
+++ b/headwolf/app/src/main/java/com/lateautumn4lin/headwolf/utils/PropertiesAssistant.java
@@ -1,14 +1,23 @@
package com.lateautumn4lin.headwolf.utils;
+import com.google.gson.Gson;
+import com.google.gson.JsonArray;
+import com.google.gson.JsonObject;
+import com.google.gson.JsonPrimitive;
import com.lateautumn4lin.headwolf.commons.Logger;
import java.io.InputStream;
+import java.util.HashMap;
import java.util.Properties;
+import java.util.regex.Pattern;
/**
* The type Properties assistant.
*/
public class PropertiesAssistant {
+ private static final Pattern floatPattern = Pattern.compile("^-?[0-9]+(\\.[0-9]+)?$");
+ private static final Pattern intPattern = Pattern.compile("^-?[0-9]+$");
+
/**
* Gets properties.
*
@@ -24,4 +33,71 @@ public class PropertiesAssistant {
}
return props;
}
+
+ /**
+ * Gets json properties.
+ *
+ * @return the json properties
+ */
+ public static HashMap getJsonProperties() {
+ Properties properties = new Properties();
+ try {
+ InputStream in = PropertiesAssistant.class.getResourceAsStream("/assets/config");
+ properties.load(in);
+ } catch (Exception e) {
+ Logger.loge(e.toString());
+ }
+ JsonObject json = new JsonObject();
+ for (Object key : properties.keySet()) {
+
+ String baseKey = key.toString();
+ String[] splittedKey = baseKey.split("\\.");
+
+ JsonObject nestedObject = json;
+
+ for (int i = 0; i < splittedKey.length - 1; ++i) {
+ if (!json.has(splittedKey[i])) {
+ json.add(splittedKey[i], new JsonObject());
+ }
+ nestedObject = json.getAsJsonObject(splittedKey[i]);
+ }
+
+ String finalKeyElement = splittedKey[splittedKey.length - 1];
+
+ String value = properties.getProperty(baseKey);
+
+ String[] splitedValue = value.split("\\,");
+
+ if (splitedValue.length == 1) {
+
+ if (value.toLowerCase().equals("true") || value.toLowerCase().equals("false")) {
+ nestedObject.addProperty(finalKeyElement, Boolean.parseBoolean(value));
+ } else if (intPattern.matcher(value).matches()) {
+ nestedObject.addProperty(finalKeyElement, Integer.parseInt(value));
+ } else if (floatPattern.matcher(value).matches()) {
+ nestedObject.addProperty(finalKeyElement, Float.parseFloat(value));
+ } else {
+ nestedObject.addProperty(finalKeyElement, value);
+ }
+
+ } else {
+ JsonArray elementArray = new JsonArray();
+ for (String val : splitedValue) {
+
+ if (val.toLowerCase().equals("true") || val.toLowerCase().equals("false")) {
+ elementArray.add(new JsonPrimitive(Boolean.parseBoolean(val)));
+ } else if (intPattern.matcher(val).matches()) {
+ elementArray.add(new JsonPrimitive(Integer.parseInt(val)));
+ } else if (floatPattern.matcher(val).matches()) {
+ elementArray.add(new JsonPrimitive(Float.parseFloat(val)));
+ } else {
+ elementArray.add(new JsonPrimitive(val));
+ }
+ }
+ nestedObject.add(finalKeyElement, elementArray);
+ }
+
+ }
+ return new Gson().fromJson(json, HashMap.class);
+ }
}