逆向釘釘實(shí)現(xiàn)在家打卡

前言


對(duì)于程序員而言,被釘釘打卡束縛那肯定是不行的,程序員就要有程序員的打卡方式; 由于段時(shí)間釘釘更新了程序?qū)е略鹊牟寮?,但是吧?xí)慣了在家打卡后慢慢悠悠去公司的我肯定是不能到公司再打卡了呀,于是,干他!

開(kāi)發(fā)環(huán)境


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-FiMac地址認(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)中想要獲取GPSWi-Fi也必須使用系統(tǒng)的函數(shù),所以我們直接Hook系統(tǒng)底層方法就可以達(dá)到一勞永逸,除非系統(tǒng)更新更換了方法否則是一直可以使用噠~

由于沒(méi)寫(xiě)設(shè)置界面,所以GPS定位信息和Wi-FiMac地址是寫(xiě)死在代碼里的,所以本次沒(méi)有插件放出,有需要的可以參照本文代碼自己寫(xiě)一份即可。

我是亞里亞,我的夢(mèng)想是成為一個(gè)博學(xué)的安全工程師,那么下期見(jiàn)。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

友情鏈接更多精彩內(nèi)容