本文分为 2 个部分: 1、调用命令行工具 netsh ,使用进程管道读取 Windows 无线连接密码。 2、不用 netsh,获取并解密 Windows 无线连接密码。 方法一:调用 netsh 获取无线密码在系统命令行中输入: netsh wlan show profiles 显示结果如下: 在 aardio 中用下面的代码创建命令行进程:
这不会再显示命令行程序的黑窗口(控制台窗口)。 返回的 prcs 提供了很多用于操作进程管道的函数,我们可以如下遍历所有输出行,并查找 Wi-Fi 连接名: //创建命令行进程(显示 WIFI 连接名)var prcs = process.popen('netsh wlan show profiles');//遍历进程所有输出项,参数指定模式匹配表达式for wifi in prcs.lines('<All User Profile>|<所有用户配置文件>\s*\:\s*(.*)'){ } wifi 就是拿到的 Wi-Fi 连接名。 重点看一下这个模式表达式:
知识点:
「模式表达式」类似简化版「正则表达式」,速度也更快。 下面我们将获取到的 Wi-Fi 连接名输出到界面上。首先用 aardio 创建一个窗口,然后拖一个文本框控件上去。 然后切换到代码视图: 输入代码如下: import process.popen;var prcs = process.popen('netsh wlan show profiles'); for wifi in prcs.lines('<All User Profile>|<所有用户配置文件>\s*\:\s*(.*)'){ winform.edit.print(wifi);} 下面我们再用同样的方法,加几句代码 获取 Wi-Fi 连接密码。
运行程序看看效果: 方法二:不用 netsh,获取并解密无线密码首先要在代码第一行加上 //RUNAS// 以获取管理权限: 然后我们添加下面的代码获取所有无线连接: import sys.wlan;var wlan = sys.wlan();//遍历全部无线连接for wifi,guid,description,flags,access,xmlProfile in wlan.eachProfile(){ //xmlProfile 是 XML 配置对象 var km = xmlProfile.queryEle( tagName = 'keyMaterial' ); //获取密码:也就是keyMaterial 元素内的文本 var password = km.innerText(); winform.edit.print(wifi,password)} 运行程序,显示的密码是加密的,添加下面的代码解密:
但是解密无线密码需要 SYSTEM 权限,所以我们需要用下面的代码夺权: import thread.token;thread.token.impersonate('winlogon.exe',function(){ }) 再将查看无线密码的代码移动到夺权代码内部,最终完成的全部代码如下:
发布为独立 EXE 程序在 aardio 中新建窗口工程: 然后将前面的源代码复制粘贴到 main.aardio 内,然后按保存。 然后点『发布』就可以了。 |
|