Wi-nkaus thiab ntau lwm cov lus luv. Zoo li hauv Android Tau txais cov ntaub ntawv hais txog Wi-Fi nodes hauv lub app yam tsis muaj kev ntxhov siab

Muaj ib hnub kuv xav tau scan los ntawm Android Cov ntawv thov network Wi-nkaus thiab tau txais cov ntaub ntawv ntxaws ntxaws txog cov chaw nkag mus.

Ntawm no peb yuav tsum tau ntsib ntau yam teeb meem: cov ntaub ntawv pov thawj Android ntau ntawm cov chav kawm uas tau piav qhia tau dhau los ua tsis pom zoo (API qib> 26), uas tsis tau xav txog hauv nws; cov lus piav qhia ntawm qee yam hauv cov ntaub ntawv muaj tsawg heev (piv txwv li, lub peev xwm ntawm chav kawm ScanResult thaum lub sijhawm sau ntawv, yuav luag tsis muaj dab tsi piav qhia, txawm hais tias nws muaj ntau cov ntaub ntawv tseem ceeb). Qhov teeb meem thib peb tuaj yeem dag nyob rau hauv qhov tseeb tias thaum koj thawj zaug ze rau Wi-Fi, tsis yog nyeem cov kev xav thiab teeb tsa lub router ntawm localhost, koj yuav tsum tau nrog ntau cov ntawv luv uas zoo li nkag siab ib tus zuj zus. Tab sis nws yuav tsis pom tseeb tias yuav cuam tshuam li cas thiab teeb tsa lawv (kev txiav txim siab yog cov ntsiab lus thiab nyob ntawm qhov kev paub dhau los).

Tsab xov xwm no tham txog yuav ua li cas Android code kom tau txais cov ntaub ntawv tiav txog Wi-nkaus ib puag ncig yam tsis muaj NDK, hacks, tab sis tsuas yog nrog kev pab los ntawm Android APIs thiab nkag siab yuav ua li cas txhais lawv.

Cia peb tsis ncua thiab pib sau cov lej.

1. Tsim ib qhov project

Daim ntawv no yog rau cov neeg uas tau tsim ntau dua ib zaug Android project, yog li peb yuav hla cov ntsiab lus ntawm ntu no. Cov lej hauv qab no yuav raug nthuav tawm hauv Kotlin, minSdkVersion = 23.

2. Kev tso cai nkag

Txhawm rau ua haujlwm nrog Wi-nkaus los ntawm daim ntawv thov, koj yuav tsum tau txais ntau qhov kev tso cai los ntawm tus neeg siv. Raws li cov ntaub ntawvTxhawm rau luam theej duab lub network ntawm cov khoom siv nrog OS versions tom qab 8.0, ntxiv rau kev nkag mus saib lub xeev ntawm lub network ib puag ncig, koj xav tau kev nkag mus hloov lub xeev ntawm lub cuab yeej Wi-Fi module, lossis nkag mus rau kev tswj hwm (kwv yees los yog tseeb). Pib nrog version 9.0, koj yuav tsum hais kom tus neeg siv rau ob qho tib si, thiab tseem thov kom tus neeg siv qhib qhov chaw pabcuam. Tsis txhob hnov ​​qab piav qhia rau tus neeg siv tias qhov no yog Google lub siab nyiam, thiab tsis yog peb lub siab xav soj xyuas nws :)

Tag nrho, nyob rau hauv AndroidNtxiv Manifest.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"/>

Thiab nyob rau hauv cov cai uas muaj qhov txuas mus rau Kev Ua Haujlwm tam sim no:

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. Tsim BroadcastReceiver thiab sau npe rau cov ntaub ntawv hloov tshiab cov xwm txheej txog kev luam theej duab Wi-Fi network ib puag ncig

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
}

Txoj kev WiFiManager.startScan nyob rau hauv cov ntaub ntawv yog cim raws li depricated txij li thaum API version 28, tab sis tawm. coj qhia siv nws.

Nyob rau hauv tag nrho, peb tau txais ib daim ntawv teev cov khoom ScanResult.

