欢迎您访问 最编程 本站为您分享编程语言代码,编程技术文章!
您现在的位置是: 首页

实现在Android上模拟微信、陌陌和探探的位置权限获取:通过Hook技术实现

最编程 2024-07-28 08:40:34
...

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

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

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

为了改进这个地方我们从gps定义的源代码流程开始看寻找hook系统函数的突破口 http://www.ibm.com/developerworks/cn/opensource/os-cn-android-location/

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

1

2

3

4

5

6

7

8

9

10

11

12

13

14@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的参数 修改为我们想要定位的地方就可以实现效果了,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17XposedHelpers.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 的构造函数获取,

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24XposedBridge.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];

}

}

});

0818b9ca8b590ca3270a3433284dd417.png 

0818b9ca8b590ca3270a3433284dd417.png  当然还需要hook一些其他的辅助函数 ,这些函数都可以在 Android studio 中看到Java的代码 我们就无需过多解释了 上 新修改的代码  源代码连接 链接: https://pan.baidu.com/s/1c23mLPm 密码: rhbh  不好意思 gitHub一直没传上去 源码放百度云了  新的代码取消了对 com.android.server.LocationManagerService 的直接hook  因为手机厂商修改源码的原因 直接hook LocationManagerService 会导致 classnotfind的错误  修改为hook LocationManager的构造方法  LocationManager的构造方法 第一个参数是Context参数 第二就是 LocationManagerService 的对象。

对HooK技术感兴趣,或者有开发需求 ,或者Xposed安装有问题 的朋友可以加Q群 125051266 一起交流