如何在iOS/iPhone/iPad上获取WiFi加密模式?

7

如何在iOS中获取Wi-Fi加密模式而不使用私有库?

2个回答

3
上面答案中的代码最初是发布在这个网站上:http://www.codeproject.com/Articles/621213/Non-Standard-Way-to-Get-Inaccessible-Data-from-iOS 顺便提一下,为了使此代码工作,您需要使用#include <mach/mach.h>包含适当的头文件,以便编译器识别NDR_record_t ndr
然而,整个设置实际上并没有返回当前WiFi的加密模式,而是AirPort的配置(在上面的代码中,变量key需要设置为NSString *key = @"Setup:/Network/Interface/en0/AirPort";)。我尝试了不同的值,而这些值是从Mac终端运行$scutil获得的(例如Setup:/Network/Interface/en0/IPv4Setup:/Network/Interface/en0/Modem或来自这个网站)。
希望这能帮助遇到类似问题的人...

除了mach.h之外,我还需要包含什么?因为我得到了在C99中无效的“bootstrap_look_up2”函数的隐式声明。 - Madhup Singh Yadav

1

对于 iOS 5:

    aslmsg asl, message;
    aslresponse searchResult;
    int i;
    const char *key, *val;
    NSMutableArray *result_dicts = [NSMutableArray array];

    asl = asl_new(ASL_TYPE_QUERY);
    if (!asl)
    {
        DDLogCError(@"Failed creating ASL query");
    }
    asl_set_query(asl, "Sender", "kernel", ASL_QUERY_OP_EQUAL);
    asl_set_query(asl, "Message", "AppleBCMWLAN Joined BSS:", ASL_QUERY_OP_PREFIX|ASL_QUERY_OP_EQUAL);
    searchResult = asl_search(NULL, asl);
    while (NULL != (message = aslresponse_next(searchResult)))
    {
        NSMutableDictionary *tmpDict = [NSMutableDictionary dictionary];

        for (i = 0; (NULL != (key = asl_key(message, i))); i++)
        {
            NSString *keyString = [NSString stringWithUTF8String:(char *)key];

            val = asl_get(message, key);

            NSString *string = [NSString stringWithUTF8String:val];
            [tmpDict setObject:string forKey:keyString];
        }
        [result_dicts addObject:tmpDict];
    }
    aslresponse_free(searchResult);
    asl_free(asl);

对于iOS 6:
#define kMachPortConfigd "com.apple.SystemConfiguration.configd"

-(NSDictionary *)getSCdata:(NSString *)key
{

if(SYSTEM_VERSION_LESS_THAN(@"6.0"))
{
    // It does not work on iOS 5.*
    return nil;
}

struct send_body {mach_msg_header_t header; int count; UInt8 *addr; CFIndex size0; int flags; NDR_record_t ndr; CFIndex size; int retB; int rcB; int f24; int f28;};

mach_port_t bootstrapport = MACH_PORT_NULL;
mach_port_t configport = MACH_PORT_NULL;
mach_msg_header_t *msg;
mach_msg_return_t msg_return;
struct send_body send_msg;
// Make request
CFDataRef  extRepr;
extRepr = CFStringCreateExternalRepresentation(NULL, (__bridge CFStringRef)(key), kCFStringEncodingUTF8, 0);

// Connect to Mach MIG port of configd
task_get_bootstrap_port(mach_task_self(), &bootstrapport);
bootstrap_look_up2(bootstrapport, kMachPortConfigd, &configport, 0, 8LL);
// Make request

send_msg.count = 1;
send_msg.addr = (UInt8*)CFDataGetBytePtr(extRepr);
send_msg.size0 = CFDataGetLength(extRepr);
send_msg.size = CFDataGetLength(extRepr);
send_msg.flags = 0x1000100u;
send_msg.ndr = NDR_record;

// Make message header

msg = &(send_msg.header);
msg->msgh_bits = 0x80001513u;
msg->msgh_remote_port = configport;
msg->msgh_local_port = mig_get_reply_port();
msg->msgh_id = 20010;
// Request server
msg_return = mach_msg(msg, 3, 0x34u, 0x44u, msg->msgh_local_port, 0, 0);
if(msg_return)
{
    if (msg_return - 0x10000002u >= 2 && msg_return != 0x10000010 )
    {
        mig_dealloc_reply_port(msg->msgh_local_port);
    }
    else
    {
        mig_put_reply_port(msg->msgh_local_port);
    }
}
else if ( msg->msgh_id != 71 && msg->msgh_id == 20110 && msg->msgh_bits <= -1 )
{
    if ((send_msg.flags & 0xFF000000) == 0x1000000)
    {
        CFDataRef deserializedData = CFDataCreateWithBytesNoCopy(kCFAllocatorDefault, send_msg.addr,send_msg.size0, kCFAllocatorNull);
        CFPropertyListRef proplist = CFPropertyListCreateWithData(kCFAllocatorDefault, deserializedData, kCFPropertyListImmutable, NULL, NULL);
        mig_dealloc_reply_port(msg->msgh_local_port);
        mach_port_deallocate(mach_task_self(), bootstrapport);
        mach_port_deallocate(mach_task_self(), configport);
        mach_msg_destroy(msg);
        NSDictionary *property_list = (__bridge NSDictionary*)proplist;
        if(proplist)
            CFRelease(proplist);
        CFRelease(deserializedData);
        CFRelease(extRepr);
        return property_list;
    }
}
mig_dealloc_reply_port(msg->msgh_local_port);
mach_port_deallocate(mach_task_self(), bootstrapport);
mach_port_deallocate(mach_task_self(), configport);
mach_msg_destroy(msg);
CFRelease(extRepr);
return nil;
}

有人知道这段代码是否能通过苹果的审核流程吗? - Chris
有没有任何方法可以在OS X上获取这些信息? - MacDeveloper
@isox @chris conway,我遇到了一个问题:在C99中不允许隐式声明bootstrap_look_up2...有什么解决办法吗? - Madhup Singh Yadav

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接