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没有修改)毕竟谷歌不会大刀阔斧的乱砍东西,这里点名微软,把我之前写的...
然后每隔一段时间,往这个回调、监听器里面塞点我的虚假Location即可完成虚拟定位。
