αααααα½ααααα»αααααΌαααΆαααααααααααΆα Wi-Fi ααΈαααααα·ααΈ Android αα·αααα½αααΆααα·αααααααααα’α·αα’αααΈα
ααα»α
α
αΌαααααΎααααΆααα
αα
ααΈαααααΎαααααΌαααααααα»αααΉαααΆαααααΆαααΆα
αααΎα:
α’αααααααααα·ααΆααααΆα’αααΈααααααΎααααΈααα½αααΆααα·ααααααααααΌααααΌααΆαα’αααΈααα·ααααΆα Wi-Fi ααΈααΌα Android αααααααΆα NDK, hacks ααα»ααααααααΎαα 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 ααΊααΆααααααααααΆα
ααΆαααΈα - ααΆααααααα’ααααααααΆααααααααααΆααΌαααααΆα - α’αΆααααααΆα MAC ααα’αΆααΆααααααααααΆα (α ααα»α Wi-Fi)
ααααα·α β ααΆαααα½α ααΌα
ααΆαααααααΆαααααααΆ [dBm (dBm αααααα»αααααΈ) β Decibel ααΆαααααα 1 mW α] β ααΌα
ααΆαααααααααΆαααααααΆαααααα½αααΆαα αααααααααΈ 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. Π Π°Π·Π±ΠΈΡΠ°Π΅ΠΌΡΡ Π² Π°Π±Π±ΡΠ΅Π²ΠΈΠ°ΡΡΡΠ°Ρ ΠΈ ΠΏΠ°ΡΡΠΈΠΌ capabilities
ααΆααΆαααααααααα»αααΆααα·ααΆαααΆααααΆαααααααα
αα android.net.wifi.* ααααΌαααΆαααααΎαα
ααααααααααΆαααααα§αααααααααΎααααΆααααΈαα»α
ααΎαααΉαααααΎαααααααΆαααΆααααΆααα ααααΌαααΎααα·α αΆαααΆαααααααααααααααααααΆαα»αα αααα»αααααααα αααααΌαααΆααααααααααααααΆ "-"α
[WPA-PSK-TKIP+CCMP]
[WPA2-PSK-CCMP]
α’ααααααααΈαα½ααα·αααααΆα’αααΈα’αααΈαααααα α ααΆα αα·ααΈααΆααααααααααααααΆαα. αααααΊααΆααααΆαααααααααααΆααααα§ααααα αα·αα ααα»α α αΌαααααΎαααΆαααααΌαααα’αα»αααα ααΎααααΈα±ααα ααα»α α αΌαααααΎαααΆαα’αα»ααααΆαα±ααααααΎαααα½αααΆ αα·αααααα’αα·αααααΈαααααα»αα αα ααααααααα’αααααααα αααααΎαααΌαα αααα»αααΊ WPA αα·α WPA2 ααααααα»ααααα§αααααααΈαα½αααααααΆαααααΆαααααααααΆααα¬ααΆααααα’αααΈαααααα α ααΆα αααΆαααΈααα RADIUS (WPA-Enterprice) αααααααΆααααααααΆααααΎααΆααααααααΆαα’αα·αααααΈαα ααΆαα αααΎαααααααΆα ααα»α α αΌαααααΎαα αααα»αααααααααα’ααααααααααΌαααΆααααααΆαααααααααα ααΆααααααααΆααααααα ααΆααα»αααααΆαααΆαααααααΈααΈα αα·αααΈαα½αααΊααΆααΆααΆααααααΌααααααΆααααααΆααααΆα: AES αααααΉα TKIP α’ααααα·αα»αα WPA3 ααααααα»αααααααΆα αα·αααΏαααΏαααΆαααα ααααααΌαααΆαααααΆαααΆαααααΎαααααααα ααΆαααααΉααααΈ ααΆα’αΆα ααΆααααααΎαααΆαα½αααΉααααααααααΆα enterprice CCKM (Cisco Centralized Key Management) ααα»αααααααα»ααα·ααααααααααΆααααΆααα
α
ααα»α
α
αΌαααααΎαααΆαα’αΆα
ααααΌαααΆαααααααα
ααΆααααααααααΎααααΈαααααααααΆαααααα’αΆααααααΆα MAC α α¬ααααα·αααΎα
ααα»α
α
αΌαααααΎαααΆαααααααα·αααααααααααααΎαααα½ααααααααΆα WEP α α½αααααααα ααΆααα·ααα·αααΆαααΆααααααααααΆαααα (αααααααΆαααα
ααΈαααααΊααΆααα’αα·αααααΈα)α ααΎαα
αΆααααααΆαααααααΎαααΌα
ααΆ OTHER α
ααΆααααΆααα·ααΈααΆααααααα½ααααααααα·αααα
αααα»α wi-fi ααΆααΆαααααΆαα½αααΉαααΆαααΆααααΆαα Captive Portal Detection - ααααΎαααααααααΆααααΆαααααααααα·ααΈαα»αααα α
ααα»α
α
αΌαααααΎααααααααα
α‘αΎαα
αααααααΆαααΈααααααααΆααΎαα
αα (αααααΆααααΈα
ααα»α
ααααΆααααααΆααααΆαααΆα) α ααΌα
αααα ααΎαα
αΆααααααΆαααα½αααΆααΆ OPENα
αααααααΈααΈαα’αΆα ααααΌαααΆαααααΆαααΆααΆ αααα½ααααααααΆαααΆαααααααααααααααΉα. αααααΊααΆαααΆαααΆαααααααααα·ααΈααΆααααααααααααααΆαααααααΆααα·αααααΆααΆαααΎα ααΆααα·ααΆααααΆα’αααΈαααααααααα’αα·αααααΈαααααΌαααΆαααααΆααααααΌααααΆααα·αααααΆααα α αΌαααΎααα·α αΆαααΆαααααΎααααα’αΆα ααααΎααΆαα EAP - ααααΎαααα»α WPA-Enterprice αααααΆααααααΆαα ααααΎααΌαααααΆααα·ααααααααΎααααΈαααααααααΆαααα·αααααααααααααααΆαααααααΆααααα αΌαα SAE - ααααΎαααα»α WPA3 ααααα·αααααα αααααΉααααααΆαα brute α PSK - αααααΎαααΌαα αααα»ααααααΆαααααααααΉαααΆααααα αΌαααΆααααααααΆαααα·ααααααΌαααΆαααα»ααααααααααααΆαα’αα·αααααΈαα IEEE8021X - αααααΆααααααααΆαα’ααααααΆαα· (αα»αααΈα’αααΈαααααΆααααααααααα½ααΆα WPA)α OWE (Opportunistic Wireless Encryption) ααΊααΆααααααααααααααααααααΆα IEEE 802.11 αααααΆααα ααα»α αααααΎαα αΆααααΆααΆ OPENα OWE ααΆααΆαα»ααααα·ααΆααααα·αααααααααααΆααααααΌαααΆααααααΆαααααα·αααΆααα»ααααα·ααΆααααααΆαα’αα·αααααΈαααΆα αααααΎααα½αααα’αΆα ααααΎαα ααΆαααα αα αααααααα·αααΆαααα αΌα ααΌαα α αααααΎααααααΆ NONEα
αααΆαααΆααααααααΈααΈααΊααΆα’αααΈαααααα α ααΆα αααααααΆαααα’αα·αααααΈα β ααααβαααβααααααααΆααβααααΌαβααΆαβααααΎβααΎααααΈβααΆαααΆαβαα·ααααααβαααβααΆαβαααααΌαα α αΌαααΎαααΆααααααΈαααααΎαα WEP - ααααΎ RC4 stream cipher αααααΉααααααΆααααΊααΆααα’αα·αααααΈα αααααααΌαααΆαα αΆαααα»αααΆαα·αα’αΆα ααα½αααααΆααα αααα»ααα·ααααααΆαααααΈαααααΎαα TKIP - ααααΎαααα»α WPA, CKIP - αααα»α WPA2 α TKIP + CKIP - α’αΆα ααααΌαααΆααααααΆαααα αααα»αα ααα»α αααααΆααααααααΆα WPA αα·α WPA2 αααααΆααααΆαααααααΆαααααααα
αααα½αα±ααααΆαα»ααΈ α’αααα’αΆα ααααΎααααααΆ WEP α―ααα
[WEP]
ααΌα αααααΎαααΆααα·ααΆααααΆααΆαααΎ ααΆαααααααααΆααα αΎααααα»αααΆααα·ααααααΆααα’αααΈαααα½ααααααααΆααααααΆααααΆαααααΎααααΆαααα ααααα·αααΆα αα·ααα·ααΈααΆαααααα’αα·αααααΈα αααααΆαααααααααΌα ααααΆααΆαααααΆαααΎαα
α₯α‘αΌααα·α αΆαααΆαααααααααα
[ESS]
ααα ααααααααα·ααααα·ααΆα Wi-Fi α¬ αα ααΆαααααααααααααΆα Wi-Fi. α’αααα’αΆα αα½αααααααααα BSS (Basic Service Set) - αα ααααααααΆαα ααα»α α αΌαααααΎαααΆααα½αααΆααααα§ααααααααααΆαααααΆααααααΆααααααα α’αΆα ααααΆααα ααΎαααααΆααααα»ααααα»αα ααΆααααα½α α ααα»α α αΌαααααΎααΊααααΌαααΆαααΆα αΆαααΆα αααΎααααΈααααΆααα§αααααααΈαααααΆαααΌαααααΆαααααααααααΆ ααΌα αααααα½αααΆααΆααααααααααα»αααααΆαααααααααα - ESS α αααααα IBSSs (Independent Basic Service Sets) αααα αΆαααΆα§ααααααααααΊααΆααααααα½ααααααααΆα Peer-to-Peer α
α’αααααα’αΆα ααΎαααα WPSα
[WPS]
WPS (Wi-Fi Protected Setup) ααΊααΆαα·ααΈααΆααααααΆααααΆαα αΆααααααΎαααΆαααααααΆαααααααααααααα·αααααααΆα Wi-Fi α ααΎααααΈα αΆααααααΎα α’αααααααΎααααΆαααααα αΌαααΆααααααααΆαα 8 αα½α’αααα α¬α α»α αααΌαα»ααα ααΎαααααααα ααααα·αααΎα ααα»α α αΌαααααΎαααΆαααααα’αααααΆααααααααΈαα½α α αΎααααα’ααααΈααααααα α‘αΎααα ααΆααααΉααααααα ααα»α α αΌαααααΎαααΆαααααα’ααα α’αααααααΌαααΆαααααΆααααΆαααααΆααα±ααα αΌααα ααΆααααααΆααααααααααα α αΎααα·αααΆαα αΌαααααΎ WPS α ααΆααα·αααΊααΆ ααΆααΉαααΆααααΌα PIN 8 αααααα’αΆα ααααΌαααΆαααααΎααααα’αΆααααααΆα 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 αα·αααααααααα»αααΆα rummage ααΆααααααααααααα―αααΆαααΎααααΈα’αΆα wpa_supplicant.conf α ααααα·αααΎαααααα·ααααΆαααααα·ααΈαααααΌαα±αααααα
αΌαααΆααααααααΆααααΈααΆααααα
ααΆααααααΆααα’αΆα
ααααΌαααΆαααααΎα‘αΎαααΆααααααααΆαα
ααααααΈα
ααααα·αααΎα’ααααα·αααΆααΆαα’αααΈααααΌααααααα α¬αααααααΌα ααΌαααααααααα»αααα·ααααα :)
ααααα: www.habr.com