设为首页收藏本站官方微博

飘云阁(PYG官方论坛)

 找回密码
 加入论坛

QQ登录

只需一步,快速开始

扫一扫,访问微社区

[x86]PYG官方Dll优雅破解补丁制作工具[x64]PYG官方DLL优雅破解补丁制作工具[x86]PYG官方Exe优雅破解补丁制作工具飘云阁工具包(已更新第4季)PYG十周年第十一期软件安全教学视频
查看: 19725|回复: 146
打印 上一主题 下一主题

[iOS] 【非越狱环境】钉钉躺床上打卡之WIFI篇

  [复制链接]
  • TA的每日心情
    开心
    2017-9-27 15:18
  • 签到天数: 216 天

    [LV.7]常住居民III

    跳转到指定楼层
    楼主
    发表于 2017-2-7 16:02:32 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
    本帖最后由 gengjf025 于 2017-2-8 10:01 编辑

    钉钉iOS客户端WIFI修改(非越狱环境)

    本文续自上一篇:【非越狱环境】钉钉躺床上打卡之GPS篇http://www.chinapyg.com/thread-88593-1-1.html

    一、背景
    最近有朋友公司移动考勤用的是wifi考勤,即公司设置签到的wifi热点之后,员工只有在连接上该热点后才能打考勤成功,就顺手做了点小事情。


    二、工具准备
    见上一篇。

    三、分析
    1、iOS的wifi获取用到的CNCopySupportedInterfaces()和CNCopyCurrentNetworkInfo()两个函数,组合使用获取到一个CFDictionaryRef,能够读取SSID(wifi热点名)、BSSID(路由器的Mac地址)、SSIDDATA(SSID的十六进制);
    2、很多app会获取当前网络状态,常用的是函数SCNetworkReachabilityGetFlags(),Reachability中会通过该函数判断当前网络是wifi还是其他状态;

    知道这些东西之后就可以直接对这几个系统函数动手了,一劳永逸。

    四、编码
        我们在上一篇的代码基础上增加wifi信息修改的相关代码,这里使用的是fishhook这个库,为了避免命名冲突,所有函数都加了前缀;
    1、创建一个wifi信息类DTWifiModel,头文件如下:
    [Objective-C] 纯文本查看 复制代码
    //
    //  DTWifiModel.h
    //  DingTalkDylib
    //
    //
    //
    
    #import <Foundation/Foundation.h>
    #import <SystemConfiguration/SCNetworkReachability.h>
    
    @interface DTWifiModel : NSObject
    
    // en0
    @property (nonatomic, copy) NSString *ifnam;
    
    @property (nonatomic, assign) SCNetworkReachabilityFlags flags;
    
    // WIFI昵称,例如:公司办公wifi、公司客户wifi
    @property (nonatomic, copy) NSString *nickName;
    
    // BSSID:路由器的Mac地址
    @property (nonatomic, copy) NSString *BSSID;
    
    // SSID:路由器的广播名称
    @property (nonatomic, copy) NSString *SSID;
    
    // SSIDDATA:SSID的十六进制
    @property (nonatomic, strong) NSData *SSIDDATA;
    
    @property (nonatomic, assign) BOOL isSelected;
    
    - (instancetype)initWithDictionary:(NSDictionary *)dictionary;
    
    - (instancetype)initWith:(NSString *)ifnam dictionary:(NSDictionary *)dictionary;
    
    @end

    2、创建wifi信息展示类DTWifiSettingViewController,该类主要用于展示当前连接的wifi、已经设置过的wifi历史,便于切换:
    核心函数如下:
    (1)、获取当前wifi信息,获取到之后会额外记录当前网络状态的flags,存出以备后用:
    [Objective-C] 纯文本查看 复制代码
    - (void)fetchCurrentWifi {
        
        [_currentWifi.array removeAllObjects];
        
        CFArrayRef arrayRef = CNCopySupportedInterfaces();
        NSArray *ifs = (__bridge_transfer NSArray *)arrayRef;
        
        if(ifs && [ifs count] > 0) {
            
            NSString *ifnam = [ifs objectAtIndex:0];
            
            CFDictionaryRef info = CNCopyCurrentNetworkInfo((__bridge CFStringRef)ifnam);
            
            NSDictionary *dictionary = (__bridge_transfer NSDictionary *)info;
            
            if (dictionary && [dictionary count]) {
                
                DTWifiModel *wifi = [[DTWifiModel alloc] initWith:ifnam dictionary:dictionary];
                
                wifi.flags = [self fetchCurrentNetworkStatus];
                
                [_currentWifi addObject:wifi];
            }
        }
    }
    
    (2)、获取当前网络状态,很多app都会先获取网络状态判断是否为wifi连接,一次获取到wifi热点信息之后再记录一次当前网络状态,用于篡改系统函数返回的flags,代码如下:
    [Objective-C] 纯文本查看 复制代码
    - (SCNetworkReachabilityFlags)fetchCurrentNetworkStatus {
        
        // 创建零地址,0.0.0.0的地址表示查询本机的网络连接状态
        struct sockaddr_in zeroAddress;//sockaddr_in是与sockaddr等价的数据结构
        bzero(&zeroAddress, sizeof(zeroAddress));
        zeroAddress.sin_len = sizeof(zeroAddress);
        zeroAddress.sin_family = AF_INET;//sin_family是地址家族,一般都是“AF_xxx”的形式。通常大多用的是都是AF_INET,代表TCP/IP协议族
        
        SCNetworkReachabilityRef defaultRouteReachability = SCNetworkReachabilityCreateWithAddress(NULL, (struct sockaddr *)&zeroAddress); //创建测试连接的引用:
        SCNetworkReachabilityFlags flags;
        
        BOOL didRetrieveFlags = SCNetworkReachabilityGetFlags(defaultRouteReachability, &flags);
        CFRelease(defaultRouteReachability);
        
        if (!didRetrieveFlags) {
            NSLog(@"Error. Could not recover network reachability flagsn");
            return 0;
        }
        
        return flags;
    }

    3、创建类DTWIFIHook,用于hook系统函数:CNCopySupportedInterfaces()、CNCopyCurrentNetworkInfo()和SCNetworkReachabilityGetFlags(),代码如下:
    [Objective-C] 纯文本查看 复制代码
    // CFArrayRef CNCopySupportedInterfaces        (void)
    static CFArrayRef (*orig_CNCopySupportedInterfaces)();
    
    static CFArrayRef jf_CNCopySupportedInterfaces() {
        
        CFArrayRef re = NULL;
        
        DTWifiModel *wifi = [DTWIFIHook wifiHooked];
        
        if(wifi && wifi.ifnam) {
            
            NSArray *array = [NSArray arrayWithObject:wifi.ifnam];
            
            re = CFRetain((__bridge CFArrayRef)(array));
        }
        
        if(!re) {
            
            re = orig_CNCopySupportedInterfaces();
        }
        
        return re;
    }

    [Objective-C] 纯文本查看 复制代码
    // CFDictionaryRef CNCopyCurrentNetworkInfo        (CFStringRef interfaceName)
    static CFDictionaryRef (*orig_CNCopyCurrentNetworkInfo)(CFStringRef interfaceName);
    
    static CFDictionaryRef jf_CNCopyCurrentNetworkInfo(CFStringRef interfaceName) {
        
        CFDictionaryRef re = NULL;
        
        DTWifiModel *wifi = [DTWIFIHook wifiHooked];
        
        if(wifi) {
            
            NSDictionary *dictionary = @{
                                         @"BSSID" : (wifi.BSSID ? wifi.BSSID : @""),
                                         @"SSID" : (wifi.SSID ? wifi.SSID : @""),
                                         @"SSIDDATA" : (wifi.SSIDDATA ? wifi.SSIDDATA : @""),
                                         };
            re = CFRetain((__bridge CFDictionaryRef)(dictionary));
        }
        
        if(!re) {
            
            re = orig_CNCopyCurrentNetworkInfo(interfaceName);
        }
        
        return re;
    }

    [Objective-C] 纯文本查看 复制代码
    // Boolean SCNetworkReachabilityGetFlags(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags *flags)
    static Boolean (*orig_SCNetworkReachabilityGetFlags)(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags *flags);
    
    static Boolean jf_SCNetworkReachabilityGetFlags(SCNetworkReachabilityRef target, SCNetworkReachabilityFlags *flags) {
        
        Boolean re = false;
        
        DTWifiModel *wifi = [DTWIFIHook wifiHooked];
        
        if(wifi && wifi.flags > 0) {
            
            re = true;
            
            *flags = wifi.flags;
        }
        
        if(!re) {
            
            re = orig_SCNetworkReachabilityGetFlags(target, flags);
        }
        
        return re;
    }

    [Objective-C] 纯文本查看 复制代码
    + (void)load {
        
        static dispatch_once_t onceToken;
        dispatch_once(&onceToken, ^{
            
            _jf_rebind_symbols((struct _jf_rebinding[3]){
                {"CNCopySupportedInterfaces", jf_CNCopySupportedInterfaces, (void *)&orig_CNCopySupportedInterfaces},
                {"CNCopyCurrentNetworkInfo", jf_CNCopyCurrentNetworkInfo, (void *)&orig_CNCopyCurrentNetworkInfo},
                {"SCNetworkReachabilityGetFlags", jf_SCNetworkReachabilityGetFlags, (void *)&orig_SCNetworkReachabilityGetFlags},
            }, 3);
        });
    }

    五、注入、打包、签名
    操作步骤同上一篇,安装测试:
    可以看到即使使用3G网络也可以实现wifi考勤,大功告成;

    六、代码地址

    七、结束语
    谨慎使用!







    评分

    参与人数 11威望 +10 飘云币 +12 收起 理由
    77356614 + 1 老哥牛比了.
    rNKsT61v + 1 + 1 很给力!
    Alonc + 1 赞一个!
    zhiaizhuzhu + 1 PYG有你更精彩!
    woshizs + 1 有签名工具和证书呢,楼主给个成品!!!呜.
    论坛管理员 + 1 PYG有你更精彩!
    世态炎凉 + 1 楼主出个安卓的哇
    kuniao + 1 很给力!
    Rooking + 10 很给力! 签到上传照片有的破没?
    orz + 1 赞一个!

    查看全部评分

    分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友 微信微信
    收藏收藏10 转播转播 分享分享 分享淘帖 顶 踩 友情赞助
  • TA的每日心情
    开心
    2017-9-27 15:18
  • 签到天数: 216 天

    [LV.7]常住居民III

    推荐
     楼主| 发表于 2017-2-19 17:07:15 | 只看该作者
    mancong122 发表于 2017-2-19 12:45
    你的文章我看到了,我的意思是:如果说签到的wifi网络属于局域网范畴,只能是在该网络下才能访问到指定的 ...

    你说的这种情况,还要移动考勤干啥?直接打指纹或者刷卡算了。
    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情

    半小时前
  • 签到天数: 68 天

    [LV.6]常住居民II

    推荐
    发表于 2017-2-7 22:09:34 | 只看该作者
    我想有个安卓版。。。。

    买不起苹果。。。
    回复 支持 1 反对 0

    使用道具 举报

  • TA的每日心情
    无聊
    昨天 10:34
  • 签到天数: 326 天

    [LV.8]以坛为家I

    板凳
    发表于 2017-2-7 16:48:30 | 只看该作者
    我们单位居然用分享逍客

    点评

    不管什么app,应该都是通用的,提供的代码是hook的系统函数,与app本身无关  详情 回复 发表于 2017-2-7 16:54
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-9-27 15:18
  • 签到天数: 216 天

    [LV.7]常住居民III

    报纸
     楼主| 发表于 2017-2-7 16:54:00 | 只看该作者
    hzq999 发表于 2017-2-7 16:48
    我们单位居然用分享逍客

    不管什么app,应该都是通用的,提供的代码是hook的系统函数,与app本身无关
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    2017-11-6 20:38
  • 签到天数: 184 天

    [LV.7]常住居民III

    地板
    发表于 2017-2-7 20:04:24 | 只看该作者
    学习,感谢分享  。
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2017-11-5 12:00
  • 签到天数: 113 天

    [LV.6]常住居民II

    7#
    发表于 2017-2-7 21:38:31 | 只看该作者
    6 钉钉还有动态补丁,我的一直没升级之前的bug钉钉都补上了
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    昨天 00:02
  • 签到天数: 557 天

    [LV.9]以坛为家II

    8#
    发表于 2017-2-7 21:54:40 | 只看该作者
    看起來不錯,先收藏,備用了
    回复 支持 反对

    使用道具 举报

    该用户从未签到

    9#
    发表于 2017-2-7 23:16:01 | 只看该作者
    顶楼主啦..希望楼主多发精品好帖啦.....
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    开心
    1 小时前
  • 签到天数: 712 天

    [LV.9]以坛为家II

    10#
    发表于 2017-2-8 02:39:46 | 只看该作者
    学习了~~谢谢
    回复 支持 反对

    使用道具 举报

  • TA的每日心情
    无聊
    2017-11-1 14:41
  • 签到天数: 75 天

    [LV.6]常住居民II

    11#
    发表于 2017-2-8 09:11:22 | 只看该作者
    不错不错。学习了。 。收藏一下。有空也玩玩。
    回复 支持 反对

    使用道具 举报

    您需要登录后才可以回帖 登录 | 加入论坛

    本版积分规则

    小黑屋|手机版|Archiver|飘云阁安全论坛 ( 粤ICP备15107817号-2|友情赞助  

    GMT+8, 2017-12-16 01:58

    Powered by Discuz! X3.3 Licensed

    © 2001-2017 Comsenz Inc.

    快速回复 返回顶部 返回列表