提交 8b71f2f7 编写于 作者: J jackjintai

modify:

[Android]-hook getGpsStatus
上级 fbe146c0
......@@ -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") {
......
......@@ -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)
......
......@@ -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;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册