Wi-Fi le likhutsufatso tse ling tse ngata. Mokhoa oa ho fumana data mabapi le li-node tsa Wi-Fi ts'ebelisong ea Android ntle le ho ruruha

Ka letsatsi le leng ke ne ke hloka ho hlahloba marang-rang a Wi-Fi ho tsoa lits'ebetsong tsa Android le ho fumana lintlha tse qaqileng mabapi le libaka tsa phihlello.

Mona re ile ra tlameha ho tobana le mathata a 'maloa: off.Android litokomane lihlopha tse ngata tse hlalositsoeng li ile tsa fokotseha (boemo ba API> 26), bo neng bo sa bonahale ho eona; tlhaloso ea lintho tse ling litokomaneng e fokola (mohlala, sebaka sa bokhoni ba sehlopha ScanResult nakong ea ho ngola, hoo e ka bang ha ho letho le hlalosoang, le hoja le na le boitsebiso bo bongata ba bohlokoa). Bothata ba boraro bo ka 'na ba e-ba teng tabeng ea hore ha u qala ho atamela Wi-Fi, ntle le ho bala khopolo le ho theha router ka localhost, u tlameha ho sebetsana le likhetho tse ngata tse bonahalang li utloahala ka bomong. Empa ho ka 'na ha se ke ha hlaka mokhoa oa ho li amahanya le ho li hlophisa (kahlolo e itšetlehile ka phihlelo ea pele).

Sengoliloeng sena se bua ka mokhoa oa ho fumana lintlha tse felletseng mabapi le tikoloho ea Wi-Fi ho tsoa ho khoutu ea Android ntle le NDK, hacks, empa feela ka ho sebelisa Android API le ho utloisisa mokhoa oa ho e hlalosa.

Ha re liehe ebe re qala ho ngola khoutu.

1. Etsa morero

Molaetsa ona o reretsoe ba thehileng morero oa Android ho feta hanngoe, kahoo re siea lintlha tsa ntho ena. Khoutu e ka tlase e tla hlahisoa ho Kotlin, minSdkVersion=23.

2. Litumello tsa phihlello

Ho sebetsa le Wi-Fi ho tsoa ts'ebelisong, o tla hloka ho fumana litumello tse 'maloa ho tsoa ho mosebelisi. Ho latela litokomane, e le hore u hlahlobe marang-rang ka lisebelisoa tse nang le liphetolelo tsa OS ka mor'a 8.0, ho phaella ho fihlella ho bona boemo ba tikoloho ea marang-rang, u hloka ho fumana monyetla oa ho fetola boemo ba mochine oa Wi-Fi oa mochine, kapa ho fihlella ho li-coordinate (hoo e ka bang ha e le hantle) kapa hantle). Ho qala ka mofuta oa 9.0, o tlameha ho khothaletsa mosebelisi bakeng sa bobeli, hape o kope mosebelisi ka mokhoa o hlakileng ho bulela lits'ebeletso tsa sebaka. Se ke oa lebala ho hlalosetsa mosebelisi hore sena ke maikutlo a Google, eseng takatso ea rona ea ho mo hloela :)

Kahoo, ho AndroidManifest.xml re tla eketsa:

    <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"/>

'Me ho khoutu e nang le sehokelo sa Ts'ebetso ea hajoale:

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. Etsa BroadcastReceiver 'me u ingolise ho liketsahalo tsa ntlafatso ea data mabapi le ho hlahloba tikoloho ea marang-rang a 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
}

Mokhoa oa WiFiManager.startScan litokomaneng o tšoailoe ha o sa sebelisoe ho tloha ka mofuta oa 28 oa API, empa o felile. tataise e fana ka maikutlo a ho e sebelisa.

Ka kakaretso, re fumane lethathamo la lintho ScanResult.

4. Sheba ho ScanResult 'me u utloisise mantsoe

Ha re shebeng likarolo tse ling tsa sehlopha sena mme re hlalose hore na li bolela eng:

SSID — Identifier Set ya Tshebeletso ke lebitso la netweke

BSSID - Sets'oants'o sa Ts'ebeletso ea Motheo - Aterese ea MAC ea adaptara ea marang-rang (ntlha ea Wi-Fi)

ho bophahamo ba - Received Signal Strength Indicator [dBm (Russian dBm) - Decibel, matla a referense 1 mW.] - Pontšo ea matla a mats'oao a amohetseng. E nka boleng ho tloha ho 0 ho ea ho -100, ho feta ho tloha ho 0, matla a lets'oao a ile a lahleha ho tloha sebakeng sa Wi-Fi ho ea sesebelisoa sa hau. Lintlha tse ling li ka fumanoa, mohlala, ho Wikipedia. Mona ke tla u bolella hore ho sebelisa sehlopha sa Android WifiManejara o ka lekanya boemo ba lets'oao ka sekala ho tloha ho se setle ho isa ho se tšabehang mohatong oo u o khethang:

        val wifiManager = context.applicationContext.getSystemService(Context.WIFI_SERVICE) as WifiManager
        val numberOfLevels = 5
        val level = WifiManager.calculateSignalLevel(level, numberOfLevels)