4. Saib ScanResult thiab nkag siab cov ntsiab lus

Cia peb saib qee qhov chaw ntawm chav kawm no thiab piav qhia tias lawv txhais li cas:

SSID - Service Set Identifier yog lub npe ntawm lub network

Bssid - Basic Service Set Identifier - MAC chaw nyob ntawm lub network adapter (Wi-Fi point)

theem — Tau txais Cov Teeb Meem Lub Zog [dBm (Lavxias teb sab dBm) — Decibel, siv lub zog 1 mW.] — Qhov taw qhia ntawm lub zog tau txais. Siv tus nqi ntawm 0 mus rau -100, qhov ntxiv los ntawm 0, ntau lub teeb liab lub zog tau ploj ntawm txoj kev los ntawm Wi-Fi taw tes rau koj lub cuab yeej. Xav paub ntau ntxiv tuaj yeem pom, piv txwv li, ntawm WikipediaHauv no kuv yuav qhia koj seb yuav ua li cas nrog kev pab los ntawm Android chav kawm WifiManager koj tuaj yeem calibrate lub teeb liab theem ntawm qhov ntsuas los ntawm zoo heev mus rau txaus ntshai nyob rau hauv cov kauj ruam koj xaiv:

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

zaus - Kev khiav hauj lwm zaus ntawm Wi-Fi point [Hz]. Ntxiv rau qhov zaus nws tus kheej, tej zaum koj yuav txaus siab rau lub npe channel. Txhua lub ntsiab lus muaj nws tus kheej ua haujlwm purity. Thaum lub sijhawm sau ntawv, qhov nrov tshaj plaws ntawm Wi-Fi cov ntsiab lus yog 2.4 GHz. Tab sis, kom paub meej dua, cov ntsiab lus xa cov ntaub ntawv rau koj lub xov tooj ntawm tus lej lej ze rau lub npe. Tus naj npawb ntawm cov channel thiab cov zaus sib thooj txheem. Qhov no yog ua kom cov ntsiab lus nyob ze ua haujlwm ntawm cov zaus sib txawv, yog li tsis cuam tshuam rau ib leeg thiab tsis sib koom txo qhov ceev thiab qhov zoo ntawm kev sib kis. Hauv qhov no, cov ntsiab lus tsis ua haujlwm ntawm ib zaus, tab sis dhau ntawm ntau zaus (parameter channelWidth), hu ua channel dav. Ntawd yog, cov ntsiab lus ua haujlwm nyob ib sab (thiab tsis yog nyob ib sab, tab sis txawm tias 3 los ntawm lawv tus kheej) cov kev cuam tshuam rau ib leeg. Koj tuaj yeem pom cov lej yooj yim no muaj txiaj ntsig, uas tso cai rau koj suav cov lej channel los ntawm tus nqi zaus rau cov ntsiab lus nrog zaus ntawm 2.4 thiab 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
            }
        }

muaj peev xwm - qhov nthuav dav tshaj plaws rau kev tsom xam, ua haujlwm nrog uas yuav tsum tau siv sijhawm ntau. Ntawm no "muaj peev xwm" ntawm cov ntsiab lus tau sau rau hauv kab. Hauv qhov no, koj tsis tas yuav nrhiav cov ntsiab lus ntawm txoj hlua txhais hauv cov ntaub ntawv. Nov yog qee qhov piv txwv ntawm qhov yuav muaj nyob hauv kab no:

