地理位置伪装

530 阅读2分钟

GPS定位

www.eefocus.com/baike/49719… 权限

<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"/>
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"/>
var locManager = getSystemService(Context.LOCATION_SERVICE) 

var loc = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER)

locManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0F, object : LocationListener{
	...
 
    override fun onLocationChanged(location: Location?) {
        Log.e("gpslocation", location.toString())
        toast(location.toString())
    }
})

主要通过一下几个方法监听或者获取Location数据

getLastKnownLocation
getLastLocation
onLocationChanged

拦截和替换策略: 在LMS服务中,在对应接口替换Location对象,主要是替换经纬度信息

  public void set(Location l) {
		...
        mLatitude = l.mLatitude; //维度
        mLongitude = l.mLongitude; //经度
        mAltitude = l.mAltitude; //高度
		...
    }

指定位置的经度的经纬度信息主要从网上获取

NETWORK定位

与gps定位代码基本一致,只不过将provider改成LocationManager.NETWORK_PROVIDER

基站定位

frameworks\opt\telephony\src\java\com\android\internal\telephony\gsm\GSMPhone.java
frameworks\opt\telephony\src\java\com\android\internal\telephony\gsm\ GsmServiceStateTracker.java 
frameworks\opt\telephony\src\java\com\android\internal\telephony\cdma\CDMAPhone.java
getCellLocation

1.jpg

codeantenna.com/a/LfkwvchAa…

GSM基站信息:

GSM网是Global System for Mobile Communications的简称,中文为全球移动通讯系统,俗称"全球通",是一种起源于欧洲的移动通信技术标准,是第二代移动通信技术,其开发目的是让全球各地可以共同使用一个移动电话网络标准,是世界上第一个对数字调制、网络层结构和业务作了规定的蜂窝系统的网络。

基站信息包含如下:

MCC,Mobile Country Code,移动国家代码(中国的为460);
MNC,Mobile Network Code,移动网络号码(中国移动为00,中国联通为01);
LAC,Location Area Code,位置区域码;
CID,Cell Identity,基站编号,是个16位的数据(范围是065535)。

CDMA基站信息:

BID, SID, NID, LAT LONG

名称类型必填说明
sidintSID系统识别码(各地区一个)
nidintNID网络识别码(各地区1-3个)
cellidint基站号(bid)
hexint进制类型,16或10,默认:10
dtypestring返回的数据格式:json/xml/jsonp
callbackstring当选择jsonp格式时必须传递
keystringAPP KEY

WIFI定位

wifi定位是通过WifiManager拿到wifi的信息,主要是wifi的BSSID(即mac地址)。然后通过一些api查询经纬度

<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
android.net.wifi.WifiManager
wifiManager.getScanResults()

ScanReuslt有三个字段比较重要: SSID是wifi名称, BSSID是wifi的mac, level则是信号强度(负数) * 注意结果中同一个SSID可能会有多个,如果需要链接wifi可以通过信号强度过滤出最好的来链接

获取到上述信息后,然后通过一些api查询经纬度。这些wifi和经纬度的对应信息,一般需要特殊渠道获取

很多厂商的做的位置伪装功能,差不多都是基于上方的机制做的,在信息返回的地方进行拦截,用假的或者内置的特定地方的位置数据替换用户实际位置的数据