maqhubu - maqhubu a ts'ebetso ea sebaka sa Wi-Fi [Hz]. Ho phaella ho frequency ka boeona, u ka 'na ua thahasella seo ho thoeng ke mocha. Ntlha ka 'ngoe e na le bohloeki ba eona ba ts'ebetso. Nakong ea ho ngola, sebaka se tsebahalang haholo sa libaka tsa Wi-Fi ke 2.4 GHz. Empa, ho bua ka nepo, ntlha e fetisetsa tlhahisoleseling fonong ea hau ka makhetlo a mangata a haufi le a boletsoeng. Palo ea likanale le maqhubu a lumellanang standardized. Sena se etsoa e le hore lintlha tse haufi li sebetse ka maqhubu a fapaneng, kahoo li se ke tsa kena-kenana le tse ling 'me li se ke tsa fokotsa lebelo le boleng ba phetisetso. Tabeng ena, lintlha ha li sebetse ka makhetlo a le mong, empa li feta mefuta e mengata ea maqhubu (parameter channelWidth), e bitsoang bophara ba kanale. Ke hore, lintlha tse sebetsang haufi (mme eseng feela haufi, empa esita le tse 3 tse tsoang ho tsona) li kena-kenana. U ka fumana khoutu ena e bonolo e le molemo, e u lumellang hore u bale nomoro ea mocha ho tloha ho boleng ba maqhubu a lintlha ka makhetlo a 2.4 le 5 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
            }
        }

Bokhoni - sebaka se khahlisang haholo bakeng sa tlhahlobo, mosebetsi o hlokang nako e ngata. Mona "bokhoni" ba ntlha bo ngotsoe moleng. Tabeng ena, ha ho hlokahale hore u batle lintlha tsa tlhaloso ea likhoele litokomaneng. Mehlala ke ena ea se ka bang teng moleng ona:

