fuqiuluo’s blog

记录美好生活

技术分享

FakeLocation - 实现一个FakeLocation

#LSPosed#安卓#FakeLocation
type
Post
status
Published
date
Aug 23, 2024
slug
summary
tags
LSPosed
安卓
FakeLocation
category
技术分享
icon
password
原版FakeLocation限制重重,还要钱,接下来我们先讨论Fake Location的实现,如有错误请指出。(这是一篇随手记)

FL的实现

将一个二进制so文件拷贝到/dev,然后杀死system_server,system_server会被重新拉起(小概率设备直接趋势重启),在完成注入system_server重新拉起后,删除/dev里面的那个文件,随后开始hook流程。、
实际上是一种类似于Zygisk的载入方法(((((((((((((
将一个叫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框架是进行模拟定位功能的实现。
本文目的是提供技术的学习交流,禁止用于违法用途!

Hook ILocationManager.Stub

这个东西不能直接反射?大概率是我的系统有点奇怪小问题吧,我是通过hook ServiceManager里面的addService在其运行之前通过入参,将ILocationManager.Stub给hook了具体就是
上面那个方案hook拿到的是一个IBinder(毛用没有),应该改成直接反射hook ILocationManager.Stub的onTransact方法,然后利用thisObject获取到继承了ILocationManager.Stub的impl类对象,接下来就能进行愉快的hook了。
全程都没有入侵闪动校园,所以说不会被闪动校园检测到LSPosed注入,简直完美(((

支持registerListener

安卓系统的api提供了一个可以自定义位置更新间隔的注册监听器的接口,反正叫什么registerXXX的,在老版本安卓叫registerLocationUpdates,安卓12开始改了个名字(用户层上可以直接调用的API没有修改)毕竟谷歌不会大刀阔斧的乱砍东西,这里点名微软,把我之前写的...
这个方法的入参是一个类型为LocationListener的玩意继承自IInterface,刚开始我还以为他怎么实现跨进程管理这种监听器的呢,又没有唯一id什么的,原来是靠IBinder提供的getInterfaceDescriptor方法获取描述符管理的(主要是IBinder很容易暴毙,管理起来啰哩巴嗦的) 那玩意获取的是一个类全名,鸟用没有!
然后每隔一段时间,往这个回调、监听器里面塞点我的虚假Location即可完成虚拟定位。
 
Loading...