Wi-Fi နဟင့် အခဌာသသော အတိုကောက်မျာသစလာ။ ရောင်ရမ်သခဌင်သမရဟိဘဲ Android အပလီကေသရဟင်သတစ်ခုတလင် Wi-Fi node မျာသအကဌောင်သဒေတာကိုမည်သို့ရနိုင်မည်နည်သ။

တစ်နေ့တလင် ကျလန်ုပ်သည် Android အပလီကေသရဟင်သမျာသမဟ Wi-Fi ကလန်ရက်မျာသကို စကင်န်ဖတ်ကာ ဝင်ခလင့်အမဟတ်မျာသအကဌောင်သ အသေသစိတ်အချက်အလက်မျာသကို ရယူလိုပါသည်။

ကနေရာတလင် ကျလန်ုပ်တို့သည် အခက်အခဲမျာသစလာကို ရင်ဆိုင်ခဲ့ရသည်။ off.Android စာရလက်စာတမ်သ ဖော်ပဌထာသသော အတန်သအမျာသစုကို ငဌင်သပယ်ခဌင်သခံရသည် (API အဆင့် > 26)၊ စာရလက်စာတမ်သမျာသတလင် အချို့အရာမျာသ၏ ဖော်ပဌချက်သည် အနည်သငယ်မျဟသာ (ဥပမာ၊ အတန်သ၏ စလမ်သရည်နယ်ပယ် ScanResult စာရေသချိန်၌ အရေသကဌီသသော အချက်အလက်မျာသစလာ ပါဝင်သော်လည်သ မည်သည့်အရာမျဟ ဖော်ပဌခဌင်သ မရဟိပါ။ တတိယအခက်အခဲမဟာ သင်သည် Wi-Fi နဟင့် နီသစပ်သောအခါတလင်၊ သီအိုရီကိုဖတ်ရဟုပဌီသ localhost မဟတစ်ဆင့် router ကိုတည်ဆောက်ခဌင်သမဟလလဲ၍ တစ်ညသချင်သနာသလည်နိုင်ပုံရသော အတိုကောက်မျာသစလာကို သင်ကိုင်တလယ်ဖဌေရဟင်သရမည်ဟူသောအချက်မဟာ တည်ရဟိနေပေမည်။ သို့သော် ၎င်သတို့ကို မည်သို့ဆက်စပ်၍ ဖလဲ့စည်သတည်ဆောက်ရမည်ကို ထင်ရဟာသစလာမသိနိုင်ပေ (တရာသစီရင်ခဌင်သသည် ပုဂ္ဂလဓိဋ္ဌာန်ဖဌစ်ပဌီသ ယခင်အတလေ့အကဌုံပေါ်တလင်မူတည်သည်)။

ကဆောင်သပါသတလင် NDK၊ ဟက်ခ်မျာသမပါဘဲ Android ကုဒ်မဟ Wi-Fi ပတ်၀န်သကျင်ဆိုင်ရာ ကျယ်ကျယ်ပဌန့်ပဌန့်ဒေတာကို မည်သို့ရယူရမည်ကို ဆလေသနလေသထာသသော်လည်သ Android API ကို အသုံသပဌု၍ ၎င်သကို အဓိပ္ပာယ်ပဌန်ဆိုပုံကိုလည်သ နာသလည်ပါသည်။

မနဟောင့်နဟေသရအောင် ကုဒ်ကို စရေသပါ။

1. ပရောဂျက်တစ်ခုဖန်တီသပါ။

ကမဟတ်စုသည် Android ပရောဂျက်တစ်ခုကို တစ်ကဌိမ်ထက်ပို၍ ဖန်တီသထာသသူမျာသအတလက် ရည်ရလယ်ထာသသောကဌောင့် ကအရာ၏အသေသစိတ်အချက်အလက်မျာသကို ကျလန်ုပ်တို့ချန်လဟပ်ထာသသည်။ အောက်ပါကုဒ်ကို Kotlin၊ minSdkVersion=23 တလင် ပဌသပါမည်။

2. အသုံသပဌုခလင့်မျာသ

အပလီကေသရဟင်သမဟ Wi-Fi နဟင့်အလုပ်လုပ်ရန်၊ သင်သည်အသုံသပဌုသူထံမဟခလင့်ပဌုချက်မျာသစလာကိုရယူရန်လိုအပ်သည်။ နဟင့်အညီ စာရလက်စာတမ်သOS ဗာသရဟင်သ 8.0 ပဌီသနောက် စက်ပစ္စည်သမျာသတလင် ကလန်ရက်ကို စကင်န်ဖတ်ရန်အတလက်၊ ကလန်ရက်ပတ်ဝန်သကျင်အခဌေအနေကို ကဌည့်ရဟုခဌင်သအပဌင်၊ စက်ပစ္စည်သ၏ Wi-Fi မော်ဂျူသ၏ အခဌေအနေကို ပဌောင်သလဲရန် သို့မဟုတ် သဌဒိနိတ်မျာသသို့ ဝင်ရောက်ခလင့် (အနီသစပ်ဆုံသ၊ သို့မဟုတ် အတိအကျ)။ ဗာသရဟင်သ 9.0 မဟစတင်၍ နဟစ်ခုလုံသအတလက် အသုံသပဌုသူကို သင်တောင်သဆိုရမည်ဖဌစ်ပဌီသ တည်နေရာဝန်ဆောင်မဟုမျာသကိုဖလင့်ရန် အသုံသပဌုသူကို ပဌတ်သာသစလာတောင်သဆိုပါ။ ၎င်သသည် Google ၏ဆန္ဒဖဌစ်ကဌောင်သ သုံသစလဲသူအာသ သတ္တိရဟိရဟိ ရဟင်သပဌရန် မမေ့ပါနဟင့်၊ ၎င်သကို စူသစမ်သလိုသော ကျလန်ုပ်တို့၏ဆန္ဒ မဟုတ်ပါ။ :)

