Android之基于Xposed的模拟位置模块实现

Android之基于Xposed的模拟位置模块实现
引⾔
前段时间看到朋友圈有⼈在短时间内发了⼏条状态,定位都在不同国家的⾸都。问了⼀下,才知道⽤了⼀款能够模拟位置的软件。最近学习Xposed框架,就试着利⽤Xposed框架开发了⼀款能够模拟安卓⼿机位置的应⽤模块。
开发环境
测试机:Android 4.4
Xposed框架
AndroidStudio
实现原理
1.Android⼿机定位原理
⼿机常⽤的定位⽅式有:
卫星定位(GPS,北⽃,伽利略,Glonass)
移动定位
WiFi辅助定位
AGPS定位
* 卫星定位
GPS(Global Positioning System)即全球定位系统,是由美国建⽴的⼀个卫星导航定位系统,利⽤该系统,⽤户可以在全球范围内实现全天候、连续、实时的三维导航定位和测速;另外,利⽤该系统,⽤户还能够进⾏⾼精度的时间传递和⾼精度的精密定位。
* 定位
移动电话测量不同的下⾏导频信号,得到不同下⾏导频的TOA(到达时刻)或 TDOA(到达时间差),根据该测量结果并结合的坐标,⼀般采⽤三⾓公式估计算法,就能够计算出移动电话的位置。实际的位置估计算法需要考虑多(3个或3个以上)定位的情况,因此算法要复杂很多。⼀般⽽⾔,移动台测量的数⽬越多,测量精度越⾼,定位性能改善越明显。
* WiFi定位
每⼀个⽆线AP(路由器)都有⼀个全球唯⼀的MAC地址,并且⼀般来说⽆线AP在⼀段时间内不会移动;
设备在开启Wi-Fi的情况下,⽆线路由器默认都会进⾏SSID⼴播(除⾮⽤户⼿动配置关闭该功能),在⼴播帧包含了该路由器的MAC地址;
采集装置可以通过接收周围AP发送的⼴播信息获取周围AP的MAC信息和信号强度信息,将这些信息上传到服务器,经过服务器的计算,保存
为“MAC-经纬度”的映射,当采集的信息⾜够多时候就在服务器上建⽴了⼀张巨⼤的WiFi信息⽹络;
当⼀个设备处在这样的⽹络中时,可以将收集到的这些能够标⽰AP的数据发送到位置服务器,服务器检索出每⼀个AP的地理位置,并结合每个信号的强弱程度,计算出设备的地理位置并返回到⽤户设备,其计算⽅式和定位位置计算⽅式相似,也是利⽤三点定位或多点定位技术;
位置服务商要不断更新、补充⾃⼰的数据库,以保证数据的准确性。当某些WiFi信息不在数据库中时,可以根据附近其他的WiFi位置信息推断出未知WiFi的位置信息,并上传服务器。
* AGPS定位
AGPS(AssistedGPS:辅助全球卫星定位系统)是结合GSM/GPRS与传统卫星定位,利⽤基地台代送辅助卫星信息,以缩减GPS芯⽚获取卫星信号的延迟时间,受遮盖的室内也能借基地台讯号弥补,减轻GPS芯⽚对卫星的依赖度。AGPS利⽤⼿机的信号,辅以连接远程定位服务器的⽅式下载卫星星历 (英语:Almanac Data),再配合传统的GPS卫星接受器,让定位的速度更快。是⼀种结合⽹络信息和GPS信息对移动台进⾏定位的技术,既利⽤全球卫星定位系统GPS,⼜利⽤移动,解决了GPS覆盖的问题,可以在2代的G、C⽹络和3G⽹络中使⽤。
1.伪装定位思路
在了解到上述⼿机定位原理后,结合平时对⼿机的使⽤我们可以得知⼿机定位最常⽤的⼏种⽅式分别是:
WiFi
GPS定位
定位
Xposed的便利之处就是提供⽅法使得我们可以改变系统函数和应⽤中的函数执⾏前和执⾏后的结果。所以设想是否可以利⽤XPosed框架提供的功能编写⼀个Hook模块,勾取系统调⽤中和定位相关的函
数并篡改返回值呢?
2.相关函数
经过查阅资料和阅读安卓源码,粗略到以下⼏个类和相关的⽅法和定位有关,并对其进⾏Hook操作。下⾯是我进⾏Hook的类及其中的⽅法名:
getCellLocation
getPhoneCount
getNeighboringCellInfo
getAllCellInfo
onCellLocationChanged
onCellInfoChanged
android.wifi.WifiManager
getScanResults
getWifiState
isWifiEnabled
android.wifi.WifiInfo
getMacAddress
getSSID
getBSSID
android.NetworkInfo
getTypeName
isConnectedOrConnecting
isConnected
isAvailable
isRegistered
radeon 9200LocationManager.class
getLastLocation
getLastKnownLocation
getProviders
getBestProvider
addGpsStatusListener
addNmeaListener
android.location.LocationManager
getGpsStatus
中美贸易额3.解释
由于上述⽅法太多,这⾥只解释基本的思想。这些⽅法的作⽤及参数和返回值都能在Android开发⼿册中到,逐条hook并修改返回值即可。我们要做的其实就是利⽤Hook⼿段,让⼿机认为gps是⽬前最好的位置提供器,并修改其返回值为我们想要的位置,从⽽达到伪装位置的⽬的。但是为什么上⾯列出如此众多的⽅法需要我们Hook呢?这是因为⼿机中的定位是⼀连串⽐较复杂的过程,是⼀套各参数匹配的过程。任何⼀个相关函数的返回值和最终我们填⼊的结果不吻合,都可能导致伪装定位的失败。所以我们要做的就是到并Hook定位流程相关的⽅法并拦截修改返回值。
附上:Android开发⼿册
4.效果截图
选择伪装地点
上图是我将核⼼Hook模块实现后利⽤百度地图做了⼀个简单的欺骗位置⼩软件。
伪装定位
5.核⼼Hook模块代码
ample.administrator.hook;
import android.location.Criteria;
import android.location.GpsStatus;
import android.location.Location;
import android.location.LocationListener;
import android.location.LocationManager;
import android.os.Build;
import android.os.SystemClock;
lephony.CellIdentityCdma;
lephony.CellIdentityGsm;
lephony.CellIdentityLte;
lephony.CellIdentityWcdma;
lephony.CellInfoCdma;
lephony.CellInfoGsm;
lephony.CellInfoLte;
lephony.CellInfoWcdma;
lephony.CellLocation;
lephony.gsm.GsmCellLocation;
import flect.Method;
import flect.Modifier;
import java.util.ArrayList;
import java.util.List;
bv.android.xposed.XC_MethodHook;
bv.android.xposed.XposedBridge;
bv.android.xposed.XposedHelpers;
/**
* Created by CaptainXero on 2016/8/31 0031.
*/
public class HookUtils {
public static void HookAndChange(ClassLoader classLoader, final double latitude, final double longtitude, final int lac, final int cid) {
XposedHelpers.findAndHookMethod("lephony.TelephonyManager", classLoader,
"getCellLocation", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
GsmCellLocation gsmCellLocation = new GsmCellLocation();
gsmCellLocation.setLacAndCid(lac, cid);
param.setResult(gsmCellLocation);
}
});
XposedHelpers.findAndHookMethod("lephony.PhoneStateListener", classLoader,
"onCellLocationChanged", CellLocation.class, new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {
GsmCellLocation gsmCellLocation = new GsmCellLocation();
2010年诺贝尔化学奖gsmCellLocation.setLacAndCid(lac, cid);
param.setResult(gsmCellLocation);
}
});
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.LOLLIPOP_MR1) {
XposedHelpers.findAndHookMethod("lephony.TelephonyManager", classLoader,
诗穷而后工"getPhoneCount", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {                            param.setResult(1);
}
新药开发
});
}
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
100crypts攻略
XposedHelpers.findAndHookMethod("lephony.TelephonyManager", classLoader,
"getNeighboringCellInfo", new XC_MethodHook() {
@Override
protected void afterHookedMethod(MethodHookParam param) throws Throwable {

本文发布于:2024-09-20 13:52:46,感谢您对本站的认可!

本文链接:https://www.17tex.com/xueshu/487463.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:定位   位置   信息   基站   服务器   计算   伪装   返回值
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2024 Comsenz Inc.Powered by © 易纺专利技术学习网 豫ICP备2022007602号 豫公网安备41160202000603 站长QQ:729038198 关于我们 投诉建议