FakeLocation - 实现一个FakeLocation

原版FakeLocation限制重重,还要钱,接下来我们先讨论Fake Location的实现,如有错误请指出。(这是一篇随手记)

FL的实现

将一个二进制so文件拷贝到/dev,然后杀死system_server,system_server会被重新拉起(小概率设备直接趋势重启),在完成注入system_server重新拉起后,删除/dev里面的那个文件,随后开始hook流程。

将一个叫libfl.so文件(实际上是一个装了dex的zip压缩文件)通过DexClassloader加载进系统框架,一启动就获取ServicesManager往里面添加一些系统服务以为了和Fake Location进行交互比如说摇杆和位置更新什么的。

为什么这个东西不能作为一个检测点呢?

接下来Fake Location会用丑陋的手段劫持以下方法(在LocationManagerService里面的方法):

  • isProviderEnableForUser (Android 10+)

  • isProviderEnable (Android 7+)

  • getProviders

  • getLastLocation

  • requestLocationUpdates

  • registerLocationListener

  • unregisterLocationListener

  • addGpsStatusListener

  • removeGpsStatusListsner

  • unregisterGnssStatusCallback

  • getCurrentLocation

  • registerGnssStatusCallback

鉴权(独立模拟功能)

安卓系统服务在Android 10之前,getLocation不会携带user_id什么的参数,只能通过Binder.getCallerUid()去实现获取调用者的uid实现鉴权。

腾讯的那个hardcoder好像有洞(((

基于信号模拟实现

这里补充一种物理实现,就是模拟卫星,当然有些软件会检测基站,然后就会寄。在未经许可的情况下模拟也是要进去的,所以说不要想哦!

LSPOSED实现

首先Fake Loction的实现很啰嗦,其实我们可以做一个magisk模块使用LSPlant框架,在system_server启动时注入进行hook就可以了,但是这个操作伴随大量的复杂工作,我们选择使用LSPosed框架是进行模拟定位功能的实现。

本文目的是提供技术的学习交流,禁止用于违法用途!