4

iOS 7 ジェイルブレイクされたデバイスでプライベート API を使用して、ネットワークの SSID のリストを取得することは可能ですか?

iOS で WiFi 機能を管理するMobileWiFi.frameworkについて知っています。(廃止された Apple80211 フレームワークを置き換えます。)

これを使用する方法についての 4 年前の回答は次のとおりです。MobileWiFi.framework へのアクセスと使用

iOS 7 でこれらの方法を使用しようとしましたが、うまくいきません。

このソリューションの作成者のコメントの 1 つで、次の回答を受け取りました。

scanNetworksそのコードは現在 4 年前のものであるため、失敗します。私の回答で説明したように、同等の機能を得るには新しいフレームワークを使用する必要があります (少なくとも iOS 5 以降はそうしなければなりませんでした)。iOS 7 でこれを行おうとしている場合は、新しい質問を投稿することをお勧めします。

ps

Get SSID's in range iOS 7 の複製ではありません。これらの機能の脱獄方法についてお聞きします。


更新:

上記のリンクとクレッカーの回答にも機能するコードがあります。ただし、サンドボックスの制限を通過する必要があります。したがって、正しい質問は次のとおりです。通常の iOS アプリでそれを行う方法はありますか?

4

1 に答える 1

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ファットバイナリではありません。デバイスに一致するアーキテクチャが 1 つだけ含まれています。したがって、arm64 デバイスのサポートを計画している場合は、コードを arm64 用にもコンパイルする必要があります。32 ビット アプリケーションは 64 ビットの dylib をロードできません。最新のすべてのデバイスには、armv7 と arm64 で十分です。

アップデート

残念ながら、このコードはジェイルブレイクされたデバイスでも通常の iOS アプリでは機能しません。ジェイルブレイクはサンドボックスをオフにしないため、コードが機能しません。このコードを機能させるに/var/mobile/Applicationsは、サンドボックスの制限が適用されていないディレクトリの外にアプリケーションを配置する必要があります。/Applicationsディレクトリ内のデーモン、微調整、または GUI アプリケーションである可能性があります。そのディレクトリ内のアプリケーションには、既定では制限がなく、任意のプライベート API にアクセスできます。

于 2014-06-20T10:10:42.167 に答える