WiFi 密码恢复和管理工具





5.00/5 (9投票s)
在本文中,我将讨论一个我使用 Visual Studio 2019 和 WPF 创建的 WiFi 密码恢复和管理工具。
目录
引言
在本文中,我将讨论一个我使用 WPF 和 Visual Studio 2019 创建的 WiFi 密码恢复和管理应用程序。为了创建此应用程序,我使用了 MVVM 架构,并结合了 Caliburn.Micro 和 Autofac 的依赖注入。此应用程序的主要目的是管理 WiFi 配置文件,从 WiFi 配置文件中恢复密码,并匹配不同的密码以连接到您自己的安全 WiFi(以防您想将新设备连接到您的 WiFi 但不记得您自己的 WiFi 密码,并想做出有根据的猜测)。WiFi 配置文件管理器功能允许您查看和管理您 Windows 10 PC 上的所有 WiFi 配置文件,例如删除配置文件,这可能很有用,因为随着时间的推移,如果您连接到不同的 WiFi 网络,WiFi 配置文件列表会增加,有时您可能希望删除不必要的 WiFi 配置文件。WiFi 密码恢复和管理应用程序旨在恢复您自己的 WiFi 密码,而不是用于破解任何人的 WiFi。破解安全 WiFi 网络的方法与本应用程序使用的方法大不相同,您可以在此处阅读相关内容。此应用程序的最新代码可以在我的 Github 存储库此处找到,ClickOnce 部署可以此处启动。
背景
WiFi 密码恢复和管理工具使用 ManagedNativeWifi 库从您的 Windows 10 PC 检索 WiFi 配置文件及其相应的密码。此外,该库还用于操作您 PC 上的 WiFi 配置文件,例如增加或减少其优先级。对于 WiFi 连接功能,该应用程序使用 simplewifi 库中的代码生成 WiFi 连接配置文件。应用程序用户可以通过三种不同的方式提供潜在密码:手动(通过在主视图中右键单击网络行)、使用字典和使用正则表达式。下面显示了几张应用程序的截图。您可以单击图片放大它们。
Using the Code
主用户界面由排列在 DockPanel
中的四个控件组成。
- 左侧控件包含一个导航栏,允许您在所有可用视图之间导航。
- 顶部控件包含一个标题面板。
- 底部控件包含一个状态栏,用于显示应用程序消息和忙碌状态。
- 中间控件包含导航栏中选定的视图。
<Window x:Class="EasyPasswordRecoveryWiFi.Views.ShellView">
<DockPanel>
<ContentControl DockPanel.Dock="Bottom"
cal:View.Model="{Binding StatusBarBottom}"></ContentControl>
<ContentControl DockPanel.Dock="Top"
cal:View.Model="{Binding HeaderMenu}"></ContentControl>
<ContentControl DockPanel.Dock="Left"
cal:View.Model="{Binding LeftMenu}"></ContentControl>
<ContentControl x:Name="ActiveItem"></ContentControl>
</DockPanel>
</Window>
代码片段 1:主用户界面(ShellView.xaml)由排列在 DockPanel
中的四个控件组成。
如上所述,状态栏控件停靠在主用户界面的底部。当没有消息且应用程序不忙时,状态栏控件会通过数据触发器隐藏。状态栏通过使用 Caliburn.Micro
事件聚合器从不同的 ViewModel 发送消息来更新。对于不熟悉的人来说,事件聚合器是一项服务,它提供了从一个实体到另一个实体的对象发布的能力,以一种松散耦合的方式,您可以在此处阅读相关内容。
为了减少应用程序的依赖关系,我使用了 Autofac 进行依赖注入。使用依赖注入的一个主要优点是它通过允许将 IWiFiService
接口的模拟实现注入 MainController
来提高了应用程序的可测试性。在应用程序启动期间,我可以轻松地在 IWiFiService
接口的模拟实现和实际实现之间切换,如下面的代码片段所示。
#if MOCK_DATA
builder.RegisterType<MockWiFiAdapter>().As<IWiFiService>();
#else
builder.RegisterType<NativeWiFiAdapter>().As<IWiFiService>();
#endif
//Constructor Dependency Injection
public class MainController
{
private readonly IWiFiService _wiFiService;
public MainController(IWiFiService wifiService)
{
_wiFiService = wifiService;
}
}
代码片段 2:在 IWiFiService
接口的模拟实现和实际实现之间切换。
应用程序与 ManagedNativeWifi
库之间的耦合是通过适配器模式实现的。这种方法允许轻松地将使用的 ManagedNativeWifi
库替换为其他替代方案。
public class NativeWiFiAdapter : NativeWifiPlayer, IWiFiService { }
代码片段 3:NativeWiFiAdapter
继承自 NativeWifiPlayer
(ManagedNativeWifi
)并实现了 IWiFiService
接口。
对于异步任务的处理,我使用了可以在此处找到的“立即执行并丢弃”方法。这种方法基本上将任务包装在 try catch
块中。如果发生错误,它会将异常发送到错误处理程序。在我的例子中,错误处理程序会更新状态栏以显示新的错误消息。当任务活动时,忙碌标志为 true
,导致主用户界面被禁用,从而阻止启动新任务。
public static class TaskUtilities
{
#pragma warning disable RECS0165 // Asynchronous methods should return a Task instead of void
public static async void FireAndForgetSafeAsync(this Task task, IErrorHandler handler = null)
#pragma warning restore RECS0165 // Asynchronous methods should return a Task instead of void
{
try
{
await task;
}
catch (Exception ex)
{
handler?.HandleError(ex);
}
}
}
代码片段 4:用于“立即执行并丢弃”方法的任务扩展方法。
public interface IErrorHandler
{
void HandleError(Exception ex);
}
代码片段 5:任务扩展方法使用的 IErrorHandler
接口。
如前所述,WiFi 连接功能使用 ProfileFactory
类生成 WiFi 连接配置文件。ProfileFactory
类包含 CreateProfileXml
方法,该方法可以使用 Accesspoint
对象(包含目标 WiFi 网络的身份验证类型、加密类型和 Bss 类型)和密码作为输入参数进行调用,然后返回连接配置文件。然后将生成的连接配置文件添加到 PC 的连接配置文件列表中,之后尝试连接到目标 WiFi 网络。在调用 CreateProfileXml
方法之前,会使用 PasswordHelper
类验证密码。不支持企业网络,因为它们需要额外的用户名和域配置步骤,您可以在此处阅读相关内容。
使用 Caliburn.Micro
的 WindowManager
类显示弹出窗口。Caliburn.Micro
负责初始化窗口、设置其数据上下文并显示相应的视图。
bool dialogResult = _windowManager.ShowDialog(_passwordViewModel) ?? false;
if (dialogResult)
{
password = _passwordViewModel.Password;
}
代码片段 6:弹出窗口使用 Caliburn.Micro
的 WindowManager
类显示。
应用程序的 WiFi 管理器视图允许您导入和操作您 Windows 10 PC 上存在的所有 WiFi 连接配置文件。通过右键单击配置文件行,您可以操作 WiFi 连接配置文件(删除、增加或减少其优先级、导出配置文件或显示其属性)。当您单击属性选项时,会弹出属性窗口,显示配置文件属性,包括配置文件用于连接到其相应 WiFi 网络的密码。为了检索未加密的密码,我修改了 ManagedNativeWifi
库的 GetProfile
方法。
uint flags = WLAN_PROFILE_GET_PLAINTEXT_KEY;
var result = WlanGetProfile(
clientHandle,
interfaceId,
profileName,
IntPtr.Zero,
out string profileXml,
ref flags,
out uint grantedAccess);
代码片段 7:WlanGetProfile
方法检索带有相应纯文本密码的 WiFi 配置文件。
C:\Users>netsh wlan show profiles
C:\Users>netsh wlan show profile name=”network-profile-name” key=clear
#Replace network-profile-name with your copied network name.
代码片段 8:您可以使用命令提示符显示 WiFi 文件的纯文本密码。
如本文开头所述,WiFi 连接过程中使用的密码可以通过字典和正则表达式提供。关于如何使用正则表达式生成密码字符串的详细信息,请参阅本文。
最后但同样重要的是,该应用程序的测试是使用 NUnit 完成的。我为所有支持的 WiFi 网络生成了连接配置文件,并使用 Windows 10 PC 生成的参考配置文件对其进行了验证。此外,我还编写了测试用例来验证 PasswordHelper
类(该类检查一个 string
是否符合目标 WiFi 网络的密码规则)。
关注点
控制反转 (IoC) 可以提高应用程序的可测试性,例如,它允许您轻松模拟应用程序功能。使用 Caliburn.Micro
框架可以使编程更容易,例如,事件聚合器允许您轻松地在应用程序的不同部分之间交换消息。
历史
- 2019 年 9 月 27 日:版本 1.0.0.0 - 发布文章