Android掌控WiFi不完全指南
前言
如果想要对针对WiFi的攻击进行监测,就需要定期获取WiFi的运行状态,例如WiFi的SSID,WiFi强度,是否开放,加密方式等信息,在Android中通过WiFiManager来实现
WiFiManager简介
WiFiManager这个类是Android暴露给开发者使用的一个系统服务管理类,其中包含对WiFi响应的操作函数;其隐藏掉的系统服务类为IWifiService,这个类是google私有的,属于系统安全级别的API类
我们需要通过WifiManager进行函数操作完成UI,监听对应的广播消息,从而实现获取WiFi信息的功能
内置方法
方法 | 含义 |
---|---|
addNetwork(WifiConfiguration config) | 通过获取到的网络的链接状态信息,来加入网络 |
calculateSignalLevel(int rssi , int numLevels) | 计算信号的等级 |
compareSignalLevel(int rssiA, int rssiB) | 对照连接A 和连接B |
createWifiLock(int lockType, String tag) | 创建一个wifi 锁,锁定当前的wifi 连接 |
disableNetwork(int netId) | 让一个网络连接失效 |
disconnect() | 断开连接 |
enableNetwork(int netId, Boolean disableOthers) | 连接一个连接 |
getConfiguredNetworks() | 获取网络连接的状态 |
getConnectionInfo() | 获取当前连接的信息 |
getDhcpInfo() | 获取DHCP 的信息 |
getScanResulats() | 获取扫描測试的结果 |
getWifiState() | 获取一个wifi 接入点是否有效 |
isWifiEnabled() | 推断一个wifi 连接是否有效 |
pingSupplicant() | ping 一个连接。推断能否连通 |
ressociate() | 即便连接没有准备好,也要连通 |
reconnect() | 假设连接准备好了,连通 |
removeNetwork() | 移除某一个网络 |
saveConfiguration() | 保留一个配置信息 |
setWifiEnabled() | 让一个连接有效 |
startScan() | 开始扫描 |
updateNetwork(WifiConfiguration config) | 更新一个网络连接的信息 |
其他常用基类
ScanResult
通过wifi 硬件的扫描来获取一些周边的wifi 热点的信息
字段 | 含义 |
---|---|
BSSID | 接入点的地址,这里主要是指小范围几个无线设备相连接所获取的地址,比如说两台笔记本通过无线网卡进行连接,双方的无线网卡分配的地址 |
SSID | 网络的名字,当我们搜索一个网络时,就是靠这个来区分每个不同的网络接入点 |
Capabilities | 网络接入的性能,这里主要是来判断网络的加密方式等 |
Frequency | 频率,每一个频道交互的MHz 数 |
Level | 等级,主要来判断网络连接的优先数。 |
WifiInfo
WiFi连接成功后,可通过WifiInfo类获取WiFi的一些具体信息
方法 | 含义 |
---|---|
getBSSID() | 获取BSSID |
getDetailedStateOf() | 获取client的连通性 |
getHiddenSSID() | 获得SSID 是否被隐藏 |
getIpAddress() | 获取IP 地址 |
getLinkSpeed() | 获得连接的速度 |
getMacAddress() | 获得Mac 地址 |
getRssi() | 获得802.11n 网络的信号 |
getSSID() | 获得SSID |
getSupplicanState() 返回详细client状态的信息 |
wifiConfiguration
WiFi的配置信息
类名 | 含义 |
---|---|
WifiConfiguration.AuthAlgorthm | 用来判断加密方法 |
WifiConfiguration.GroupCipher | 获取使用GroupCipher 的方法来进行加密 |
WifiConfiguration.KeyMgmt | 获取使用KeyMgmt 进行 |
WifiConfiguration.PairwiseCipher | 获取使用WPA 方式的加密 |
WifiConfiguration.Protocol | 获取使用哪一种协议进行加密 |
wifiConfiguration.Status | 获取当前网络的状态 |
权限
app AndroidManifest.xml
申请权限
Android 6.0版本中如果未开启GPS是无法获取到扫描列表的,需要动态申请ACCESS_COARSE_LOCATION
在运行之前调用该函数进行申请即可
牛刀小试
WiFi状态分类
- 网卡正在关闭 WIFI_STATE_DISABLING WIFI ( 状态码:0 )
- 网卡不可用 WIFI_STATE_DISABLED WIFI ( 状态码:1 )
- 网卡正在打开 WIFI_STATE_ENABLING WIFI ( 状态码:2 )
- 网卡可用 WIFI_STATE_ENABLED WIFI ( 状态码:3 )
- 网卡状态不可知 WIFI_STATE_UNKNOWN WIFI ( 状态码:4 )
代码中获取WIFI的状态
获取WiFiManager实例
开启、关闭WIFI
扫描周围的WiFi
获取扫描结果
获取历史WiFi配置信息
获取对应scanResult的配置信息
获取WIFI MAC地址
获取本机MAC地址
Android M版本之后,通过wifiInfo.getMacAddress()
获取的MAC地址是一个固定的假地址,值为02:00:00:00:00:00
,在这里通过getMacAddress
函数获取真实MAC
获取WIFI的网络速度和速度单位
获取当前连接WIFI的信号强度
获取当前连接的WIFI的加密方式
本来我以为wifiinfo里面应该会有解决方案,但是搜索了一下之后发现 如何在不扫描所有wifi网络的情况下获取当前wifi连接的加密类型?
看来还是需要遍历scanresults,但是很显然SSID容易重复,所以用WIFI BSSID来唯一确定
另外返回的capabilities格式一般为[认证标准+秘钥管理+加密方案]
,所以看到的时候不用太慌张
可以通过以下方式来判定加密
JAVA代码连接WiFi
Android提供了两种方式连接WiFi:
- 通过配置连接
- 通过networkId连接
封装后的函数如下
保存网络
添加网络
忘记网络
禁用网络
断开连接
短暂禁用网络
监控WIFI变化
我们很有可能会有这样的需求:在WIFI断开或者连接的时候,将当前的WIFI数据保存下来
事实上Android中WIFI发生变化的时候,会发送广播,我们只需要监听系统中发送的WIFI变化的广播就可以实现相关的功能了
开启权限
注册监听广播
我们先使用动态注册网络状态的监听广播
PS:注册监听有两种方式,无论使用哪种注册方式均需要在AndroidMainest清单文件里面进行注册
- 静态注册
也就是说在AndroidManifest文件中对BroadcastReceiver进行注册,通常还会加上action用来过滤;此注册方式即使退出应用后,仍然能够收到相应的广播
- 动态注册
调用Context中的registerReceiver对广播进行动态注册,使用unRegisterReceiver方法对广播进行取消注册的操作;故此注册方式一般都是随着所在的Activity或者应用销毁以后,不会再收到该广播
动态注册的代码如下
然后写具体的NetworkReceiver
继承BroadcastReceiver
广播监听类之后重写onReceive
方法,根据监听到的不同内容进行具体需求的修改即可
最后,随着Android版本的不断迭代,上述的方法也许在今后的某个时候就不适用了,如果到了这个时候,就去官方文档里面去寻找答案吧 😄
https://developer.android.com/docs?hl=zh-cn
参考链接
- Android wifi 设置相关
- Android WIFI 模块解析(1) - 掘金
- Android进阶之路 - WiFi的全面使用 - 掘金
- Android开发--WIFI实现_一叶飘舟的博客-CSDN博客
- WifiManager - Android中文版 - API参考文档
- Android WiFi开发 (一)扫描、连接、信息_VNanyesheshou的博客-CSDN博客_android wifi扫描连接
- Android中wifi管理器WifiManager使用方法_淼森007的博客-CSDN博客_android wifimanager
- Android-WiFi开发之 WifiManager
- Android获取本机WiFi MAC Address之坑
- Android WIFI认证方式_柚子君下的博客-CSDN博客_android wifi 认证
- Android WIFI功能——WifiManager
- Android进阶之路 - 实时监听网络状态 - 掘金
- Android —— WIFI状态相关的系统广播_沃克哈德丶的博客-CSDN博客_android wifi相关的广播
- WiFi开发(一)--WiFi开关与状态监听
- https://www.jianshu.com/p/16d4ff4c4cbe
END
建了一个微信的安全交流群,欢迎添加我微信备注进群
,一起来聊天吹水哇,以及一个会发布安全相关内容的公众号,欢迎关注 😃
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· NetPad:一个.NET开源、跨平台的C#编辑器
· PowerShell开发游戏 · 打蜜蜂
· 凌晨三点救火实录:Java内存泄漏的七个神坑,你至少踩过三个!