iOS逆向小知识:自动连接特定Wi-Fi来解决ASO机刷网络不稳定问题

简介: iOS逆向小知识:自动连接特定Wi-Fi来解决ASO机刷网络不稳定问题

引言

推荐采用本文的方案二:采用MobileWiFi.framework自动连接特定Wi-Fi

方案二的背景: 实现Associate to wifi的,在iOS 版本10 之后,就比较困难,因为苹果将SBWiFiManager 的joinNetwork:password:移除掉;且在iOS10 中SBWiFiManager 的t_manager、t_device、t_currentNetwork 均采用 struct存储,提高了安全性。

因此要实现自动 Associate to wifi 的话,我从hopper 中看到sb 中使用WiFiManagerClientCreate() 实现连接Wi-Fi,因此就才想到使用MobileWiFi.framework 实现是最佳的捷径

I、 自动连接特定Wi-Fi

1.1 方案一:使用wifiutil工具进行连接Wi-Fi

  • 借助wifiutil 控制Wi-Fi的连接(setupwifi)
[%c(SpringBoard) setupwifi];//连接特定Wi-Fi
%new
 + (void) setupwifi{ 
       NSArray* args = @[@"enable-wifi"];
        [KNnoZombieRunobjc noZombieRun:@"/usr/bin/wifiutil" withParams:args];       
        NSArray* args1 = @[@"disassociate"];
        [KNnoZombieRunobjc noZombieRun:@"/usr/bin/wifiutil" withParams:args1];        
        NSArray* args2 = @[@"associate",@"@PHICOMM_08",@"-p",@"password"];
        [KNnoZombieRunobjc noZombieRun:@"/usr/bin/wifiutil" withParams:args2];
 }

1.2 方案二:MobileWiFi.framework

采用MobileWiFi.framework自动连接特定Wi-Fi

  • AirPortSettings
//
#import <objc/runtime.h>
#import "KNwifiutil.h"
#import "KNnoZombieRunobjc.h"
@interface WiFiNetwork : NSObject <NSCoding, NSCopying>{
}
@end
@implementation KNwifiutil
// ls -lrt Layout/usr/bin/wifiutil
//%new  // iphone/tool command line Tool
+ (void) setupwifi{
    NSArray* args = @[@"enable-wifi"];
    [KNnoZombieRunobjc Run:@"/usr/bin/wifiutil" withParams:args];
    NSArray* args1 = @[@"disassociate"];
    [KNnoZombieRunobjc Run:@"/usr/bin/wifiutil" withParams:args1];
    NSArray* args2 = @[@"associate",@"@PHICOMM_08",@"-p",@"password"];
    [KNnoZombieRunobjc Run:@"/usr/bin/wifiutil" withParams:args2];
}
//iOS9-SpringBoard-Headers/System/Library/PreferenceBundles/
//一、AirPortSettings.bundle  可以用来处理Wi-Fi的自动连接
//dlopen("/System/Library/PreferenceBundles/AirPortSettings.bundle/AirPortSettings",RTLD_NOW);
//二、VPNPreferences.bundle 可用用来自动处理VPN             NSBundle* VPNPreferences = [NSBundle bundleWithPath:@"/System/Library/PreferenceBundles/VPNPreferences.bundle"];
//[VPNPreferences load];
///System/Library/PreferenceBundles/AirPortSettings.bundle/AirPortSettings
+(void)AirPortSettings{
    //1、Wi-Fi的打开和关闭   -fno-objc-arc 防止找不到方法报错
    [[objc_getClass("SBWiFiManager") sharedInstance] setPowered:YES];
    [[objc_getClass("SBWiFiManager") sharedInstance] setWiFiEnabled:YES];
    id _wifi = [objc_getClass("SBWiFiManager") sharedInstance];
    //2、
    NSArray<WiFiNetwork*>* networks = [_wifi availableNetworks];//扫描可用的Wi-Fi
    NSString *name = @"";
    NSString *password = @"";
    for (WiFiNetwork *network in networks) {// 以下代码有待优化
        if ([[network name] isEqualToString:name]) {// 连接特定的Wi-Fi
            if ([network canAttemptJoin]) {
            }
            else{// 不能连接就设置对应的密码
                [network setPassword:password];// 设置Wi-Fi的密码
            }
            ////                [[objc_getClass("SBWiFiManager") sharedInstance] _askToJoinWithID:0];
            //                -(void)joinNetwork:(id)network password:(id)password;
            if ([network canAttemptJoin]) {// 代表是可以连接的
                [_wifi joinNetwork:network];//连接特定的Wi-Fi
            }
            else{
                NSLog(@"password error");
            }
            break;
        }
    }
}
@end

