送给爱迟到的小伙伴们的福利
随着移动化办公的普及,越来越多的企业用起了移动考勤软件,现市场上最为主流的考勤软件就是钉钉、企业微信、飞书,今日水印,还有一些公司自己开发的内部软件等,一些上班爱迟到的小伙伴们,上班“打卡”已经成为他们最为“痛心疾首”的一件事情,于是,现在便出现了一种面向他们的虚拟定位产品,小伙伴们再也不用怕迟到了,可是… 随着这种产品的日益普及,大多数的考勤软件也意识到了这种作弊手段,于是纷纷开启了技术对抗,都开始通过技术手段,开启了防作弊保护,从而来保护企业家的利益。
今天我就来分析一下如何做到在不用对手机root的情况下对手机应用进行虚拟定位,并且通过哪些手段可以规避这些互联网大厂(如钉钉、企业微信、飞书、今日水印等等)的的检测
(郑重声明:本人不是教唆大家作弊,而是想通过这篇文章提醒各大软件OA厂商,其实你们的软件,存在着诸多漏洞,我同样也会公布如何进行检测
)
方式一、利用系统API接口修改手机位置
安卓系统官方有开放修改位置的API接口,行话叫“开发者”,这种方式技术相当实现简单,刚入门的程序员几乎都可以做到,而且这种方式是可以全局修改手机位置信息的,用户只需要首先要确保打开设备的“开发模式”开关,开发者模式->选择允许模拟位置的应用,这样就授予了该应用修改位置的权限,核心代码如下:
mLocationManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);
mLocationManager.addTestProvider(LocationManager.GPS_PROVIDER, false,
false, false, false, true, true, true, 0, /* magic */5);
mLocationManager.setTestProviderEnabled(LocationManager.GPS_PROVIDER,
true);
Location loc = Utils.createLocation(35 + i * unit, 117 + i
* unit, 50.f);
loc.setTime(System.currentTimeMillis());
mLocationManager.setTestProviderLocation(LocationManager.GPS_PROVIDER, loc);
代表应用有:Fuck Location、Mock Location等
苹果系统官方同样也开发了修改位置的方式,但是需要借助外设才能进行修改,底层可以借助simulator location 进行修改手机定位。核心代码:
#import "ViewController.h"
#import "SSYLocationChanged.h"
@interface ViewController ()<CLLocationManagerDelegate>
@property (nonatomic, strong)CLLocationManager *locationManager;
@end
@implementation ViewController
- (void)viewDidLoad {
[super viewDidLoad];
_locationManager =[[CLLocationManager alloc]init];
_locationManager.delegate =self;
//设置定位经准
_locationManager.desiredAccuracy =kCLLocationAccuracyNearestTenMeters;
[_locationManager requestWhenInUseAuthorization];//否则,ios10不弹定位框
_locationManager.distanceFilter =10.0f;
//开始定位
[_locationManager startUpdatingLocation];
// Do any additional setup after loading the view.
}
//定位代理经纬度回调
-(void)locationManager:(CLLocationManager *)manager didUpdateLocations:(NSArray<CLLocation *> *)locations{
CLLocation *newLocation =locations[0];
CLLocationCoordinate2D oCoordinate =newLocation.coordinate;
[_locationManager stopUpdatingLocation];
NSLog(@"经度------%f\n------纬度%f",oCoordinate.longitude,oCoordinate.latitude);
//创建地理位置解码编码器对象
CLGeocoder *geoCoder =[[CLGeocoder alloc]init];
[geoCoder reverseGeocodeLocation:newLocation completionHandler:^(NSArray<CLPlacemark *> * _Nullable placemarks, NSError * _Nullable error) {
for (CLPlacemark *place in placemarks) {
NSLog(@"城市-----%@",place.locality);
}
}];
}
- (void)locationManager:(CLLocationManager *)manager didFailWithError:(NSError *)error{
if ([error code] == kCLErrorDenied){
//访问被拒绝
NSLog(@"访问被拒绝");
}
if ([error code] == kCLErrorLocationUnknown) {
//无法获取位置信息
NSLog(@"无法获取位置信息");
}
}
@end
能修改苹果系统定位的产品有很多,免费爱思助手、或者XCode工具就可以直接做到,或者也可以去淘宝上搜索相关产品
方式二、对要修改的目标程序注入修改位置的逻辑代码
这种技术的要求可能比第一种要高一点,需要会Xposed对程序进行代码注入,而且还要求会点逆向技术,一般的开发者可能无法使用这种技术,其实开发者可以基于Xposed开发一个只针对需要修改位置的app模块,通过LSP工具进行手动注入,这样就可以做到对目标程序进行位置修改了,目前这种模块很多,实现的技术思路也很多,我这边从github上也找了很多的模块,贴出来一部分关键代码给大家看看。
方式三、以沙盒方式进行修改
目前会使用这块的技术不多,全国估计都找不到几个,他的原来其实类似于一个手机上运行一个沙盒环境,运行在沙盒内环境的应用在获取位置信息时,沙盒会提供用户需要更改位置的信息,从而欺骗应用,达到虚拟位置的效果,因为这种技术实现较为复杂,我就简单说一下原理,还有贴出来一些关键性的代码,供大家进行参考
沙箱运行环境的应用,在请求定位时,或于沙箱环境的定位模块进行交互,沙箱此时便有了绝对的权利来决定是决定是返回虚假的位置信息还是真实的位置信息,从而达到虚拟定位的效果。
重点来了!!!那我们该如何过检测呢?
要说如何过检测,那就得先说说目前厂商针对以上几种方式是如何做检测的:
1、方式一的检测方式
其实针对方案一的检测方式是很容易的,方式有很多中,例如判断GPS的信息来源,如安卓系统判断方式:
Location.isFromMockProvider()
iOS系统的判断方式也有很多,例如定位数据是否来自MFi,定位数据的海拔是否正常、数据端口是否被占用等方式。
如此多的检测方式是不是就无法躲过检测了呢?当然不是,目前我就发现此技术,可以顺利通过某钉的打卡系统,并且不被检测。有点超乎我的想象,而且部分被检测的用户也是有办法绕过他的检测,绕过的办法也很简单,3步即可轻松绕过钉钉的检测系统
1、直接打开钉钉,进入考勤打卡界面,不使用模拟定位的软件,你会发现自己正处于真实的位置
2、把钉钉切换到后台(不是退出钉钉软件),然后使用模拟定位软件修改位置
3、手动切换钉钉到前台,过几秒钟,就会发现位置发生了变化,并且可以顺利通过打卡
苹果外设也同样可以利用上述方式进行绕过某钉的检测。
2、方式二的检测方式
针对方式二的检测手段也很多,如Xposed模块检测,签名校验、进程号检测,可疑jar包检测,lsp的固定文件检测。继续以某钉为例,目前此技术,依旧可以顺利通过某钉的打卡系统,并且不被检测,本人亲测,并且淘宝上此种软件销售泛滥
在此,本人轻叹一句,看来某钉的技术人员真的是该反思一下自己了
2、方式三的检测方式
针对方式三的检测手段也很多,ps检测、maps检测、文件路径检测、su检测、缓存路径检测、包名检测、特殊代码检测等等手段,当然有检测手段,就有防检测手段,由于沙盒技术实现较为复杂,所以目前市场上几乎很少简单此类的产品,但是找不到不代表没有哦~,此种产品不仅能顺利通过某钉的检测,甚至可以突破他的拍照模块、可意修改相机的拍照结果,有兴趣的小伙伴,可以单独找我进行沟通
以上是本人针对目前市场上主流的几种虚拟定位方式、以及检测与方检测方式的的个人总结,希望可以给各位同行们带来一些思路,欢迎私信讨论