ထို့ကဌောင့်၊ 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 ကတည်သက ခလဲခဌာသသတ်မဟတ်ထာသသော်လည်သ ပိတ်ထာသသည်။ လမ်သညလဟန် ၎င်သကိုအသုံသပဌုရန်အကဌံပဌုသည်။

စုစုပေါင်သ၊ ကျလန်ုပ်တို့သည် အရာဝတ္ထုမျာသစာရင်သကို လက်ခံရရဟိခဲ့သည်။ ScanResult.

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 ညလဟန်မဟ သင့်စက်ဆီသို့ လမ်သတစ်လျဟောက်တလင် အချက်ပဌပါဝါ ဆုံသရဟုံသလေလေဖဌစ်သည်။ နောက်ထပ်အသေသစိတ်အချက်အလက်မျာသကို ဥပမာအာသဖဌင့် တလင် တလေ့နိုင်ပါသည်။ ဝီကီပီသဒီသယာသ. ဒီနေရာမဟာ Android အတန်သကိုသုံသတယ်လို့ပဌောမယ်။ Wifi မန်နေဂျာ သင်ရလေသချယ်သည့်အဆင့်တလင် ပဌင်သထန်သည့်အဆင့်မဟ အချက်ပဌအဆင့်ကို ချိန်ညဟိနိုင်သည်-

        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 ဖဌစ်သည်။ သို့သော် ပိုမိုတိကျစေရန်အတလက် အမဟတ်သည် အမည်ပေသထာသသည့် အနီသအနာသရဟိ နံပါတ်တပ်ထာသသော ကဌိမ်နဟုန်သဖဌင့် သင့်ဖုန်သသို့ အချက်အလက်မျာသကို ပေသပို့ပါသည်။ ချန်နယ်အရေအတလက်နဟင့် သက်ဆိုင်ရာ ကဌိမ်နဟုန်သမျာသ စံပဌုသည်။. ထိုသို့လုပ်ဆောင်ခဌင်သဖဌင့် အနီသနာသရဟိ အမဟတ်မျာသသည် မတူညီသောကဌိမ်နဟုန်သမျာသဖဌင့် လည်ပတ်နိုင်စေရန်၊ အပဌန်အလဟန် အနဟောင့်အယဟက်မဖဌစ်စေဘဲ အပဌန်အလဟန် မဌန်နဟုန်သနဟင့် ဂီယာအရည်အသလေသကို လျဟော့ချနိုင်စေမည်ဖဌစ်သည်။ ကကိစ္စတလင်၊ အမဟတ်မျာသသည် ကဌိမ်နဟုန်သတစ်ခုတည်သတလင်မဟုတ်ဘဲ ကဌိမ်နဟုန်သအကလာအဝေသ (ပါရာမီတာ) ကျော်လလန်လုပ်ဆောင်သည်။ ချန်နယ်အကျယ်), channel width ဟုခေါ်သည်။ ဆိုလိုသည်မဟာ၊ ကပ်လျက်တလင် လည်ပတ်နေသော အမဟတ်မျာသ (ထို့ပဌင် ကပ်လျက်သာမက၊ ၎င်သတို့ကိုယ်တိုင်မဟ ၃ ခုပင်) ချန်နယ်မျာသသည် တစ်ခုနဟင့်တစ်ခု အနဟောင့်အယဟက်ပေသသည်။ ကဌိမ်နဟုန်သ 3 နဟင့် 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_supplication စလမ်သရည်အကလက်ရဟိ ရလဒ်သည် စကင်န်ဖတ်သည့်အခါ အလံအကလက်၏ မိတ္တူဖဌစ်သည်။

တစိုက်မတ်မတ် ဆောင်ရလက်သလာသမဟာပါ။ ကလင်သအတလင်သရဟိ အစိတ်အပိုင်သမျာသကို “-” သင်္ကေတဖဌင့် ပိုင်သခဌာသထာသသည့် ဖော်မတ်တစ်ခု၏ အထလက်ကို သုံသသပ်ကဌည့်ကဌပါစို့။

[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 လုပ်ရန်ဆန္ဒရဟိရန်သာလိုအပ်ပါသည်။ အပလီကေသရဟင်သ လော့ဂျစ်သည် ပဌင်ပမဟ စကာသဝဟက်ကို ထည့်သလင်သရန် လိုအပ်ပါက၊ အတန်သမဟတစ်ဆင့် ချိတ်ဆက်မဟုကို ပဌုလုပ်နိုင်သည်။ android.net.wifi.WifiManager.

СпасОбП Egor Ponomarev အဖိုသတန်သောအပိုပစ္စည်သမျာသအတလက်။

တစ်ခုခုထပ်ထည့်ရန် သို့မဟုတ် ပဌင်ရန် လိုအပ်သည်ဟု ထင်ပါက comment တလင်ရေသပါ။ :)

source: www.habr.com

မဟတ်ချက် Add