áá
áºáá±á·ááœáẠáá»áœááºá¯ááºááẠAndroid á¡ááá®áá±ážááŸááºážáá»á¬ážá០Wi-Fi ááœááºáááºáá»á¬ážááᯠá
áááºááºáááºáᬠáááºááœáá·áºá¡ááŸááºáá»á¬ážá¡ááŒá±á¬ááºáž á¡áá±ážá
áááºá¡áá»ááºá¡áááºáá»á¬ážááᯠááá°ááá¯áá«áááºá
á€áá±áá¬ááœáẠáá»áœááºá¯ááºááá¯á·ááẠá¡áááºá¡áá²áá»á¬ážá
áœá¬ááᯠáááºááá¯ááºáá²á·ááááºá
á€áá±á¬ááºážáá«ážááœáẠNDKá áááºááºáá»á¬ážááá«áá² Android áá¯ááºá០Wi-Fi áááºáááºážáá»ááºááá¯ááºáᬠáá»ááºáá»ááºááŒáá·áºááŒáá·áºáá±áá¬ááᯠáááºááá¯á·ááá°ááááºááᯠááœá±ážááœá±ážáá¬ážáá±á¬áºáááºáž Android API ááᯠá¡áá¯á¶ážááŒá¯á áááºážááᯠá¡áááá¹áá¬ááºááŒááºááá¯áá¯á¶ááá¯áááºáž áá¬ážáááºáá«áááºá
áááŸá±á¬áá·áºááŸá±ážáá¡á±á¬áẠáá¯ááºááᯠá áá±ážáá«á
1. ááá±á¬áá»ááºáá áºáá¯áááºáá®ážáá«á
á€ááŸááºá á¯ááẠAndroid ááá±á¬áá»ááºáá áºáá¯ááᯠáá áºááŒáááºáááºááá¯á áááºáá®ážáá¬ážáá°áá»á¬ážá¡ááœáẠáááºááœááºáá¬ážáá±á¬ááŒá±á¬áá·áº á€á¡áá¬áá¡áá±ážá áááºá¡áá»ááºá¡áááºáá»á¬ážááᯠáá»áœááºá¯ááºááá¯á·áá»ááºááŸááºáá¬ážáááºá á¡á±á¬ááºáá«áá¯ááºááᯠKotliná minSdkVersion=23 ááœáẠááŒááá«áááºá
2. á¡áá¯á¶ážááŒá¯ááœáá·áºáá»á¬áž
á¡ááá®áá±ážááŸááºážá០Wi-Fi ááŸáá·áºá¡áá¯ááºáá¯ááºáááºá áááºáááºá¡áá¯á¶ážááŒá¯áá°áá¶ááŸááœáá·áºááŒá¯áá»ááºáá»á¬ážá
áœá¬ááá¯ááá°áááºááá¯á¡ááºáááºá ááŸááºá·á¡áá®
ááá¯á·ááŒá±á¬áá·áºá AndroidManifest.xml ááœáẠáá»áœááºá¯ááºááá¯á· ááá·áºáá«áááº-
<uses-permission android_name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android_name="android.permission.ACCESS_WIFI_STATE" />
<uses-permission android_name="android.permission.CHANGE_WIFI_STATE" />
<uses-permission android_name="android.permission.ACCESS_FINE_LOCATION"/>
áááºááŸááá¯ááºáá±á¬ááºáá»ááºááŸáá·áº ááá·áºááºáá«ááŸááá±á¬ áá¯ááºááœááº-
import android.app.Activity
import android.content.Context
import android.location.LocationManager
import androidx.core.app.ActivityCompat
....
if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O) {
ActivityCompat.requestPermissions(
activity,
arrayOf(Manifest.permission.ACCESS_FINE_LOCATION, Manifest.permission.CHANGE_WIFI_STATE),
1
)
makeEnableLocationServices(activity.applicationContext)
} else {
ActivityCompat.requestPermissions(
activity,
arrayOf(Manifest.permission.CHANGE_WIFI_STATE),
1
)
}
/* вклÑÑÐ°ÐµÑ ÑкÑаМ вклÑÑÐµÐœÐžÑ ÑлÑÐ¶Ð±Ñ Ð¿ÐŸ ПпÑÐµÐŽÐµÐ»ÐµÐœÐžÑ ÐŒÐµÑÑÐŸÐ¿ÐŸÐ»ÐŸÐ¶ÐµÐœÐžÑ */
fun makeEnableLocationServices(context: Context) {
// TODO: пеÑеЎ вÑзПвПЌ ÑÑПй ÑÑМкÑОО МаЎП ÑаÑÑказаÑÑ Ð¿ÐŸÐ»ÑзПваÑелÑ, заÑеЌ ÐаЌ ЎПÑÑÑп к ЌеÑÑПпПлПжеМОÑ
val lm: LocationManager =
context.applicationContext.getSystemService(Context.LOCATION_SERVICE) as LocationManager
val gpsEnabled: Boolean = lm.isProviderEnabled(LocationManager.GPS_PROVIDER);
val networkEnabled: Boolean = lm.isProviderEnabled(LocationManager.NETWORK_PROVIDER);
if (!gpsEnabled && !networkEnabled) {
context.startActivity(Intent(ACTION_LOCATION_SOURCE_SETTINGS));
}
}
3. BroadcastReceiver ááá¯áááºáá®ážááŒá®áž Wi-Fi ááœááºáááºáááºáááºážáá»ááºááᯠá áááºááºáááºááŒááºážááá¯ááºáᬠáá±áá¬á¡ááºááááºááŒá áºáááºáá»á¬ážá¡ááœáẠá á¬áááºážááœááºážáá«á
val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager
val wifiScanReceiver = object : BroadcastReceiver() {
override fun onReceive(context: Context, intent: Intent) {
val success = intent.getBooleanExtra(WifiManager.EXTRA_RESULTS_UPDATED, false)
if (success) {
scanSuccess()
}
}
}
val intentFilter = IntentFilter()
/* пПЎпОÑÑваеЌÑÑ ÐœÐ° ÑППбÑÐµÐœÐžÑ ÐŸ пПлÑÑеМОО МПвÑÑ
ÑезÑлÑÑаÑПв ÑкаМОÑÐŸÐ²Ð°ÐœÐžÑ */
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)
context.registerReceiver(wifiScanReceiver, intentFilter)
val success = wifiManager.startScan()
if (!success) {
/* ÑÑП-ÑП Ме пПлÑÑОлПÑÑ Ð¿ÑО запÑÑке ÑкаМОÑПваМОÑ, пÑПвеÑÑÑе вÑЎаМÑе ÑазÑеÑÐµÐœÐžÑ */
}
....
private fun scanSuccess() {
/* Ð²ÐŸÑ ÐŸÐœÐž, ÑезÑлÑÑаÑÑ ÑкаМОÑÐŸÐ²Ð°ÐœÐžÑ */
val results: List<ScanResult> = wifiManager.scanResults
}
á
á¬ááœááºá
á¬áááºážááŸá WiFiManager.startScan áááºážáááºážááᯠAPI áá¬ážááŸááºáž 28 ááááºážá ááœá²ááŒá¬ážáááºááŸááºáá¬ážáá±á¬áºáááºáž ááááºáá¬ážáááºá
á
á¯á
á¯áá±á«ááºážá áá»áœááºá¯ááºááá¯á·ááẠá¡áá¬ááá¹áá¯áá»á¬ážá
á¬áááºážááᯠáááºáá¶áááŸááá²á·áááºá
4. ScanResult ááá¯ááŒáá·áºááŒá®áž á ááºážáááºážáá»ááºáá»á¬ážááᯠáá¬ážáááºáá«á
á€á¡áááºážá áááºáááºá¡áá»áá¯á·ááᯠááŒáá·áºááŒá®áž áááºážááá¯á· ááá¯ááá¯ááẠááᯠáá±á¬áºááŒááŒáá«á áá¯á·á
SSID ááá¯á· â Service Set Identifier ááẠááœááºáááºá á¡áááºááŒá áºáááºá
BSSID - á¡ááŒá±áá¶áááºáá±á¬ááºááŸá¯áááºááŸááºáááºááŸááºááŒááºáž - ááœááºáááºá¡áááºáá¬á MAC ááááºá ᬠ(Wi-Fi ááœáá¯áá·áº)
á¡ááá·áº â áááºáá¶áááŸááá¬ážáá±á¬ Signal Strength Indicator [dBm (Russian dBm) â Decibelá áááºááœáŸááºážáá«áá« 1 mWá] â áááºáá¶áááŸááá±á¬ signal strength á ááœáŸááºááŒáá»ááºáá
áºáá¯á 0 á០-100 á០áááºááá¯ážááᯠáá°áááºá 0 á០áá±ážáá±á Wi-Fi ááœáŸááºá០ááá·áºá
ááºáá®ááá¯á· áááºážáá
áºáá»áŸá±á¬ááºááœáẠá¡áá»ááºááŒáá«áá« áá¯á¶ážááŸá¯á¶ážáá±áá±ááŒá
áºáááºá áá±á¬ááºáááºá¡áá±ážá
áááºá¡áá»ááºá¡áááºáá»á¬ážááᯠá¥ááá¬á¡á¬ážááŒáá·áº ááœáẠááœá±á·ááá¯ááºáá«áááºá
val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
val numberOfLevels = 5
val level = WifiManager.calculateSignalLevel(level, numberOfLevels)
á¡ááŒáááºáá± â Wi-Fi á¡ááŸáẠ[Hz] á áááºáááºááŸá¯á¡ááŒáááºáá±á ááŒáááºááŸá¯ááºážááá¯ááºááá¯ááºá¡ááŒááºá áá»ááºáááºáá¯áá±á«áºáá±á¬ á¡áá¬ááᯠáááºá
áááºáááºá
á¬ážáá±áááºá á¡ááŸááºáá
áºáá¯á
á®ááœáẠáááºážáááá¯ááºááá¯ááºáááºáááºááŸá¯ ááá·áºááŸááºážááŸá¯ááŸááááºá á
á¬áá±ážáá±á
ááºááœáẠáá°ááŒáá¯ááºá¡áá»á¬ážáá¯á¶áž Wi-Fi á¡ááœá¬á¡áá±ážááẠ2.4 GHz ááŒá
áºáááºá ááá¯á·áá±á¬áº ááá¯ááá¯áááá»á
á±áááºá¡ááœáẠá¡ááŸááºááẠá¡áááºáá±ážáá¬ážááá·áº á¡áá®ážá¡áá¬ážááŸá áá¶áá«ááºáááºáá¬ážáá±á¬ ááŒáááºááŸá¯ááºážááŒáá·áº ááá·áºáá¯ááºážááá¯á· á¡áá»ááºá¡áááºáá»á¬ážááᯠáá±ážááá¯á·áá«áááºá áá»ááºáááºá¡áá±á¡ááœááºááŸáá·áº áááºááá¯ááºáᬠááŒáááºááŸá¯ááºážáá»á¬áž
/* пП ÑаÑÑПÑе ПпÑеЎелÑеЌ ÐœÐŸÐŒÐµÑ ÐºÐ°ÐœÐ°Ð»Ð° */
val channel: Int
get() {
return if (frequency in 2412..2484) {
(frequency - 2412) / 5 + 1
} else if (frequency in 5170..5825) {
(frequency - 5170) / 5 + 34
} else {
-1
}
}
á áœááºážááẠ- ááœá²ááŒááºážá áááºááŒá¬ááŸá¯á¡ááœáẠá áááºáááºá á¬ážá áá¬á¡áá±á¬ááºážáá¯á¶ážáááºáááºá á¡áá»áááºá¡áá»á¬ážááŒá®ážááá¯á¡ááºáá±á¬ á¡áá¯ááºá á€áá±áá¬ááœáẠá¡ááŸááºá âá áœááºážáááºâ ááᯠá á¬ááŒá±á¬ááºážááœáẠáá±ážáá¬ážáááºá á€ááá á¹á ááœááºá á á¬ááœááºá á¬áááºážááœáẠááŒáá¯ážáá áºáá»á±á¬ááºážá¡áááºááŒááºááá¯ááŒááºážáá¡áá±ážá áááºá¡áá»ááºá¡áááºáá»á¬ážááᯠáááºááŸá¬ááœá±ááẠáááá¯á¡ááºáá«á á€á á¬ááŒá±á¬ááºážááœáẠááŒá áºáá±á¬ááºážááŒá áºááá¯ááºáááºá á¥ááá¬á¡áá»áá¯á·ááŸá¬ á¡á±á¬ááºáá«á¡ááá¯ááºážááŒá áºáááº-
[WPA-PSK-TKIP+CCMP][WPA2-PSK-TKIP+CCMP][WPS][ESS]
[WPA2-PSK-CCMP][ESS]
[WPA2-PSK-CCMP+TKIP][ESS]
[WPA-PSK-CCMP+TKIP][WPA2-PSK-CCMP+TKIP][ESS]
[ESS][WPS]
5. á¡ááá¯áá±á¬ááºáá»á¬ážááŸáá·áº ááá¯ááºážááŒá¬ážááá¯ááºá áœááºážáá»á¬ážááᯠáá¬ážáááºááŒááºážá
android.net.wifi.* áááºáá±á·áá»áºá á¡áááºážáá»á¬ážááᯠLinux utility áá
áºáá¯á០hood á¡á±á¬ááºááœáẠá¡áá¯á¶ážááŒá¯áá¬ážááŒá±á¬ááºáž ááŸááºáá¬ážááá¯ááºáá«áááºá
áá áá¯ááºáááºááẠáá±á¬ááºááœááºááœá¬ážááŸá¬áá«á ááœááºážá¡ááœááºážááŸá á¡á áááºá¡ááá¯ááºážáá»á¬ážááᯠâ-â áááºá¹áá±áááŒáá·áº ááá¯ááºážááŒá¬ážáá¬ážááá·áº áá±á¬áºáááºáá áºáá¯á á¡ááœááºááᯠáá¯á¶ážáááºááŒáá·áºááŒáá«á áá¯á·á
[WPA-PSK-TKIP+CCMP]
[WPA2-PSK-CCMP]
ááá á¡áááá¹áá«ááºááᯠáá±á¬áºááœáŸááºážáááºá á á áºááŸááºááŒá±á¬ááºážá¡áá±á¬ááºá¡áá¬ážááŒáááºážáááºáž. ááá¯ááá¯áááºááŸá¬á access point ááá¯ááºááá¯ááºá¡áá¯á¶ážááŒá¯áááºááŸáá·áº payload ááᯠáá¯ááºááŸááºáááºážááŒáá·áº á ááºáá á¹á ááºážááŸáá·áº access point ááẠáááºááá·áºáá¯ááºáá±á¬ááºáá»ááºáá»á¬áž áá¯ááºáá±á¬ááºááááºáááºážá á€ááá¯á·á áºááá¯áá±ážáá¬ážá ááºááœááºá á¡áá¯á¶ážá¡áá»á¬ážáá¯á¶ážááœá±ážáá»ááºá áá¬áá»á¬ážááŸá¬ WPA ááŸáá·áº WPA2 ááŒá áºááŒá®ážá áá»áááºáááºáá¬ážáá±á¬áááááá¬áá áºáá¯á á®ááᯠááá¯ááºááá¯ááºááŒá áºá á± ááá¯á·ááá¯áẠáááºážááŸáááá·áºáá±á«áºááá¯ááŒááºážááŒá áºáááºá RADIUS áá¬áᬠ(WPA-Enterprice) ááẠáá¯ááºááŸááºáá¬ážáá±á¬ áá»ááºáááºáá áºáá¯á០á áá¬ážááŸááºááᯠáá¶á·ááá¯ážáá±ážáááºá ááŒá áºááá¯ááºáá»á±áá»á¬ážáááºááŸá¬ ááá·áºá¡áááºááŸá access point ááẠá€á¡á á®á¡á á¥áºá¡á áá»áááºáááºááŸá¯áá áºáá¯áá±ážáááºá áá¯ááááá¬ážááŸááºážááŸáá·áº ááááá¬ážááŸááºážá¡ááŒá¬áž ááŒá¬ážáá¬ážáá»ááºááŸá¬ áááºážááœáẠááá¯ááá¯á¡á¬ážáá±á¬ááºážáá±á¬ cipher áá«ááŸááááº- AES ááŸáá·áº ááá¯á¶ááŒá¯á¶áá±á¬ TKIP ááá¯á·ááŒá áºáááºá ááá¯ááá¯ááŸá¯ááºááœá±ážááŒá®áž á¡ááá·áºááŒáá·áºááá·áº WPA3 ááᯠáááŒááºážááŒááºáž ááááºáááºáá»ááºááŸááááºá áá®á¡áá¯áá®á¡áá enterprice solution CCKM (Cisco Centralized Key Management) ááœáẠááœá±ážáá»ááºááœáá·áºáá áºáᯠááŸááá±á¬ááºážááŸáááá¯ááºáá±á¬áºáááºáž áááºážááᯠáá»áœááºá¯ááºáááœá±á·áá°ážáá«á
áááºááœáá·áºá¡ááŸááºááᯠMAC ááááºá
á¬ááŒáá·áº á
á
áºááŸááºááŒá±á¬ááºážá¡áá±á¬ááºá¡áá¬ážááŒááẠááŒááºáááºáááºááŸááºáá¬ážáááºá ááá¯á·ááá¯ááºá Access Point ááẠáá±ááºááá®áá±á¬á·áá±á¬ WEP á¡ááºáááá¯áá®áááºááᯠá¡áá¯á¶ážááŒá¯á áá±áá¬ááᯠáá¶á·ááá¯ážáá±ážáááºááá¯áá»áŸáẠá¡ááŸááºááááºááœáẠá
á
áºááŸááºááŒá±á¬ááºážá¡áá±á¬ááºá¡áá¬ážáááŸááá« (á€áá±áá¬ááœáẠáá»áŸáá¯á·ááŸááºáá±á¬á·ááẠáá¯ááºááŸááºááŒááºážáá±á¬á·ááŒá
áºáááº)á áá»áœááºá¯ááºááá¯á·ááẠOTHER áá²á·ááá¯á· ááœá±ážáá»ááºááŸá¯áá»á¬ážááᯠá¡áá»áá¯ážá¡á
á¬ážááœá²ááŒá¬ážáá¬ážáá«áááºá
ááŸááºáá¬ážáá±á¬ Captive Portal Detection ááŒáá·áº á¡áá»á¬ážáá°ááŸá¬ wi-fi ááœáẠáá±áááºážá
á¬ážááá·áº áááºážáááºážáá
áºáá¯áááºáž ááŸáááẠ- browser áá
áºáá¯ááŸáááá·áº á¡áá±á¬ááºá¡áá¬ážá
áá
á
áºááŒááºáž áá±á¬ááºážááá¯áá»ááºáá
áºáá¯áááºáž ááŸááá«áááºá ááá¯ááá¯á·áá±á¬áááºáá±á¬ááºááœáá·áºá¡áá»ááºáá»á¬ážááẠá
áááºáá¬ááá¯ááœáá·áºáá¬ážááá²á·ááá¯á· (áááºážááá¯á·ááẠáá¯ááºááá¯ááºážááá¯ááºáá¬áá»áááºáááºááŸá¯áááŸá¯áá±á¬áá·áºááŸááŒá
áºáááº)á ááá¯á·ááŒá±á¬áá·áº áááºážááá¯á·ááᯠOPEN á¡ááŒá
Ạááœá²ááŒá¬ážáá¬ážáá«áááºá
áá¯ááááááºááá¯ážááᯠáááºááœáŸááºážáá±á¬áºááŒááá¯ááºáááºá á¡áááá á®áá¶ááá·áºááœá²ááŸá¯ algorithm. á€áááºááŸá¬ á¡áááºáá±á¬áºááŒáá« á¡áá±á¬ááºá¡áá¬ážá áá á áºááŒááºážáááºážáááºážá áá±á¬ááºáá áºáá¯ááŒá áºáááºá áá¯ááºááŸááºááŒááºážáá±á¬á·áá»á¬ážááᯠáááºáá²á·ááá¯á· áá²ááŸááºááŒáááºááᯠá¡ááá¡áá» ááœá±ážááœá±ážáááºá ááŒá áºááá¯ááºáá»á±ááŸááá±á¬ ááœá±ážáá»ááºááŸá¯áá»á¬ážááᯠáá¯á¶ážáááºááŒáá·áºááŒáá«á áá¯á·á EAP - áá±á¬áºááŒáá¬ážáá±á¬ WPA-Enterprice ááœááºá¡áá¯á¶ážááŒá¯áá¬ážáá±á¬á ááá·áºááœááºážáá¬ážáá±á¬á¡áá±á¬ááºá¡áá¬ážá áá á áºááŒááºážáá±áá¬ááá¯á¡áááºááŒá¯áááºáá±áá¬áá±á·á áºááá¯á¡áá¯á¶ážááŒá¯áááºá SAE - á¡ááá·áºááŒáá·áº WPA3 ááœááºá¡áá¯á¶ážááŒá¯áááºá brute force ááá¯ááá¯ááá¯áá¶ááá¯ááºáááºááŸááááºá PSK - á¡áá¯á¶ážá¡áá»á¬ážáá¯á¶ážááœá±ážáá»ááºááŸá¯ááŸá¬ á áá¬ážááŸááºáá áºáá¯ááá·áºááœááºážááŒááºážááŸáá·áº áá¯ááºááŸááºáá¬ážáá±á¬áá¯á¶á á¶ááŒáá·áº áá¯ááºááœáŸáá·áºááŒááºážááá¯á·áá«áááºáááºá IEEE8021X - ááá¯ááºáá¶ááá¬á á¶ááŸá¯ááºážá¡á (WPA áááá¬ážá á¯á០áá¶á·ááá¯ážáá±ážáá±á¬ ááœá²ááŒá¬ážáááº)á OWE (Opportunistic Wireless Encryption) ááẠáá»áœááºá¯ááºááá¯á· OPEN á¡ááŒá ẠáááºááŸááºáá¬ážáá±á¬ á¡ááŸááºáá»á¬ážá¡ááœáẠIEEE 802.11 á á¶ááŸá¯ááºážá ááá¯ážáá»á²á·ááŸá¯áá áºáá¯ááŒá áºáááºá OWE ááẠáááºážááᯠáá¯ááºááŸááºááŒááºážááŒáá·áº áá¯á¶ááŒá¯á¶ááŸá¯áááŸááá±á¬ ááœááºáááºáá áºáá¯á០áá±ážááá¯á·áá±á¬ áá±áá¬áá»á¬ážá áá¯á¶ááŒá¯á¶áá±ážááᯠáá±áá»á¬á á±áááºá áááºáá±á¬ááºááœáá·áºáá±á¬á·áá»á¬ážáááŸáááá·áºá¡áá« ááœá±ážáá»ááºááœáá·áºáá áºáá¯áááºáž ááŒá áºááá¯ááºáááºá á€ááœá±ážáá»ááºááŸá¯ááᯠNONE áá¯áá±á«áºááá¯ááŒáá«á áá¯á·á
áááá ááá·áºáááºáá»áẠááá¯á· áá±á«áºáá«áááºá á á¬ááŸááºá áá áºáá»á¬áž â áá±ážááá¯á·áá±á¬áá±áá¬ááá¯áá¬ááœááºááẠcipher ááá¯áááºáá²á·ááá¯á·á¡ááá¡áá»á¡áá¯á¶ážááŒá¯ááááºážá ááœá±ážáá»ááºá áá¬áá»á¬ážááᯠá á¬áááºážááŒá¯á á¯ááŒáá«á áá¯á·á WEP - RC4 stream cipher ááá¯á¡áá¯á¶ážááŒá¯áááºá áá»áŸáá¯á·ááŸááºáá±á¬á·ááẠáá±ááºáá Ạcryptography áá±á¬áááœáẠáááºááá¶ááá¯ááºáᯠáá°ááá¬ážááá·áº áá»áŸáá¯á·ááŸááºáá±á¬á·ááŒá áºááŒá®ážá TKIP - WPAá CKIP - WPA2 ááœááºáá¯á¶ážáááºá TKIP+CKIP - áá±á¬ááºááŒááºááá¯ááºáááºááŸá¯á¡ááœáẠWPA ááŸáá·áº WPA2 áá«áá±á¬ á¡áá»ááºáá»á¬ážááᯠáááºááŸááºááá¯ááºáá«áááºá
ááŒááºá ááºáá¯á¶ážáá¯á¡á á¬ážá á¡áá®ážáá»áẠWEP á¡ááŸááºá¡áá¬ážááᯠáááºááŸá¬ááœá±á·ááá¯ááºáááº-
[WEP]
á¡áááºááœáẠááœá±ážááœá±ážáá²á·ááá·áºá¡ááá¯ááºážá áááºážááẠáááºááŸáááŒááºážáááŸááá±á¬ áá±á¬á·áá»á¬ážá¡áá¯á¶ážááŒá¯áááºá¡ááœáẠalgorithm ááŸáá·áº default á¡áá±ááŒáá·áºáá°áá®áá±á¬ encryption method ááá¯áááºááŸááºáááºáá¯á¶áá±á¬ááºáá«áááºá
ááᯠá€ááœááºážááááºááᯠáá¯á¶ážáááºááŒáá·áºáá«-
[ESS]
ဠWi-Fi áááºáááºááŸá¯áá¯áẠááá¯á·ááá¯áẠWi-Fi ááœááºááẠtopology. áá»áááºáááºáá¬ážáá±á¬ á ááºáá á¹á ááºážáá»á¬áž áááºááœááºáá±ážááá·áº access point áá áºáá¯ááŸááá±á¬á¡áá«ááœáẠBSS (Basic Service Set) áá¯ááºááᯠáááºááŒá¯á¶ááœá±á·áááá¯ááºáááºá ááŒááºááœááºážááœááºáááºáá»á¬ážááœáẠááœá±á·ááá¯ááºáááºá á ááºážáá»ááºážá¡áá ááá°áá®áá±á¬áá±ááá¶ááœááºáááºáá»á¬ážá០á ááºáá á¹á ááºážáá»á¬ážááᯠáá»áááºáááºáááºá¡ááœáẠá¡áá¯á¶ážááŒá¯ááœáá·áºá¡áá»ááºáá»á¬áž ááá¯á¡ááºáá±á¬ááŒá±á¬áá·áº áááºážááá¯á·ááẠááá¯ážáá»á²á·áááºáá±á¬ááºááŸá¯áá»á¬áž - ESS á áá áºá áááºáá áºááá¯ááºážááŒá áºáááºá IBSSs (Independent Basic Service Sets) á¡áá»áá¯ážá¡á á¬ážááẠá ááºáá á¹á ááºážááẠPeer-to-Peer ááœááºáááºá á¡á áááºá¡ááá¯ááºážááŒá áºááŒá±á¬ááºáž áá±á¬áºááŒáááºá
WPS á¡áá¶ááá¯áááºáž ááœá±á·ááá¯ááºáááº-
[WPS]
WPS (Wi-Fi Protected Setup) ááẠWi-Fi ááœááºáááºáá áºáá¯á áá áºááá¯ááºážá¡ááá¯á¡áá»á±á¬áẠá¡á ááŒá¯ááŒááºážá¡ááœáẠáááá¯ááá¯áá±á¬áá áºáá¯ááŒá áºáááºá á áááºáááºá á¡áá¯á¶ážááŒá¯áá°ááẠá á¬áá¯á¶áž 8 áá¯á¶ážáá«áá±á¬ á áá¬ážááŸááºááᯠááá¯ááºááá·áºááẠááá¯á·ááá¯áẠrouter áá±á«áºááŸá ááá¯ááºáá áºáá¯ááᯠááŸáááºáá«á ááá·áºáááºáá±á¬ááºááœáá·áºá¡ááŸááºááẠáááá¡áá»áá¯ážá¡á á¬ážááŒá áºááŒá®áž ááá·áºáááºáá±á¬ááºááœáá·áºá¡ááŸááºáá¡áááºáá±ážááœáẠá€á¡ááŸááºááŒá áºáá¯á¶áá±á«áºáá¬áá«áá áááºááẠá á®áá¶ááá·áºááœá²áá°á¡ááá·áºááá¯á·ááœá¬ážááŒá®áž WPS á¡áá¯á¶ážááŒá¯ááœáá·áºááᯠááááºááẠá¡áá±ážá¡áááºá¡ááŒá¶ááŒá¯á¡ááºáá«áááºá á¡ááŸááºááŸá¬ ááááºáž 8 áá¯á¶áž PIN ááᯠMAC ááááºá á¬ááŒáá·áº ááŸá¬ááœá±á·ááá¯ááºáááºá ááá¯á·ááá¯áẠáá áºá á¯á¶áá áºáŠážá០áááá¯ážááá¬áž á¡ááœáá·áºáá±á¬ááºážáá°ááá¯ááºááá·áº á¡áá®ážá ááºáá¯á¶ážá¡áá»áááºáá áºáá¯ááœáẠáááºážááᯠááœá²áá¯ááºááá¯ááºáááºá
6. áá±á¬áºáááºááŸáá·áº ááœá²ááŒááºážá áááºááŒá¬ááŒááºáž áá¯ááºáá±á¬ááºáá»ááºááᯠáááºáá®ážáá«á
á¡áááºááœááºááœá±á·ááŸááá²á·ááá·áºá¡áá¬áá»á¬ážá¡áá±á«áº á¡ááŒá±áá¶á áá±áá¬á¡áááºážáá»á¬ážááᯠá¡áá¯á¶ážááŒá¯á ááŒá áºáá»ááºáá²á·áááºáá»á¬ážááᯠáá±á¬áºááŒáá«áááºá
/* ÑÑ
еЌа аÑÑеМÑОÑОкаÑОО */
enum class AuthMethod {
WPA3,
WPA2,
WPA, // Wi-Fi Protected Access
OTHER, // вклÑÑÐ°ÐµÑ Ð² ÑÐµÐ±Ñ Shared Key Authentication О ÐŽÑ. ОÑпПлÑзÑÑÑОе mac-address-based О WEP
CCKM, // Cisco
OPEN // Open Authentication. ÐÐŸÐ¶ÐµÑ Ð±ÑÑÑ ÑП ÑкÑÑÑÑÐŒ Captive Portal Detection - запÑÐŸÑ Ð°ÑÑеМÑОÑОкаÑОО ÑеÑез бÑаÑзеÑ
}
/* алгПÑОÑÐŒ ввПЎа клÑÑей */
enum class KeyManagementAlgorithm {
IEEE8021X, // пП ÑÑаМЎаÑÑÑ
EAP, // Extensible Authentication Protocol, ÑаÑÑОÑÑеЌÑй пÑПÑПкПл аÑÑеМÑОÑОкаÑОО
PSK, // Pre-Shared Key â кажЎÑй Ñзел Ð²Ð²ÐŸÐŽÐžÑ Ð¿Ð°ÑÐŸÐ»Ñ ÐŽÐ»Ñ ÐŽÐŸÑÑÑпа к ÑеÑО
WEP, // в WEP паÑÐŸÐ»Ñ ÑвлÑеÑÑÑ ÐºÐ»ÑÑПЌ ÑОÑÑÐŸÐ²Ð°ÐœÐžÑ (No auth key)
SAE, // Simultaneous Authentication of Equals - ÐŒÐŸÐ¶ÐµÑ Ð±ÑÑÑ Ð² WPA3
OWE, // Opportunistic Wireless Encryption - в ÑПÑÑеÑаÑ
МПвÑÑ
пПкПлеМОй, пÑблОÑÐœÑÑ
ÑеÑÑÑ
ÑОпа OPEN
NONE // ÐŒÐŸÐ¶ÐµÑ Ð±ÑÑÑ Ð±ÐµÐ· ÑОÑÑÐŸÐ²Ð°ÐœÐžÑ Ð² OPEN, OTHER
}
/* ЌеÑПЎ ÑОÑÑÐŸÐ²Ð°ÐœÐžÑ */
enum class CipherMethod {
WEP, // Wired Equivalent Privacy, ÐМалПг ÑОÑÑÐŸÐ²Ð°ÐœÐžÑ ÑÑаÑОка в пÑПвПЎМÑÑ
ÑеÑÑÑ
TKIP, // Temporal Key Integrity Protocol
CCMP, // Counter Mode with Cipher Block Chaining Message Authentication Code Protocol,
// пÑПÑПкПл блПÑМПгП ÑОÑÑÐŸÐ²Ð°ÐœÐžÑ Ñ ÐºÐŸÐŽÐŸÐŒ аÑÑеМÑОÑМПÑÑО ÑППбÑÐµÐœÐžÑ Ðž ÑежОЌПЌ ÑÑÐµÐ¿Ð»ÐµÐœÐžÑ Ð±Ð»ÐŸÐºÐŸÐ² О ÑÑеÑÑОка
// Ма ПÑМПве AES
NONE // ÐŒÐŸÐ¶ÐµÑ Ð±ÑÑÑ Ð±ÐµÐ· ÑОÑÑÐŸÐ²Ð°ÐœÐžÑ Ð² OPEN, OTHER
}
/* ÐœÐ°Ð±ÐŸÑ ÐŒÐµÑПЎПв ÑОÑÑÐŸÐ²Ð°ÐœÐžÑ Ðž пÑПÑПкПлПв, пП кПÑПÑÑÐŒ ÐŒÐŸÐ¶ÐµÑ ÑабПÑаÑÑ ÑПÑка */
data class Capability(
var authScheme: AuthMethod? = null,
var keyManagementAlgorithm: KeyManagementAlgorithm? = null,
var cipherMethod: CipherMethod? = null
)
/* РежОЌ ÑабПÑÑ WiFi (ОлО ÑÐŸÐ¿ÐŸÐ»ÐŸÐ³ÐžÑ ÑеÑей WiFi) */
enum class TopologyMode {
IBSS, // ÐпОзПЎОÑеÑÐºÐ°Ñ ÑеÑÑ (Ad-Hoc ОлО IBSS â Independent Basic Service Set).
BSS, // ÐÑÐœÐŸÐ²ÐœÐ°Ñ Ð·ÐŸÐœÐ° ПбÑлÑÐ¶ÐžÐ²Ð°ÐœÐžÑ Basic Service Set (BSS) ОлО Infrastructure Mode.
ESS // РаÑÑОÑÐµÐœÐœÐ°Ñ Ð·ÐŸÐœÐ° ПбÑлÑÐ¶ÐžÐ²Ð°ÐœÐžÑ ESS â Extended Service Set.
}
ááᯠáá¯ááºáá±á¬ááºááá¯ááºááŸá¯á¡ááœááºááᯠááœá²ááŒááºážá áááºááŒá¬ááá·áº áá¯ááºáá±á¬ááºáá»ááºáá áºáá¯ááᯠáá±ážááŒáá«á áá¯á·á
private fun parseCapabilities(capabilitiesString: String): List < Capability > {
val capabilities: List < Capability > = capabilitiesString
.splitByBrackets()
.filter {
!it.isTopology() && !it.isWps()
}
.flatMap {
parseCapability(it)
}
return
if (!capabilities.isEmpty()) {
capabilities
} else {
listOf(Capability(AuthMethod.OPEN, KeyManagementAlgorithm.NONE, CipherMethod.NONE))
}
}
private fun parseCapability(part: String): List < Capability > {
if (part.contains("WEP")) {
return listOf(Capability(
AuthMethod.OTHER,
KeyManagementAlgorithm.WEP,
CipherMethod.WEP
))
}
val authScheme = when {
part.contains("WPA3") - > AuthMethod.WPA3
part.contains("WPA2") - > AuthMethod.WPA2
part.contains("WPA") - > AuthMethod.WPA
else - > null
}
val keyManagementAlgorithm = when {
part.contains("OWE") - > KeyManagementAlgorithm.OWE
part.contains("SAE") - > KeyManagementAlgorithm.SAE
part.contains("IEEE802.1X") - > KeyManagementAlgorithm.IEEE8021X
part.contains("EAP") - > KeyManagementAlgorithm.EAP
part.contains("PSK") - > KeyManagementAlgorithm.PSK
else - > null
}
val capabilities = ArrayList < Capability > ()
if (part.contains("TKIP") || part.contains("CCMP")) {
if (part.contains("TKIP")) {
capabilities.add(Capability(
authScheme ? : AuthMethod.OPEN,
keyManagementAlgorithm ? : KeyManagementAlgorithm.NONE,
CipherMethod.TKIP
))
}
if (part.contains("CCMP")) {
capabilities.add(Capability(
authScheme ? : AuthMethod.OPEN,
keyManagementAlgorithm ? : KeyManagementAlgorithm.NONE,
CipherMethod.CCMP
))
}
} else if (authScheme != null || keyManagementAlgorithm != null) {
capabilities.add(Capability(
authScheme ? : AuthMethod.OPEN,
keyManagementAlgorithm ? : KeyManagementAlgorithm.NONE,
CipherMethod.NONE
))
}
return capabilities
}
private fun parseTopologyMode(capabilitiesString: String): TopologyMode ? {
return capabilitiesString
.splitByBrackets()
.mapNotNull {
when {
it.contains("ESS") - > TopologyMode.ESS
it.contains("BSS") - > TopologyMode.BSS
it.contains("IBSS") - > TopologyMode.IBSS
else - > null
}
}
.firstOrNull()
}
private fun parseWPSAvailable(capabilitiesString: String): Boolean {
return capabilitiesString
.splitByBrackets()
.any {
it.isWps()
}
}
private fun String.splitByBrackets(): List < String > {
val m = Pattern.compile("[(.*?)]").matcher(this)
val parts = ArrayList < String > ()
while (m.find()) {
parts.add(m.group().replace("[", "").replace("]", ""))
}
return parts
}
private fun String.isTopology(): Boolean {
return TopologyMode.values().any {
this == it.name
}
}
private fun String.isWps(): Boolean {
return this == "WPS"
}
8. ááááºááá¯ááŒáá·áºáá«á
ááœááºáááºááᯠá áááºááºáááºááŒá®áž áá«ááœá±á·áá²á·áá¬ááœá±ááᯠáááºážááᯠááŒáááºá Log.d ááŸáááá·áº ááá¯ážááŸááºážáá±á¬ á¡ááœááºááááºáá»á¬ážááᯠááŒáá¬ážáááº
Capability of Home-Home [WPA2-PSK-CCMP][ESS][WPS]
...
capabilities=[Capability(authScheme=WPA2, keyManagementAlgorithm=PSK, cipherMethod=CCMP)], topologyMode=ESS, availableWps=true
á¡ááá®áá±ážááŸááºážáá¯ááºá០ááœááºáááºááá¯á· áá»áááºáááºááŒááºážááá¯ááºáᬠááŒá¿áá¬ááᯠáá
á
áºáá±ážááá±ážáá«á ááá¯ááá¯ááºážá
ááºáá
á¹á
ááºážá OS ááŸááááºážáááºážáá¬ážáá±á¬á
áá¬ážááŸááºáá»á¬ážááá¯áááºáááºá¡ááœááºá áááºááẠroot áá¯ááºááá¯ááºááœáá·áºááŸáá·áº wpa_supplicant.conf ááá¯áááºááẠááá¯ááºá
áá
áºááŸáááá·áº rummage áá¯ááºáááºááá¹áááŸááááºáá¬ááá¯á¡ááºáá«áááºá á¡ááá®áá±ážááŸááºáž áá±á¬á·áá»á
áºááẠááŒááºáá០á
áá¬ážááŸááºááᯠááá·áºááœááºážááẠááá¯á¡ááºáá«áá á¡áááºážááŸáá
áºááá·áº áá»áááºáááºááŸá¯ááᯠááŒá¯áá¯ááºááá¯ááºáááºá
СпаÑОбП
áá
áºáá¯áá¯áááºááá·áºááẠááá¯á·ááá¯áẠááŒááºááẠááá¯á¡ááºáááºáᯠáááºáá«á comment ááœááºáá±ážáá«á :)
source: www.habr.com