From 8b71f2f7db953f538f8baf91e637f8a87dd96645 Mon Sep 17 00:00:00 2001 From: jackjintai Date: Mon, 26 Apr 2021 15:02:53 +0800 Subject: [PATCH] modify: [Android]-hook getGpsStatus --- .../classtransformer/CommTransformer.kt | 62 +++++++++---------- .../classtransformer/CommTransformer.kt | 47 +++++++++----- .../kit/gpsmock/GpsMockFragment.java | 52 +++++++++------- 3 files changed, 87 insertions(+), 74 deletions(-) diff --git a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt b/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt index f0074f6f..575c9da5 100644 --- a/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt +++ b/Android/java/buildSrc/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt @@ -44,9 +44,9 @@ class CommTransformer : ClassTransformer { val className = klass.className val superName = klass.formatSuperName - if (className.contains("didihttp")) { - "${context.projectDir.lastPath()}==className===>$className".println() - } +// if (className.contains("didihttp")) { +// "${context.projectDir.lastPath()}==className===>$className".println() +// } //查找DoraemonKitReal&pluginConfig方法并插入指定字节码 if (className == "com.didichuxing.doraemonkit.DoKitReal") { @@ -68,6 +68,22 @@ class CommTransformer : ClassTransformer { //gps字节码操作 if (DoKitExtUtil.commExt.gpsSwitch) { + //系统 gpsStatus hook + klass.methods.forEach { method -> + method.instructions?.iterator()?.asIterable() + ?.filterIsInstance(MethodInsnNode::class.java)?.filter { + it.opcode == INVOKEVIRTUAL && + it.owner == "android/location/LocationManager" && + it.name == "getGpsStatus" && + it.desc == "(Landroid/location/GpsStatus;)Landroid/location/GpsStatus;" + }?.forEach { + "${context.projectDir.lastPath()}->hook LocationManager#getGpsStatus method succeed in : ${className}_${method.name}_${method.desc}".println() + method.instructions.insert( + it, + MethodInsnNode(INVOKESTATIC, "com/didichuxing/doraemonkit/aop/location/GpsStatusUtil", "wrap", "(Landroid/location/GpsStatus;)Landroid/location/GpsStatus;", false) + ) + } + } //插入高德地图定位相关字节码 if (className == "com.amap.api.location.AMapLocationClient") { @@ -97,25 +113,20 @@ class CommTransformer : ClassTransformer { it.name == "getLastKnownLocation" }.let { methodNode -> "${context.projectDir.lastPath()}->hook AMapLocationClient getLastKnownLocation succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println() -// methodNode?.instructions?.clear() -// for (instruction in methodNode!!.instructions) { -//// methodNode.instructions.remove(instruction) -// println("getLastKnownLocation===>${instruction.opcode}") -// } methodNode?.instructions?.insert(createAMapClientLastKnownLocation()) } } //插入高德 地图定位相关字节码 - if (className == "com.amap.api.maps.AMap") { - //设置LocationSource代理 - klass.methods?.find { - it.name == "setLocationSource" - }.let { methodNode -> - "${context.projectDir.lastPath()}->hook amap map LocationSource succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println() - methodNode?.instructions?.insert(createAmapLocationSourceInsnList()) - } - } +// if (className == "com.amap.api.maps.AMap") { +// //设置LocationSource代理 +// klass.methods?.find { +// it.name == "setLocationSource" +// }.let { methodNode -> +// "${context.projectDir.lastPath()}->hook amap map LocationSource succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println() +// methodNode?.instructions?.insert(createAmapLocationSourceInsnList()) +// } +// } //插入高德地图导航相关字节码 // if (className == "com.amap.api.navi.AMapNavi") { @@ -302,22 +313,7 @@ class CommTransformer : ClassTransformer { } - // gpsStatus hook - klass.methods.forEach { method -> - method.instructions?.iterator()?.asIterable() - ?.filterIsInstance(MethodInsnNode::class.java)?.filter { - it.opcode == INVOKEVIRTUAL && - it.owner == "android/location/LocationManager" && - it.name == "getGpsStatus" && - it.desc == "(Landroid/location/GpsStatus;)Landroid/location/GpsStatus;" - }?.forEach { - "${context.projectDir.lastPath()}->hook LocationManager#getGpsStatus method succeed in : ${className}_${method.name}_${method.desc}".println() - method.instructions.insert( - it, - MethodInsnNode(INVOKESTATIC, "com/didichuxing/doraemonkit/aop/location/GpsStatusUtil", "wrap", "(Landroid/location/GpsStatus;)Landroid/location/GpsStatus;", false) - ) - } - } + //hook Androidx的ComponentActivity if (className != "com.didichuxing.doraemonkit.aop.mc.DoKitProxyActivity" && superName == "android.app.Activity") { diff --git a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt index ebb0a4c7..575c9da5 100644 --- a/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt +++ b/Android/java/doraemonkit-plugin/src/main/kotlin/com/didichuxing/doraemonkit/plugin/classtransformer/CommTransformer.kt @@ -44,9 +44,9 @@ class CommTransformer : ClassTransformer { val className = klass.className val superName = klass.formatSuperName - if (className.contains("didihttp")) { - "${context.projectDir.lastPath()}==className===>$className".println() - } +// if (className.contains("didihttp")) { +// "${context.projectDir.lastPath()}==className===>$className".println() +// } //查找DoraemonKitReal&pluginConfig方法并插入指定字节码 if (className == "com.didichuxing.doraemonkit.DoKitReal") { @@ -68,6 +68,22 @@ class CommTransformer : ClassTransformer { //gps字节码操作 if (DoKitExtUtil.commExt.gpsSwitch) { + //系统 gpsStatus hook + klass.methods.forEach { method -> + method.instructions?.iterator()?.asIterable() + ?.filterIsInstance(MethodInsnNode::class.java)?.filter { + it.opcode == INVOKEVIRTUAL && + it.owner == "android/location/LocationManager" && + it.name == "getGpsStatus" && + it.desc == "(Landroid/location/GpsStatus;)Landroid/location/GpsStatus;" + }?.forEach { + "${context.projectDir.lastPath()}->hook LocationManager#getGpsStatus method succeed in : ${className}_${method.name}_${method.desc}".println() + method.instructions.insert( + it, + MethodInsnNode(INVOKESTATIC, "com/didichuxing/doraemonkit/aop/location/GpsStatusUtil", "wrap", "(Landroid/location/GpsStatus;)Landroid/location/GpsStatus;", false) + ) + } + } //插入高德地图定位相关字节码 if (className == "com.amap.api.location.AMapLocationClient") { @@ -97,25 +113,20 @@ class CommTransformer : ClassTransformer { it.name == "getLastKnownLocation" }.let { methodNode -> "${context.projectDir.lastPath()}->hook AMapLocationClient getLastKnownLocation succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println() -// methodNode?.instructions?.clear() -// for (instruction in methodNode!!.instructions) { -//// methodNode.instructions.remove(instruction) -// println("getLastKnownLocation===>${instruction.opcode}") -// } methodNode?.instructions?.insert(createAMapClientLastKnownLocation()) } } //插入高德 地图定位相关字节码 - if (className == "com.amap.api.maps.AMap") { - //设置LocationSource代理 - klass.methods?.find { - it.name == "setLocationSource" - }.let { methodNode -> - "${context.projectDir.lastPath()}->hook amap map LocationSource succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println() - methodNode?.instructions?.insert(createAmapLocationSourceInsnList()) - } - } +// if (className == "com.amap.api.maps.AMap") { +// //设置LocationSource代理 +// klass.methods?.find { +// it.name == "setLocationSource" +// }.let { methodNode -> +// "${context.projectDir.lastPath()}->hook amap map LocationSource succeed: ${className}_${methodNode?.name}_${methodNode?.desc}".println() +// methodNode?.instructions?.insert(createAmapLocationSourceInsnList()) +// } +// } //插入高德地图导航相关字节码 // if (className == "com.amap.api.navi.AMapNavi") { @@ -302,6 +313,8 @@ class CommTransformer : ClassTransformer { } + + //hook Androidx的ComponentActivity if (className != "com.didichuxing.doraemonkit.aop.mc.DoKitProxyActivity" && superName == "android.app.Activity") { createComponentActivitySuperActivityImpl(klass) diff --git a/Android/java/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/gpsmock/GpsMockFragment.java b/Android/java/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/gpsmock/GpsMockFragment.java index 36b8ce11..4d7d060e 100644 --- a/Android/java/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/gpsmock/GpsMockFragment.java +++ b/Android/java/doraemonkit/src/main/java/com/didichuxing/doraemonkit/kit/gpsmock/GpsMockFragment.java @@ -81,30 +81,35 @@ public class GpsMockFragment extends BaseFragment implements SettingItemAdapter. mIvSearch.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - if (!checkInput()) { - return; - } - String strLongLat = mEdLongLat.getText().toString(); - String[] longAndLat = strLongLat.split(" "); - double longitude, latitude; - try { - longitude = Double.valueOf(longAndLat[0]); - latitude = Double.valueOf(longAndLat[1]); - } catch (Exception e) { - ToastUtils.showShort("经纬度必须为数字"); - return; - } - - GpsMockManager.getInstance().mockLocationWithNotify(latitude, longitude); - GpsMockConfig.saveMockLocation(new LatLng(latitude, longitude)); - //刷新地图 - String url = String.format("javascript:updateLocation(%s,%s)", latitude, longitude); - mWebView.loadUrl(url); - ToastUtils.showShort(getString(R.string.dk_gps_location_change_toast, "" + longitude, "" + latitude)); + performMock(); } }); } + + private void performMock() { + if (!checkInput()) { + return; + } + String strLongLat = mEdLongLat.getText().toString(); + String[] longAndLat = strLongLat.split(" "); + double longitude, latitude; + try { + longitude = Double.parseDouble(longAndLat[0]); + latitude = Double.parseDouble(longAndLat[1]); + } catch (Exception e) { + ToastUtils.showShort("经纬度必须为数字"); + return; + } + + GpsMockManager.getInstance().mockLocationWithNotify(latitude, longitude); + GpsMockConfig.saveMockLocation(new LatLng(latitude, longitude)); + //刷新地图 + String url = String.format("javascript:updateLocation(%s,%s)", latitude, longitude); + mWebView.loadUrl(url); + ToastUtils.showShort(getString(R.string.dk_gps_location_change_toast, "" + longitude, "" + latitude)); + } + private boolean checkInput() { String strLongLat = mEdLongLat.getText().toString(); if (TextUtils.isEmpty(strLongLat)) { @@ -125,8 +130,8 @@ public class GpsMockFragment extends BaseFragment implements SettingItemAdapter. } double longitude, latitude; try { - longitude = Double.valueOf(longAndLat[0]); - latitude = Double.valueOf(longAndLat[1]); + longitude = Double.parseDouble(longAndLat[0]); + latitude = Double.parseDouble(longAndLat[1]); } catch (Exception e) { ToastUtils.showShort("经纬度必须为数字"); return false; @@ -171,6 +176,7 @@ public class GpsMockFragment extends BaseFragment implements SettingItemAdapter. public void onSettingItemSwitch(View view, SettingItem data, boolean on) { if (data.desc == R.string.dk_gpsmock_open) { if (on) { + performMock(); GpsMockManager.getInstance().startMock(); } else { GpsMockManager.getInstance().stopMock(); @@ -180,8 +186,6 @@ public class GpsMockFragment extends BaseFragment implements SettingItemAdapter. } - - @Override protected int onRequestLayout() { return R.layout.dk_fragment_gps_mock; -- GitLab