分享

速学编程:写个查看无线密码的独立 EXE 程序

 东东Wr 2022-11-09 发布于黑龙江

本文分为 2 个部分:

1、调用命令行工具 netsh ,使用进程管道读取 Windows 无线连接密码。

2、不用 netsh,获取并解密 Windows 无线连接密码。

方法一:调用 netsh 获取无线密码

在系统命令行中输入:

netsh wlan show profiles

显示结果如下:

文章图片1

在 aardio 中用下面的代码创建命令行进程:

var prcs = process.popen('netsh wlan show profiles');

这不会再显示命令行程序的黑窗口(控制台窗口)。

返回的 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 连接名。

重点看一下这个模式表达式:

'<All User Profile>|<所有用户配置文件>\s*\:\s*(.*)'

知识点:

  • '<All User Profile>|<所有用户配置文件>' 用于匹配 'All User Profile' 或者 '所有用户配置文件'。
  • '\s' 表示空白字符,'\s*' 表示任意个空白字符。
  • '\:' 表示 ':' 本身,反斜杠为转义符,不加反斜杠的 ':' 匹配一个中文字符(多字节)。
  • '.' 表示任意单字节字符,'.*' 表示任意个数的任意字符。
  • 括号 () 用于提取捕获结果到返回值,上面的 '(.*)' 就是提取冒号后面的 Wi-Fi 连接名并存储到循环变量 wifi 。

「模式表达式」类似简化版「正则表达式」,速度也更快。

下面我们将获取到的 Wi-Fi 连接名输出到界面上。首先用 aardio 创建一个窗口,然后拖一个文本框控件上去。

文章图片2

然后切换到代码视图:

文章图片3

输入代码如下:

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 连接密码。

for wifi in prcs.lines('<All User Profile>|<所有用户配置文件>\s*\:\s*(.*)'){   	//创建命令行进程(显示密码)	var prcsKey = process.popen(		'netsh wlan show profile name='+wifi+' key=clear'	);		//遍历所有行,获取密码字段	for password in prcsKey.lines(		'<Key Content>|<关键内容>\s*\:\s*(.*)'){		winform.edit.print( wifi, password );	}}

运行程序看看效果:

文章图片4

方法二:不用 netsh,获取并解密无线密码

首先要在代码第一行加上 //RUNAS// 以获取管理权限:

文章图片5

然后我们添加下面的代码获取所有无线连接:

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)}

运行程序,显示的密码是加密的,添加下面的代码解密:

import crypt.protectData;var password = crypt.protectData.decrypt(	km.innerText())

但是解密无线密码需要 SYSTEM 权限,所以我们需要用下面的代码夺权:

import thread.token;thread.token.impersonate('winlogon.exe',function(){ })

再将查看无线密码的代码移动到夺权代码内部,最终完成的全部代码如下:

//RUNAS//import thread.token;import crypt.protectData;import sys.wlan;import win.ui;/*DSG{{*/var winform = win.form(text='无线密码查看工具';right=590;bottom=368)winform.add(edit={cls='edit';left=26;top=26;right=558;bottom=337;edge=1;multiline=1;z=1})/*}}*///获取 SYSTEM 权限thread.token.impersonate('winlogon.exe',function(){		//创建无线接口对象	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();				//解密		password = crypt.protectData.decrypt(password);				//清除尾部 '\0'		password = string.str(password);				//显示结果		winform.edit.print(wifi,password)	}	})winform.show();win.loopMessage();

发布为独立 EXE 程序

在 aardio 中新建窗口工程:

文章图片6

然后将前面的源代码复制粘贴到 main.aardio 内,然后按保存。

文章图片7

然后点『发布』就可以了。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多