1.3 工具方法: OC执行二进制文件

(BOOL) Run:(NSString*) path withParams:(NSArray*)args

#import "KNnoZombieRunobjc.h"
#include <spawn.h>
@implementation KNnoZombieRunobjc
static int knlaunchProcess(const char* path, char** args) {
    posix_spawnattr_t attr;
    posix_spawn_file_actions_t fact;
    posix_spawnattr_init(&attr);
    posix_spawn_file_actions_init(&fact);
    char* const environ[2] = {"", NULL};
    pid_t pid = 0;
    posix_spawnp(&pid, path, &fact, &attr, args, environ);
    return pid;
}
+ (BOOL) Run:(NSString*) path withParams:(NSArray*)args {
    const char* _path = [path UTF8String];
    int n = args ? args.count : 0;
    char** _args = alloca(sizeof(char*) * (n + 2));
    _args[0] = "";
    _args[n+1] = NULL;
    for (int i = 0; i < n; i++) {
        NSString* arg = args[i];
        _args[i+1] = [arg UTF8String];
    }
    pid_t pid = fork();
    if (pid < 0) {
        return NO;
    } else if (pid == 0) {
        knlaunchProcess(_path, _args);
        _exit(0);
    }
    waitpid(pid, NULL, 0);
    return YES;
}
@end

see also

目录
相关文章
|
10天前
|
安全 网络安全 Android开发
安卓与iOS开发:选择的艺术网络安全与信息安全:漏洞、加密与意识的交织
【8月更文挑战第20天】在数字时代,安卓和iOS两大平台如同两座巍峨的山峰,分别占据着移动互联网的半壁江山。它们各自拥有独特的魅力和优势,吸引着无数开发者投身其中。本文将探讨这两个平台的特点、优势以及它们在移动应用开发中的地位,帮助读者更好地理解这两个平台的差异,并为那些正在面临选择的开发者提供一些启示。
110 56
|
10天前
|
网络协议 Linux
在Linux中,如何分析网络连接和端口占用情况?
在Linux中,如何分析网络连接和端口占用情况?
|
1天前
|
安全 网络安全 数据安全/隐私保护
网络安全与信息安全:关于网络安全漏洞、加密技术、安全意识等方面的知识分享安卓与iOS开发中的线程管理比较
【8月更文挑战第30天】本文将探讨网络安全与信息安全的重要性,并分享关于网络安全漏洞、加密技术和安全意识的知识。我们将了解常见的网络攻击类型和防御策略,以及如何通过加密技术和提高安全意识来保护个人和组织的信息安全。
|
6天前
|
开发工具 iOS开发 容器
【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
|
7天前
|
安全 5G 数据安全/隐私保护
|
7天前
|
物联网 网络架构 智能硬件
|
8天前
|
Kubernetes 监控 Shell
在K8S中,我们公司用户反应pod连接数非常多,希望看一下这些连接都是什么信息?什么状态?怎么排查?容器里面没有集成bash环境、网络工具,怎么处理?
在K8S中,我们公司用户反应pod连接数非常多,希望看一下这些连接都是什么信息?什么状态?怎么排查?容器里面没有集成bash环境、网络工具,怎么处理?
|
10天前
|
机器学习/深度学习 网络协议 安全
在Linux中,如何追踪TCP连接和网络数据包,如使用tcpdump或Wireshark?
在Linux中,如何追踪TCP连接和网络数据包,如使用tcpdump或Wireshark?
|
12天前
|
网络协议 网络性能优化 UED
|
15天前
|
运维 网络安全 iOS开发
厉害!外国网络工程师用Ansible给思科IOS设备升级!
厉害!外国网络工程师用Ansible给思科IOS设备升级!
下一篇
云函数