From 5ca84d87b9b64e4dff735b65e6bd14780c04ce81 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E8=8B=8F?= <1044205037@qq.com> Date: Tue, 10 Nov 2020 10:03:31 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=8D=A2=20hook=20=E7=82=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle | 2 +- rimethelper/build.gradle | 12 +- rimethelper/src/main/AndroidManifest.xml | 11 +- .../java/com/wuxiaosu/rimethelper/Main.java | 2 +- .../rimethelper/activity/MainActivity.java | 2 +- .../rimethelper/hook/LocationHook.java | 119 +++++++----------- 6 files changed, 63 insertions(+), 85 deletions(-) diff --git a/build.gradle b/build.gradle index 83dcb8a..27d0ba0 100644 --- a/build.gradle +++ b/build.gradle @@ -7,7 +7,7 @@ buildscript { jcenter() } dependencies { - classpath 'com.android.tools.build:gradle:3.1.2' + classpath 'com.android.tools.build:gradle:4.1.0' // NOTE: Do not place your application dependencies here; they belong // in the individual module build.gradle files diff --git a/rimethelper/build.gradle b/rimethelper/build.gradle index 4160086..ae729f9 100644 --- a/rimethelper/build.gradle +++ b/rimethelper/build.gradle @@ -1,13 +1,13 @@ apply plugin: 'com.android.application' android { - compileSdkVersion 26 + compileSdkVersion 30 defaultConfig { applicationId "com.wuxiaosu.rimethelper" minSdkVersion 21 targetSdkVersion 23 - versionCode 5 - versionName "1.04" + versionCode 6 + versionName "1.05" } signingConfigs { @@ -50,6 +50,12 @@ android { ] } } + android { + lintOptions { + checkReleaseBuilds false + abortOnError false + } + } } dependencies { diff --git a/rimethelper/src/main/AndroidManifest.xml b/rimethelper/src/main/AndroidManifest.xml index fdec1bc..cfceddf 100644 --- a/rimethelper/src/main/AndroidManifest.xml +++ b/rimethelper/src/main/AndroidManifest.xml @@ -1,5 +1,6 @@ @@ -16,16 +17,17 @@ + android:theme="@style/AppTheme" + tools:targetApi="n"> @@ -60,7 +62,8 @@ + android:value="${AMapKey}" /> + LISTENER_CLASS = new ArrayList<>(); - public void hook(final ClassLoader classLoader) { + public static void hook(final ClassLoader classLoader) { try { - final Class aMapLocationClientClazz = + final Class aMapLocationClientClazz = XposedHelpers.findClass("com.amap.api.location.AMapLocationClient", classLoader); - XposedBridge.hookAllConstructors(aMapLocationClientClazz, new XC_MethodHook() { + XposedBridge.hookAllMethods(aMapLocationClientClazz, "setLocationListener", new XC_MethodHook() { @Override - protected void afterHookedMethod(MethodHookParam param) throws Throwable { - Field[] fields = aMapLocationClientClazz.getDeclaredFields(); - for (Field field : fields) { - Object object = XposedHelpers.getObjectField(param.thisObject, field.getName()); - if (object != null && - !(object.getClass().getName()).equals("com.alibaba.android.rimet.LauncherApplication")) { - Class locationManagerClazz = - XposedHelpers.findClass(object.getClass().getName(), classLoader); - hookLocationManager(locationManagerClazz); + protected void beforeHookedMethod(MethodHookParam param) throws Throwable { + super.beforeHookedMethod(param); + if (param.args.length == 1) { + Class listenerClazz = param.args[0].getClass(); + if (!LISTENER_CLASS.contains(listenerClazz.getName())) { + LISTENER_CLASS.add(listenerClazz.getName()); + XposedBridge.hookAllMethods(listenerClazz, "onLocationChanged", new XC_MethodHook() { + @Override + protected void beforeHookedMethod(MethodHookParam param) throws Throwable { + param.args[0] = fakeAMapLocationObject(param.args[0]); + super.beforeHookedMethod(param); + } + }); } } - super.afterHookedMethod(param); } }); } catch (Error | Exception e) { @@ -60,59 +62,25 @@ protected void afterHookedMethod(MethodHookParam param) throws Throwable { } } - private void reload() { - xsp.reload(); - fakeLocation = xsp.getBoolean("fake_location", false); - fakeLocationTime = xsp.getBoolean("fake_location_time", false); - startTime = xsp.getString("location_start_time", "8:40"); - latitude = xsp.getString("latitude", "39.908692"); - longitude = xsp.getString("longitude", "116.397477"); - } - - - private void hookLocationManager(Class locationManagerClazz) { - try { - //chat location - XposedBridge.hookAllMethods(locationManagerClazz, "setLocationListener", new XC_MethodHook() { - @Override - protected void beforeHookedMethod(MethodHookParam param) throws Throwable { - Class listenerClazz = param.args[0].getClass(); - XposedBridge.hookAllMethods(listenerClazz, "onLocationChanged", new XC_MethodHook() { - @Override - protected void beforeHookedMethod(MethodHookParam param) throws Throwable { - param.args[0] = fakeAMapLocationObject(param.args[0]); - super.beforeHookedMethod(param); - } - }); - super.beforeHookedMethod(param); - } - }); - //web location - Method[] methods = locationManagerClazz.getMethods(); - for (Method method : methods) { - Class[] classes = method.getParameterTypes(); - if (classes.length == 1 && classes[0].getName().equals("com.amap.api.location.AMapLocation")) { - XposedBridge.hookMethod(method, new XC_MethodHook() { - @Override - protected void beforeHookedMethod(MethodHookParam param) throws Throwable { - param.args[0] = fakeAMapLocationObject(param.args[0]); - super.beforeHookedMethod(param); - } - }); - break; - } - } - } catch (Throwable e) { - XposedBridge.log(e); + private static void reload() { + if (sXsp == null) { + sXsp = new XSharedPreferences(BuildConfig.APPLICATION_ID, SettingLabelView.DEFAULT_PREFERENCES_NAME); + sXsp.makeWorldReadable(); } + sXsp.reload(); + sFakeLocation = sXsp.getBoolean("fake_location", false); + sFakeLocationTime = sXsp.getBoolean("fake_location_time", false); + sStartTime = sXsp.getString("location_start_time", "8:40"); + sLatitude = sXsp.getString("latitude", "39.908692"); + sLongitude = sXsp.getString("longitude", "116.397477"); } - private Object fakeAMapLocationObject(Object object) { + private static Object fakeAMapLocationObject(Object object) { reload(); - if (fakeLocation) { - if (!fakeLocationTime || isAfterSetTime(startTime)) { - XposedHelpers.callMethod(object, "setLatitude", Double.valueOf(latitude)); - XposedHelpers.callMethod(object, "setLongitude", Double.valueOf(longitude)); + if (sFakeLocation) { + if (!sFakeLocationTime || isAfterSetTime(sStartTime)) { + XposedHelpers.callMethod(object, "setLatitude", Double.valueOf(sLatitude)); + XposedHelpers.callMethod(object, "setLongitude", Double.valueOf(sLongitude)); } } return object; @@ -124,7 +92,8 @@ private Object fakeAMapLocationObject(Object object) { * @param setTime 01:12 * @return */ - private boolean isAfterSetTime(String setTime) { + @SuppressLint("SimpleDateFormat") + private static boolean isAfterSetTime(String setTime) { SimpleDateFormat sdf = new SimpleDateFormat("HH:mm"); Date date = null; Date now = null;