[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. Ho utloisisa likhutsufatso le bokhoni ba ho arola

Ho bohlokoa ho bolela hore lihlopha tsa sephutheloana sa android.net.wifi.* li sebelisoa tlas'a hood ke lisebelisoa tsa Linux. wpa_mokopi 'me sephetho sa sephetho tšimong ea bokhoni ke kopi ea lebala la lifolakha ha u hlahloba.

Re tla nka khato kamehla. Ha re qale ka ho nahana ka tlhahiso ea sebopeho seo likarolo tse ka hare ho masaka li arohanngoa ka "-" letšoao:

[WPA-PSK-TKIP+CCMP]
[WPA2-PSK-CCMP]

Moelelo oa pele o hlalosa se bitsoang. mokgoa wa netefatso. Ke hore, ke tatellano efe ea liketso tse lokelang ho etsoa ke sesebelisoa le sebaka sa ho fihlella e le hore sebaka sa ho fihlella se itumelle hore se sebelisoe le mokhoa oa ho patala moroalo oa moputso. Nakong ea ho ngola poso ena, likhetho tse atileng haholo ke WPA le WPA2, eo ebang sesebelisoa se seng le se seng se hokahaneng ka kotloloho kapa ka se bitsoang. Seva ea RADIUS (WPA-Enterprice) e fana ka senotlolo holim'a mocha o kentsoeng. Ho ka etsahala hore ebe sebaka sa ho fihlella lapeng la hau se fana ka khokahano ho latela morero ona. Phapang lipakeng tsa mofuta oa bobeli le oa pele ke hore e na le cipher e matla: AES khahlano le TKIP e sa sireletsehang. WPA3, e rarahaneng le e tsoetseng pele haholoanyane, le eona e ntse e hlahisoa butle-butle. Ka khopolo, ho ka 'na ha e-ba le khetho ka tharollo ea khoebo CCKM (Cisco Centralized Key Management), empa ha ke e-s'o kopane le eona.

Sebaka sa ho kena se ka be se lokiselitsoe ho netefatsa ka aterese ea MAC. Kapa, ​​​​haeba sebaka sa ho fihlella se fana ka data ho sebelisa algorithm ea WEP e siiloeng ke nako, joale ha e le hantle ha ho na bopaki (senotlolo sa lekunutu mona ke senotlolo sa encryption). Re beha likhetho tse joalo ka tse LING.
Ho boetse ho na le mokhoa o tsebahalang ho wi-fi ea sechaba e nang le ho patoa Captive Portal Detection - kopo ea netefatso ka sebatli. Lintlha tse joalo tsa phihlello li hlaha ho seskena li butsoe (tseo li leng teng ho tloha ponong ea khokahano ea 'mele). Ka hona, re li arola e le HO BULELA.

Boleng ba bobeli bo ka hlalosoa e le algorithm ea bohlokoa ea taolo. Ena ke parameter ea mokhoa oa ho netefatsa o hlalositsoeng ka holimo. E bua ka hantle hore na linotlolo tsa encryption li fapanyetsanoa joang. A re hlahlobeng mekhoa e ka khonehang. EAP - e sebelisitsoeng ho WPA-Enterprice e boletsoeng, e sebelisa database ho netefatsa lintlha tse kentsoeng tsa netefatso. SAE - e sebelisoa ho WPA3 e tsoetseng pele, e hanyetsanang le matla a sehlōhō. PSK - khetho e tloaelehileng ka ho fetisisa, e kenyelletsa ho kenya phasewete le ho e fetisetsa ka mokhoa o patiloeng. IEEE8021X - ho latela maemo a machaba (o fapaneng le a tšehetsoang ke lelapa la WPA). OWE (Opportunistic Wireless Encryption) ke katoloso ea maemo a IEEE 802.11 bakeng sa lintlha tseo re li khethileng e le OPEN. OWE e netefatsa ts'ireletso ea data e fetisoang marang-rang a sa sireletsehang ka ho e ngolla. Khetho e ka khonahala hape ha ho se na linotlolo tsa phihlello, ha re bitse khetho ena HONA.

Ea boraro parameter ke seo ho thoeng ke. meralo ea encryption - hore na cipher e sebelisoa joang ho sireletsa data e fetisitsoeng. Ha re thathamiseng likhetho. WEP - e sebelisa RC4 stream cipher, senotlolo sa lekunutu ke senotlolo sa encryption, se nkoang se sa amohelehe lefatšeng la li-cryptography tsa kajeno. TKIP - e sebelisitsoeng ho WPA, CKIP - ho WPA2. TKIP+CKIP - e ka hlalosoa ka lintlha tse khonang ho WPA le WPA2 bakeng sa ho lumellana ha morao.

Sebakeng sa lintlha tse tharo, o ka fumana letšoao le le leng la WEP:

[WEP]

Joalokaha re buile ka holimo, sena se lekane ho se hlalose algorithm ea ho sebelisa linotlolo, e leng sieo, le mokhoa oa ho kenyelletsa, o ts'oanang le oa kamehla.

Joale nahana ka bracket ena:

[ESS]

sena Mokhoa oa ho sebetsa oa Wi-Fi kapa Topology ea marang-rang a Wi-Fi. U ka kopana le mokhoa oa BSS (Basic Service Set) - ha ho na le sebaka se le seng sa ho fihlella seo lisebelisoa tse hokahaneng li buisanang ka tsona. E ka fumaneha marang-rang a lehae. Joalo ka molao, lintlha tsa phihlello lia hlokahala ho hokahanya lisebelisoa tse tsoang marang-rang a fapaneng a lehae, kahoo ke karolo ea Lits'ebeletso tse Atolositsoeng - ESS. Mofuta oa IBSSs (Independent Basic Service Sets) o bontša hore sesebelisoa ke karolo ea marang-rang a Peer-to-Peer.

U ka boela ua bona folakha ea WPS:

[WPS]

WPS (Wi-Fi Protected Setup) ke protocol ea ho qalisoa ha netweke ea Wi-Fi ka mokhoa o iketsang. Ho qala, mosebelisi o kenya phasewete ea litlhaku tse 8 kapa o tobetsa konopo ho router. Haeba sebaka sa hau sa phihlello e le sa mofuta oa pele mme lebokose lena la tlhahlobo le hlaha haufi le lebitso la sebaka sa hau sa phihlello, u khothaletsoa ka matla hore u ee phanele ea tsamaiso le ho tima phihlello ea WPS. 'Nete ke hore hangata PIN ea linomoro tse 8 e ka fumanoa ke aterese ea MAC, kapa e ka hlophisoa ka nako e lebelloang, eo motho e mong a ka e nkang ka ho se tšepahale.

6. Etsa mohlala le mosebetsi oa ho arola

Ho latela seo re se fumaneng ka holimo, re tla hlalosa se etsahetseng ho sebelisoa lihlopha tsa data:

/* схема аутентификации */
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.
}

Joale ha re ngole ts'ebetso e tla bapisa karolo ea bokhoni:


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. Bona sephetho

Ke tla hlahloba marang-rang 'me ke u bontše seo ke se fumaneng. Ho bontšitsoe liphetho tsa tlhahiso e bonolo ka Log.d:

Capability of Home-Home [WPA2-PSK-CCMP][ESS][WPS]
...
capabilities=[Capability(authScheme=WPA2, keyManagementAlgorithm=PSK, cipherMethod=CCMP)], topologyMode=ESS, availableWps=true

Taba ea ho hokahanya le marang-rang ho tloha khoutu ea kopo e ile ea lula e sa hlahlojoe. Ke tla re feela e le hore u bale li-passwords tse bolokiloeng ho tloha ho OS ea mochine oa selefouno, u hloka litokelo tsa metso le boikemisetso ba ho senya tsamaiso ea lifaele ho bala wpa_supplicant.conf. Haeba logic ea kopo e hloka ho kenya phasewete ho tsoa kantle, khokahano e ka etsoa ka sehlopha android.net.wifi.WifiManager.

Спасибо Egor Ponomarev bakeng sa litlatsetso tsa bohlokoa.

Haeba u nahana hore ho na le ho hong ho hlokang ho eketsoa kapa ho lokisoa, ngola maikutlong :)

Source: www.habr.com

Eketsa ka tlhaloso