【问题标题】:Scan networks (SSID's) on iOS 7 by using private API使用私有 API 在 iOS 7 上扫描网络 (SSID)
【发布时间】:2014-08-11 00:42:26
【问题描述】:

是否可以通过在 iOS 7 越狱设备上使用私有 API 来获取周围网络的 SSID 列表?

我知道在 iOS 上管理 WiFi 功能的 MobileWiFi.framework。 (它取代了过时的 Apple80211 框架。)

这里是4岁的答案如何使用它:Accessing & Using the MobileWiFi.framework

我尝试在 iOS 7 上使用这些方法,但没有成功。

在此解决方案作者的其中一个 cmets 中,我收到了这个答案:

scanNetworks 失败,因为该代码现已使用 4 年。正如我在回答中所描述的,您必须使用新框架来获得等效功能(至少从 iOS 5 开始您就必须这样做)。如果您尝试使用 iOS 7 执行此操作,我建议您发布一个新问题

附言

这不是Get SSID's in range iOS 7重复。我问一下这些功能的越狱方法。


UPD:

上面的链接和 creker 的答案中有工作代码。但它需要通过沙盒限制。 所以,正确的问题是:有没有办法用常规的 iOS 应用程序做到这一点?

【问题讨论】:

    标签: iphone ios7 network-programming jailbreak ssid


    【解决方案1】:

    这是我在 iOS5-7 上使用的

    void* library = dlopen("/System/Library/SystemConfiguration/IPConfiguration.bundle/IPConfiguration", RTLD_LAZY);
    
    int (*apple80211Open)(void*) = (int(*)(void*))dlsym(library, "Apple80211Open");
    int (*apple80211Bind)(void*, NSString*) = (int(*)(void*, NSString*))dlsym(library, "Apple80211BindToInterface");
    int (*apple80211Close)(void*) = (int(*)(void*))dlsym(library, "Apple80211Close");
    int (*apple80211Scan)(void*, NSArray**, void*) = (int(*)(void*, NSArray**, void*))dlsym(library, "Apple80211Scan");
    
    void *airport = NULL;
    apple80211Open(&airport);
    apple80211Bind(airport, @"en0");
    
    NSArray* networks = nil;
    apple80211Scan(airport, &networks, [NSDictionary dictionary]);
    
    //"networks" is an array of NSDictionary objects for all the visible Wi-Fi networks
    
    apple80211Close(airport);
    dlclose(library); 
    

    IPConfiguration 不是胖二进制文件。它仅包含一种与设备匹配的架构。因此,如果您计划支持 arm64 设备,您还必须为 arm64 编译代码 - 32 位应用程序无法加载 64 位 dylib。 armv7 和 arm64 足以满足所有现代设备的需求。

    更新

    不幸的是,即使在越狱设备上,此代码也无法在常规 iOS 应用中运行。越狱不会关闭沙箱,这就是代码不起作用的原因。要使此代码正常工作,您需要将应用程序放在不应用沙盒限制的 /var/mobile/Applications 目录之外。它可以是/Applications 目录中的守护进程、tweak 或 GUI 应用程序。该目录中的应用程序默认没有任何限制,可以访问任何私有 API。

    【讨论】:

    • 似乎与我之前使用的代码非常相似。我在apple80211Scan(airport, &networks, [NSDictionary dictionary]); 之后设置断点,但networks 始终还是nil。什么会导致这种情况? (在 iPhone 5、iOS 7 上运行,启用 wifi)。
    • 刚刚在常规 iOS 应用程序中对其进行了测试 - 由于沙盒,无法正常工作。您可以在控制台中看到它 - 它显示“拒绝系统套接字”。该代码在沙箱之外工作 - 我在守护程序中使用它。如果您询问如何使用常规 iOS 应用程序做到这一点,那么您需要在问题中澄清这一点。越狱并不意味着你可以为所欲为——沙盒规则仍然存在。这就是代码不起作用的原因。
    • 好的,谢谢。我是越狱开发的初学者,所以以前不知道这个细节。你的意思是,我应该使用 THEOS 之类的东西而不是 Xcode 来构建我的应用程序并使用此代码?
    • 好吧,不是——你仍然可以使用 Xcode。看看iosopendev.com。它可以是任何东西 - 调整、守护程序甚至是 GUI 应用程序,但在 /Applications 目录中(该目录中的应用程序默认没有任何沙盒限制)。
    • iOS 中有两个应用程序目录。 /var/mobile/Applications - 这是所有 AppStore 应用程序所在的位置。默认情况下,它们是沙盒的。还有/Applications- 这是所有系统应用程序所在的位置。他们没有任何限制。没有沙盒,root权限,随心所欲。如果您正在构建 GUI 应用程序,那么它需要位于 /Applications 目录中才能使代码正常工作。有许多 API 在沙盒中不起作用。
    猜你喜欢
    • 2018-12-19
    • 1970-01-01
    • 1970-01-01
    • 2015-06-10
    • 2015-09-28
    • 1970-01-01
    • 2011-04-29
    • 1970-01-01
    • 2017-11-11
    相关资源
    最近更新 更多