会员登录|免费注册|忘记密码|管理入口 返回主站||保存桌面
第二十期 在Android中修改GPS定位数据的完整方案《手机就是开发板》手机定位系统「第二十期 在Android中修改GPS定位数据的完整方案《手机就是开发板》」
2025-01-14IP属地 湖北3

https://blog.csdn.net/aggresss/article/details/54323034

        现在很多的应用都是基于位置服务的,而且把位置服务作为重要的参考标准,其实这是很不安全的,位置信息的数据未经过任何加密,而且是从我们的手机中发送出去的,所以是可以修改的。这一期我们来探讨一下如何修改手机中的定位信息。太基础的原理我就不多说了,可以参考前几期文章。
        先整理一下思路,Android在开发者模式下有一个"允许模拟位置选项",它是location service加载 MOCK location provider 实现的,通过这种线程注入的方式修改GPS信息是hacker们最喜欢的方式,但现在很多应用已经可以检测到这种注入方式而被屏蔽掉,也就是说如果我们只在APP层面上想解决方法总是有被检测出来的可能。那我们就得把问题往深了想,通过修改最底层的GPS数据来欺骗APP,在Framework层面上没有任何修改迹象,这样基于APP层面的检测机制就拿我们没有任何办法。
        思路确定后我们来探讨实践路线,首先我们要建立一个管道,让我们想要定位的GPS数据提交到Android操作系统的最底层,也就是Linux Kernel层面;然后我们要修改 GPS的 location report 机制,让它从内核中提取到我们的数据,然后逐层上报到APP层。有点明修栈道暗度陈仓的感觉。
        总体来说分成两部实现:1.建立到系统内核的数据管道;2.修改GPS上报机制。
        这次实验使用的是闲置的小米3W手机,编译源码采用CyanogenMod-13,具体的编译环境搭建和编译方法请参考前几期文章。
        因为Android系统从内核态到APP层要经过很多的层次,所以对于建立数据管道的步骤比较繁琐,我这里分成了5个步骤,对应5个层面来实现,每一步分别对应Android的 Kernel driver,HAL,JNI,Framework,Application。所有的代码我都已上传github中https://github.com/aggresss/PHDemo/  这一期的代码在VirtualPosition 目录下。
下面描述一下实践步骤
=============分割线1==============
第一步,修改Kernel driver
进入 kernel/xiaomi/cancro/drivers 目录下,新建vp.h文件


新建vp.c文件


添加 Kconfig 文件


添加 Makefile 文件


修改 drivers/Kconfig 文件 在menu "Device Drivers"和endmenu之间添加一行


修改drivers/Makefile文件,添加一行


修改 arch/arm/configs目录下的cyanogen_cancro_defconfig 文件,在文件末尾加入

=============分割线2==============
第二步,修改HAL
进入 https://blog.csdn.net/wxh0000mm/article/details/hardware/libhardware/include/hardware 目录,新建 vp.h 文件


进入到 hardware/libhardware/modules 目录,新建vp目录,并添加vp.c文件


继续在vp目录下新建Android.mk文件

=============分割线3==============
第三步,修改JNI
进入 frameworks/base/services/core/jni 目录,新建com_android_server_VirtualPositionService.cpp文件


修改同目录下的onload.cpp文件,首先在namespace android增加com_android_server_VirtualPositionService函数声明


修改同目录下的Android.mk文件,在LOCAL_SRC_FILES变量中增加一行

=============分割线4==============
第四步,修改Framework
进入到frameworks/base/core/java/android/os目录,新增VirtualPositionService.aidl接口定义文件


然后进入 frameworks/base目录,打开Android.mk文件,修改LOCAL_SRC_FILES变量的值,增加IVirtualPosition.aidl源文件


进入到frameworks/base/services/java/com/android/server目录,新增VirtualPositionService.java文件


修改同目录的SystemServer.java文件,在ServerThread::run函数中增加加载VirtualPositionService的代码


然后需要修改sepolicy文件,具体的文件在github上,请下载使用。


=============分割线5==============
第五步,修改application
APP的文件比较多,请到github上下载,这里只贴具体的逻辑代码

=============分割线6==============
最后一步,在JNI层面修改location report 机制。
进入 frameworks/base/services/core/jni 目录,修改com_android_server_location_GpsLocationProvider.cpp文件
在全局变量部分加入


修改location_callback函数