iOS 5でWi-Fi暗号化モードを決定する方法。*

ご挨拶、同僚!

iOSでモバイルプラットフォーム用のアプリケーションを開発する多くの人は、多くの重要なデータにアクセスできないという問題に直面しています。

これらのパラメーターの1つは、Wi-Fiネットワークの現在の暗号化モードです。

このパラメータは、プライベートフレームワークを介して「違法」な方法でのみ取得できるため、標準の方法を使用して認識することは不可能であると考えられます。

そうではありません。 iOS 5で実行されている( ただし、残念ながらiOS6では閉じられている)回避策を示したいと思います。





現実には、プログラムでこのパラメーターを実際に取得することはできません。 しかし、それは「二次性徴」によって非常に簡単に得られます。

もちろん、この種のメッセージを使用してネットワークに接続した瞬間は、デバイスのログに記録されることに注意してください。



Oct 5 11:37:58 ISOX-iPhone kernel[0] <Debug>: 023881.292007 wlan.N[2599] AppleBCMWLAN Joined BSS: @ 0x80eb1400, BSSID = some_mac_address, rssi = -30, rate = 54 (100%), channel = 3, encryption = 0x8, ap = 1, failures = 0, age = 0, ssid[ 6] = "pretty_ssid"
      
      







ご覧のとおり、これはデバッグレベルのカーネルによって送信されるASLメッセージです。 現在の暗号化モードを決定する必要なパラメーター「暗号化」が含まれています。

したがって、私たちのタスクは、このメッセージを受け取り、合法的な方法を使用してプログラム内で処理することです。



これを行うには、ASL iOSシステムで作業する必要があります( #import <asl.h>を忘れないでください)。



  aslmsg asl, message; aslresponse searchResult; int i; const char *key, *val; NSMutableArray *result_dicts = [NSMutableArray array]; //    ASL asl = asl_new(ASL_TYPE_QUERY); if (!asl) { NSLog(@"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);
      
      







その結果、次の形式の辞書の配列を取得します。



 { ASLMessageID = 723; Facility = kern; Level = 7; Message = "AppleBCMWLAN Joined BSS: @ 0xc1985200, BSSID = some_mac_address, rssi = -42, rate = 54 (100%), channel = 3, encryption = 0x8, ap = 1, failures = 0, age = 1, ssid[ 6] = \"pretty_ssid\""; PID = 0; Sender = kernel; Time = 1349423438; }
      
      





「時間」パラメータでソートされた最後のメッセージは正しいものになります。

問題は解決されました。現在の暗号化モードの値があります。 メッセージ行から取得するのは簡単です。

次の正当な質問はそれがどういう意味ですか?

これを行うには、Wi-Fiデバイスのドライバーのソースコードを少し検索する必要がありました。

値のデコードは次のとおりです(値を10進システムに変換する場合)



 case 0: "None" case 1: "WEP" case 2: "WPA" case 4: "WPA PSK" case 6: "WPA2" case 8: "WPA2 PSK" case 10: "LEAP" case 12: "80211X" case 14: "WPS"
      
      







問題は解決されました-ネットワーク暗号化の価値は、プライベートフレームワークを使用せずに取得されます。

もちろん、これには欠点がないわけではありません。メッセージの有効期間はかなり短く、ASLの継続的な監視が必要です。



残念ながら、Appleは6番目のファームウェアのカーネルログメッセージへのアクセスを閉じました。 さて、あなたは新しい方法を探さなければなりません。



ご清聴ありがとうございました。 おもしろいことを話してくれたらと思います。



All Articles