[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. Kev nkag siab txog cov ntawv luv thiab muaj peev xwm txheeb xyuas

Nws yog tsim nyog hais tias cov chav kawm ntawm android.net.wifi.* pob yog siv nyob rau hauv lub hood los ntawm ib tug Linux nqi hluav taws xob wpa_sublicant thiab cov txiaj ntsig tau tshwm sim hauv thaj chaw muaj peev xwm yog ib daim qauv ntawm cov chij teb thaum scanning.

Peb yuav ua tsis tu ncua. Cia peb pib xav txog qhov tso zis ntawm ib hom ntawv uas cov ntsiab lus hauv kab lus sib cais los ntawm "-" kos npe:

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

Thawj lub ntsiab lus piav txog qhov hu ua. authentication txoj kev. Ntawd yog, dab tsi ua ntu zus ntawm kev nqis tes ua yuav tsum lub cuab yeej thiab qhov chaw nkag mus ua kom nkag mus rau qhov chaw tso cai rau nws tus kheej siv thiab yuav ua li cas rau encrypt lub payload. Thaum lub sijhawm sau cov ntawv no, cov kev xaiv ntau tshaj plaws yog WPA thiab WPA2, uas yog txhua yam khoom siv txuas ncaj qha lossis los ntawm lub npe hu ua. RADIUS neeg rau zaub mov (WPA-Enterprice) muab tus password hla ib qho channel encrypted. Feem ntau yuav, qhov chaw nkag hauv koj lub tsev muab kev sib txuas raws li cov tswv yim no. Qhov txawv ntawm qhov thib ob version thiab thawj yog tias nws muaj lub zog cipher: AES piv rau TKIP tsis ruaj ntseg. WPA3, uas yog qhov nyuaj dua thiab qib siab, kuj tau maj mam pib. Raws li txoj cai, tej zaum yuav muaj kev xaiv nrog cov kev daws teeb meem enterprice CCKM (Cisco Centralized Key Management), tab sis kuv tsis tau pom dua.

Qhov chaw nkag tau yuav raug teeb tsa kom lees paub los ntawm MAC chaw nyob. Los yog, yog tias qhov chaw nkag tau muab cov ntaub ntawv siv WEP algorithm dhau los, ces tsis muaj kev lees paub tseeb (tus yuam sij zais cia ntawm no yog tus yuam sij encryption). Peb faib cov kev xaiv xws li OTHER.
Kuj tseem muaj ib txoj hauv kev uas nrov hauv pej xeem wi-fi nrog zais Captive Portal Detection - ib qho kev thov kev lees paub los ntawm qhov browser. Xws li cov ntsiab lus nkag tau tshwm sim rau lub scanner li qhib (uas lawv yog los ntawm qhov pom ntawm qhov kev sib txuas ntawm lub cev). Yog li ntawd, peb faib lawv li OPEN.

Tus nqi thib ob tuaj yeem txhais tau tias yog key tswj algorithm. Qhov no yog ib qho parameter ntawm authentication txoj kev piav saum toj no. Tham txog yuav ua li cas pauv cov yuam sij encryption. Cia peb xav txog cov kev xaiv ua tau. EAP - siv nyob rau hauv WPA-Enterprice tau hais, siv cov ntaub ntawv los txheeb xyuas cov ntaub ntawv pov thawj nkag. SAE - siv nyob rau hauv advanced WPA3, ntau resistant rau brute quab yuam. PSK - qhov kev xaiv ntau tshaj plaws, suav nrog nkag mus rau tus password thiab xa mus rau hauv daim ntawv encrypted. IEEE8021X - raws li tus txheej txheem thoob ntiaj teb (tshwj tsis yog qhov kev txhawb nqa los ntawm WPA tsev neeg). OWE (Opportunistic Wireless Encryption) yog qhov txuas ntxiv ntawm IEEE 802.11 tus qauv rau cov ntsiab lus uas peb tau faib ua OPEN. OWE ua kom muaj kev ruaj ntseg ntawm cov ntaub ntawv xa mus rau lub network tsis muaj kev ruaj ntseg los ntawm kev encrypting nws. Ib qho kev xaiv kuj tuaj yeem ua tau thaum tsis muaj cov yuam sij nkag, cia peb hu qhov kev xaiv no TSIS TAU.

Qhov thib peb parameter yog qhov hu ua. encryption schemes - Yuav ua li cas raws nraim qhov cipher siv los tiv thaiv cov ntaub ntawv xa mus. Cia peb teev cov kev xaiv. WEP - siv RC4 kwj cipher, tus yuam sij zais cia yog tus yuam sij encryption, uas yog suav tias yog qhov tsis lees txais hauv ntiaj teb ntawm niaj hnub cryptography. TKIP - siv hauv WPA, CKIP - hauv WPA2. TKIP + CKIP - tuaj yeem teev nyob rau hauv cov ntsiab lus muaj peev xwm ntawm WPA thiab WPA2 rau rov qab sib raug zoo.

Hloov ntawm peb lub ntsiab lus, koj tuaj yeem nrhiav tau tus cim WEP kho siab:

[WEP]

Raws li peb tau tham saum toj no, qhov no yog qhov txaus kom tsis txhob qhia cov algorithm rau kev siv cov yuam sij, uas tsis muaj, thiab cov txheej txheem encryption, uas yog tib yam los ntawm lub neej ntawd.

Tam sim no xav txog qhov bracket:

[ESS]

no Wi-Fi kev khiav hauj lwm hom los yog Wi-Fi network topology. Koj tuaj yeem ntsib BSS (Basic Service Set) hom - thaum muaj ib qho chaw nkag los ntawm cov khoom siv sib txuas lus. Muaj nyob rau hauv lub zos networks. Raws li txoj cai, cov ntsiab lus nkag yog xav tau los txuas cov khoom siv los ntawm cov chaw sib txawv hauv zos, yog li lawv yog ib feem ntawm Extended Service Sets - ESS. IBSSs (Independent Basic Service Sets) hom qhia tias cov cuab yeej yog ib feem ntawm Peer-to-Peer network.

Koj tuaj yeem pom tus chij WPS:

[WPS]

WPS (Wi-Fi Protected Setup) yog cov txheej txheem rau kev pib pib ib nrab ntawm Wi-Fi network. Txhawm rau pib, tus neeg siv nkag mus rau tus lej 8 tus cim lossis nias lub pob ntawm lub router. Yog tias koj qhov chaw nkag mus yog thawj hom thiab lub npov no tshwm nyob ib sab ntawm lub npe ntawm koj qhov chaw nkag, koj tau pom zoo kom mus rau lub vaj huam sib luag admin thiab lov tes taw WPS nkag. Qhov tseeb yog tias feem ntau tus lej 8 tus lej PIN tuaj yeem pom los ntawm MAC chaw nyob, lossis nws tuaj yeem txheeb xyuas lub sijhawm kwv yees, uas ib tus neeg tsis ncaj ncees tuaj yeem siv tau.

6. Tsim ib tus qauv thiab parsing muaj nuj nqi

Raws li qhov peb pom saum toj no, peb yuav piav qhia txog qhov tshwm sim uas siv cov chav kawm cov ntaub ntawv:

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

Tam sim no cia peb sau ib txoj haujlwm uas yuav txheeb xyuas cov peev txheej:


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. Saib qhov tshwm sim

Kuv mam li luam theej duab lub network thiab qhia koj qhov kuv pom. Qhia yog cov txiaj ntsig ntawm cov zis yooj yim ntawm Log.d:

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

Qhov teeb meem ntawm kev txuas mus rau lub network los ntawm daim ntawv thov code tseem tsis tau tshuaj xyuas. Kuv tsuas yog hais tias txhawm rau nyeem cov passwords khaws tseg los ntawm OS ntawm lub xov tooj ntawm tes, koj xav tau cov cai hauv paus thiab kev txaus siab rau rummage los ntawm cov ntaub ntawv kaw lus nyeem wpa_supplicant.conf. Yog tias daim ntawv thov logic xav tau nkag mus rau tus password los ntawm sab nraud, kev sib txuas tuaj yeem ua los ntawm chav kawm android.net.wifi.WifiManager.

Спасибо Egor Ponomarev rau cov khoom muaj nqis ntxiv.

Yog tias koj xav tias qee yam yuav tsum tau ntxiv lossis kho, sau rau hauv cov lus :)

Tau qhov twg los: www.hab.com

Yuav txhim khu kev qha hosting rau cov chaw nrog DDoS tiv thaiv, VPS VDS servers 🔥 Yuav lub vev xaib hosting txhim khu kev qha nrog kev tiv thaiv DDoS, VPS VDS servers | ProHoster