开发文章

Hook实现Android 微信,陌陌 ,探探位置模拟

 最近需要对微信,陌陌等程序进行位置模拟 实现世界各地发朋友圈,搜索附近人的功能,本着站在巨人肩膀上的原则 爱网上搜索一番。  也找到一些 代码和文章,但是代码大都雷同而且都有一个弊端 比如说 微信 对目标函数实现hook之后第一次打开微信 第一次定位是可以改变的   但是 我如果想更换地址的话 就需要重启手机了,重新加载hook了,试了很多次都是这样满足不了需求。  为了改进这个地方我们从gps定义的源代码流程开始看寻找hook系统函数的突破口 http://www.ibm.com/developerworks/cn/opensource/os-cn-android-location/  我也是看完之后才找到hook的地方 LocationMangerService  这个类  
复制内容到剪贴板
  1. @Override  
  2.     public void reportLocation(Location location, boolean passive) {  
  3.         checkCallerIsProvider(); //检测权限和uid  
  4.   
  5.         if (!location.isComplete()) {  
  6.             Log.w(TAG, "Dropping incomplete location: " + location);  
  7.             return;  
  8.         }  
  9.             //发送位置信息  
  10.         mLocationHandler.removeMessages(MSG_LOCATION_CHANGED, location);  
  11.         Message m = Message.obtain(mLocationHandler, MSG_LOCATION_CHANGED, location);  
  12.         m.arg1 = (passive ? 1 : 0);  
  13.         mLocationHandler.sendMessageAtFrontOfQueue(m);  
  14.     }  
那么我们可以hook掉这个location的参数 修改为我们想要定位的地方就可以实现效果了, 
复制内容到剪贴板
  1. XposedHelpers.findAndHookMethod("com.android.server.LocationManagerService", lpparam.classLoader, "reportLocation", Location.classboolean.classnew XC_MethodHook() {  
  2.           @Override  
  3.           protected void afterHookedMethod(MethodHookParam param) throws Throwable {  
  4.               super.afterHookedMethod(param);  
  5.               Location location = (Location) param.args[0];  
  6.               XposedBridge.log("实际 系统 经度"+location.getLatitude() +" 系统 纬度"+location.getLongitude() +"系统 加速度 "+location.getAccuracy());  
  7.               XSharedPreferences xsp =new XSharedPreferences("com.markypq.gpshook","markypq");  
  8.              if (xsp.getBoolean("enableHook",true)){  
  9.                  double latitude = Double.valueOf(xsp.getString("lan","117.536246"))+ (doublenew Random().nextInt(1000) / 1000000 ;  
  10.                  double longtitude = Double.valueOf(xsp.getString("lon","36.681752"))+ (doublenew Random().nextInt(1000) / 1000000 ;  
  11.                  location.setLongitude(longtitude);  
  12.                  location.setLatitude(latitude);  
  13.                  XposedBridge.log("hook 系统 经度"+location.getLatitude() +" 系统 纬度"+location.getLongitude() +"系统 加速度 "+location.getAccuracy());  
  14.              }  
  15.   
  16.           }  
  17.       });  
如果我想主动调用这个函数 必须要得到这个LocationMangerService 的对象 获取这个对象可以通过hook LocationManager 的构造函数获取, 
复制内容到剪贴板
  1. XposedBridge.hookAllConstructors(LocationManager.class,new XC_MethodHook() {  
  2.            @Override  
  3.            protected void afterHookedMethod(MethodHookParam param) throws Throwable {  
  4.                super.afterHookedMethod(param);  
  5.                if (param.args.length==2) {  
  6.                    Context context = (Context) param.args[0]; //这里的 context  
  7.                    XposedBridge.log(" 对 "+getProgramNameByPackageName(context)+" 模拟位置");  
  8.                    //把权限的检查 hook掉  
  9.                    XposedHelpers.findAndHookMethod(context.getClass(), "checkCallingOrSelfPermission", String.classnew XC_MethodHook() {  
  10.                        @Override  
  11.                        protected void afterHookedMethod(MethodHookParam param) throws Throwable {  
  12.                            super.afterHookedMethod(param);  
  13.                            if (param.args[0].toString().contains("INSTALL_LOCATION_PROVIDER")){  
  14.                                param.setResult(PackageManager.PERMISSION_GRANTED);  
  15.                            }  
  16.                        }  
  17.                    });  
  18.                    XposedBridge.log("LocationManager : " + context.getPackageName() + " class:= " + param.args[1].getClass().toString());  
  19.                  //获取到  locationManagerService 主动调用 对象的 reportLocation 方法  可以去模拟提供位置信息  
  20.                    //这里代码中并没有涉及到主动调用  
  21.                  Object   locationManagerService = param.args[1];  
  22.                }  
  23.            }  
  24.        });  

主动调用这个函数.png

Hook实现Android 微信,陌陌 ,探探位置模拟.png

当然还需要hook一些其他的辅助函数 ,这些函数都可以在 Android studio 中看到Java的代码 我们就无需过多解释了 上 源代码连接 https://pan.baidu.com/s/1bpINjIZ 密码t333
不好意思 gitHub一直没传上去 源码放百度云了

 

感谢 Mark_YPQ 支持 磐实编程网 原文地址:
blog.csdn.net/u012889434/article/details/61921933

文章信息

发布时间:2017-03-18

作者:Mark_YPQ

发布者:aquwcw

浏览次数: