欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Hook实现Android 微信、陌陌 、探探位置模拟(附源码下载)

程序员文章站 2023-11-17 12:30:34
hook实现android 微信、陌陌 、探探位置模拟  最近需要对微信,陌陌等程序进行位置模拟 实现世界各地发朋友圈,搜索附近人的功能,本着站在巨人肩膀上的原...

hook实现android 微信、陌陌 、探探位置模拟

 最近需要对微信,陌陌等程序进行位置模拟 实现世界各地发朋友圈,搜索附近人的功能,本着站在巨人肩膀上的原则 爱网上搜索一番。

 也找到一些 代码和文章,但是代码大都雷同而且都有一个弊端 比如说 微信 对目标函数实现hook之后第一次打开微信 第一次定位是可以改变的

  但是 我如果想更换地址的话 就需要重启手机了,重新加载hook了,试了很多次都是这样满足不了需求。

为了改进这个地方我们从gps定义的源代码流程开始看寻找hook系统函数的突破口 

 我也是看完之后才找到hook的地方 locationmangerservice  这个类

@override
 public void reportlocation(location location, boolean passive) {
 checkcallerisprovider(); //检测权限和uid

 if (!location.iscomplete()) {
  log.w(tag, "dropping incomplete location: " + location);
  return;
 }
  //发送位置信息
 mlocationhandler.removemessages(msg_location_changed, location);
 message m = message.obtain(mlocationhandler, msg_location_changed, location);
 m.arg1 = (passive ? 1 : 0);
 mlocationhandler.sendmessageatfrontofqueue(m);
 }

那么我们可以hook掉这个location的参数 修改为我们想要定位的地方就可以实现效果了,

 xposedhelpers.findandhookmethod("com.android.server.locationmanagerservice", lpparam.classloader, "reportlocation", location.class, boolean.class, new xc_methodhook() {
  @override
  protected void afterhookedmethod(methodhookparam param) throws throwable {
  super.afterhookedmethod(param);
  location location = (location) param.args[0];
  xposedbridge.log("实际 系统 经度"+location.getlatitude() +" 系统 纬度"+location.getlongitude() +"系统 加速度 "+location.getaccuracy());
  xsharedpreferences xsp =new xsharedpreferences("com.markypq.gpshook","markypq");
  if (xsp.getboolean("enablehook",true)){
   double latitude = double.valueof(xsp.getstring("lan","117.536246"))+ (double) new random().nextint(1000) / 1000000 ;
   double longtitude = double.valueof(xsp.getstring("lon","36.681752"))+ (double) new random().nextint(1000) / 1000000 ;
   location.setlongitude(longtitude);
   location.setlatitude(latitude);
   xposedbridge.log("hook 系统 经度"+location.getlatitude() +" 系统 纬度"+location.getlongitude() +"系统 加速度 "+location.getaccuracy());
  }

  }
 });

如果我想主动调用这个函数 必须要得到这个locationmangerservice 的对象 获取这个对象可以通过hook locationmanager 的构造函数获取,

 xposedbridge.hookallconstructors(locationmanager.class,new xc_methodhook() {
  @override
  protected void afterhookedmethod(methodhookparam param) throws throwable {
  super.afterhookedmethod(param);
  if (param.args.length==2) {
   context context = (context) param.args[0]; //这里的 context
   xposedbridge.log(" 对 "+getprogramnamebypackagename(context)+" 模拟位置");
   //把权限的检查 hook掉
   xposedhelpers.findandhookmethod(context.getclass(), "checkcallingorselfpermission", string.class, new xc_methodhook() {
   @override
   protected void afterhookedmethod(methodhookparam param) throws throwable {
    super.afterhookedmethod(param);
    if (param.args[0].tostring().contains("install_location_provider")){
    param.setresult(packagemanager.permission_granted);
    }
   }
   });
   xposedbridge.log("locationmanager : " + context.getpackagename() + " class:= " + param.args[1].getclass().tostring());
   //获取到 locationmanagerservice 主动调用 对象的 reportlocation 方法 可以去模拟提供位置信息
   //这里代码中并没有涉及到主动调用
   object locationmanagerservice = param.args[1];
  }
  }
 });

Hook实现Android 微信、陌陌 、探探位置模拟(附源码下载)

Hook实现Android 微信、陌陌 、探探位置模拟(附源码下载)

当然还需要hook一些其他的辅助函数 ,这些函数都可以在 android studio 中看到java的代码 我们就无需过多解释了 上 源代码

源码下载

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!