前言
對(duì)于程序員而言看靠,被釘釘打卡束縛那肯定是不行的饲窿,程序員就要有程序員的打卡方式; 由于段時(shí)間釘釘更新了程序?qū)е略鹊牟寮Ю蚋疲前闪?xí)慣了在家打卡后慢慢悠悠去公司的我肯定是不能到公司再打卡了呀灼狰,于是,干他逊拍!
開(kāi)發(fā)環(huán)境
- Xcode
- MonkeyDev
- 釘釘 Version 5.1.20 (13654172)
- 參考文章: https://juejin.im/post/6844904093790502919
GPS部分
以前寫(xiě)的插件是參考上述的文章里寫(xiě)的,完整源代碼如下
%hook LAPluginInstanceCollector
- (void)handleJavaScriptRequest:(NSDictionary *)arg1 callback:(void(^)(id))arg2 {
if( [arg1[@"action"] isEqualToString:@"start"] ) {
id myCallBack = ^(NSDictionary * block_arg){
if( [block_arg[@"keep"] isEqualToString:@"1"] ) {
NSMutableDictionary * tempDic = [NSMutableDictionary dictionaryWithDictionary: block_arg];
NSMutableDictionary * result = [tempDic[@"result"] mutableCopy];
result[@"latitude"] = @"26.xxxxxx";
result[@"longitude"] = @"119.xxxxxx";
tempDic[@"result"] = result;
arg2(tempDic);
} else {
arg2(block_arg);
}
arg2(block_arg);
};
%orig(arg1, myCallBack);
} else if( [arg1[@"action"] isEqualToString: @"getInterface"] ) {
id myCallBack = ^(NSDictionary * block_arg){
NSMutableDictionary * tempDic = [NSMutableDictionary dictionaryWithDictionary: block_arg];
tempDic[@"result"][@"macIp"] = @"f0:b4:29:6b:fe:51";
arg2(tempDic);
};
%orig(arg1, myCallBack);
} else {
%orig;
}
}
%end
不過(guò)最近的釘釘更新后這樣的寫(xiě)法并不能修改定位了际邻,打開(kāi)釘釘依然顯示實(shí)際的地址芯丧,按照原文章分析而寫(xiě)出的代碼釘釘可以很輕易的通過(guò)版本迭代來(lái)增加檢測(cè)代碼等方式讓這種方式無(wú)效,于是我決定Hook更底層的方法;
首先世曾,由于iOS
系統(tǒng)要求缨恒,任何需要GPS
位置信息的軟件幾乎都是封裝了原生的 CLLocationManager
來(lái)做的,所以我們直接Hook更底層的系統(tǒng)定位方法返回我們需要的定位即可轮听,這樣即使釘釘再怎么版本迭代也是沒(méi)有辦法修復(fù)的骗露,除非他不使用系統(tǒng)定位,于是我們直接Hook系統(tǒng)定位方法代碼如下:
%hook CLLocation
-(CLLocationCoordinate2D)coordinate {
CLLocationCoordinate2D location;
location.latitude = 緯度;
location.longitude = 經(jīng)度;
return location;
}
%end
這樣以來(lái)定位的問(wèn)題就解決了血巍,只要釘釘還使用iOS
系統(tǒng)的定位萧锉,那么他就無(wú)法通過(guò)版本迭代來(lái)解決我們Hook掉定位的問(wèn)題,接下來(lái)就是Wi-Fi
了述寡,釘釘打卡不僅有GPS
定位認(rèn)證柿隙,也有Wi-Fi
Mac地址認(rèn)證;
Wi-Fi部分
在上文的參考文章中,Wi-Fi
是和GPS
一起進(jìn)行判斷的鲫凶,但是同樣的由于釘釘?shù)母碌鷮?dǎo)致了該方法已經(jīng)不存在實(shí)質(zhì)性的作用了优俘,于是我們需要找更底層的方法進(jìn)行Hook,這也是為了以后釘釘在此迭代更新時(shí)我們不用再去麻煩的研究(畢竟程序員都是愛(ài)偷懶的);
在iOS系統(tǒng)中掀序,要獲取Wi-Fi
的Mac地址無(wú)非就一個(gè)方法CNCopyCurrentNetworkInfo
帆焕,他的一般用法為:
NSArray *ifs = CFBridgingRelease(CNCopySupportedInterfaces());
id info = nil;
for (NSString *ifnam in ifs) {
info = (__bridge_transfer id)CNCopyCurrentNetworkInfo((CFStringRef)ifnam);
if (info && [info count]) {
break;
}
}
NSDictionary *dic = (NSDictionary *)info;
NSString *ssid = [[dic objectForKey:@"SSID"] lowercaseString];
NSString *bssid = [dic objectForKey:@"BSSID"];
NSLog(@"ssid:%@ \nssid:%@",ssid,bssid);
其中這個(gè)BSSID
就是Mac地址,既然知道了調(diào)用的方法不恭,于是我們就進(jìn)行Hook即可叶雹,具體代碼如下:
static CFDictionaryRef (*orig_CNCopyCurrentNetworkInfo)(CFStringRef interfaceName);
static CFDictionaryRef new_CNCopyCurrentNetworkInfo(CFStringRef interfaceName) {
NSString *keyStr = (__bridge NSString *)interfaceName;
if ([keyStr isEqualToString:@"en0"] ){
NSDictionary *oldDic = (__bridge NSDictionary*)orig_CNCopyCurrentNetworkInfo(interfaceName);
NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithDictionary:oldDic];
[dic setValue:@"神崎H亞里亞" forKey:@"SSID"];
[dic setValue:@"0:6b:8e:f1:cc:50" forKey:@"BSSID"];
[dic setValue:[@"神崎H亞里亞" dataUsingEncoding:NSUTF8StringEncoding] forKey:@"SSIDDATA"];
CFDictionaryRef dict = (CFDictionaryRef)CFRetain((__bridge CFDictionaryRef)(dic));
return dict;
} else{
return orig_CNCopyCurrentNetworkInfo(interfaceName);
}
}
%ctor {
MSHookFunction((void *)CNCopyCurrentNetworkInfo, (void *)new_CNCopyCurrentNetworkInfo, (void **)&orig_CNCopyCurrentNetworkInfo);
}
這樣以來(lái)Wi-Fi
的問(wèn)題也搞定了
總結(jié)
因?yàn)槲覀冎苯親ook了系統(tǒng)的底層函數(shù),所以釘釘無(wú)論如何怎么迭代更新都無(wú)法避開(kāi)换吧,而且在iOS
系統(tǒng)中想要獲取GPS
和Wi-Fi
也必須使用系統(tǒng)的函數(shù)折晦,所以我們直接Hook系統(tǒng)底層方法就可以達(dá)到一勞永逸,除非系統(tǒng)更新更換了方法否則是一直可以使用噠~
由于沒(méi)寫(xiě)設(shè)置界面沾瓦,所以GPS
定位信息和Wi-Fi
Mac地址是寫(xiě)死在代碼里的满着,所以本次沒(méi)有插件放出谦炒,有需要的可以參照本文代碼自己寫(xiě)一份即可。
我是亞里亞风喇,我的夢(mèng)想是成為一個(gè)博學(xué)的安全工程師宁改,那么下期見(jiàn)。