我如何整理忘记的密码以尝试暴力破解它
How can I sort through a forgotten password to attempt to brute force it
所以,我想配置我的路由器,这是一个蹩脚的无名路由器,所以无法连接到控制台端口。
唯一的方法是通过浏览器。
不,我之前已经配置了密码,我什至把它写下来了。原来,我可能写错了,所以是的...
我尝试了所有组合,但仍然没有成功。由于我不想重置路由器,出于某些原因,除非我真的必须这样做,否则我决定编写一个小程序来尝试各种可能性。
当然,我懒得去暴力破解它,因为我选择的密码非常强大。
因此,我决定让这个程序根据我写下的密码编写一本字典。这意味着,将 'a' 更改为 'A' 或 '@' 等等。
我写了一个小的概念代码,但真的卡在了递归部分,密码实际上被保存到文件中。
所以我想问是否有人可以分享某种有助于实现这一点的算法。
我的做法如下:
-创建一个char数组列表
- 对于输入的每个字符,为该字符创建一个具有多种可能性的数组。
(假设字符是 'a',创建一个具有上述所有可能性的字符数组,并将此字符数组保存到列表中
-遍历所有可能性并将每个可能性保存到 txt 文件
-使用 hydra 或类似工具来暴力破解路由器。
非常感谢您的帮助,保重伙计们
大家保重
using System;
using System.Collections.Generic;
using System.Collections;
using System.IO;
namespace strGen
{
class Program
{
static List<char[]> ls { get; set; }
static string Path { get; set; }
static string input { get; set; }
static char[] inputChars { get; set; }
static void Main(string[] args)
{
Console.Write("Enter tip: ");
input = Console.ReadLine();
Console.Write("Enter path: ");
Path = Console.ReadLine();
inputChars = input.ToCharArray();
MakeList(inputChars);
}
/// <summary>
/// makes list of all possible characters, for every character in a character array
/// </summary>
/// <param name="inputChars"></param>
static void MakeList(char[] inputChars)
{
ls = new List<char[]>();
foreach (char c in inputChars)
{
char cU;
char cL;
char[] tmp;
if (char.IsLetter(c))
{
if (c == 'a' | c == 'A')
{
tmp = new char[3];
if (char.IsUpper(c))
{
cL = char.ToLower(c);
cU = c;
}
else
{
cL = c;
cU = char.ToUpper(c);
}
tmp[0] = cL;
tmp[1] = cU;
tmp[2] = '@';
}
else if (c == 's' | c == 'S')
{
tmp = new char[3];
if (char.IsUpper(c))
{
cL = char.ToLower(c);
cU = c;
}
else
{
cL = c;
cU = char.ToUpper(c);
}
tmp[0] = cL;
tmp[1] = cU;
tmp[2] = '5';
}
else
{
tmp = new char[2];
if (char.IsUpper(c))
{
cL = char.ToLower(c);
cU = c;
}
else
{
cL = c;
cU = char.ToUpper(c);
}
tmp[0] = cL;
tmp[1] = cU;
}
}
else if (char.IsDigit(c))
{
if (c == '1')
{
tmp = new char[2];
tmp[0] = c;
tmp[1] = '!';
}
else
{
tmp = new char[1];
tmp[0] = c;
}
}
else if (c == '!')
{
tmp = new char[2];
tmp[0] = c;
tmp[1] = '1';
}
else
{
tmp = new char[1];
tmp[0] = c;
}
ls.Add(tmp);
}
}
static void Append(string str)
{
File.AppendAllText(Path, str + "\r \n");
}
static void Calc(string str, int index)
{
for(int i = 0; i<ls[index].Length;i++)
{
if (index < ls.Count)
{
}
}
}
}
}
程序比较简单
static void Main(string[] args)
{
//Console.Write("Enter tip: ");
//string input = Console.ReadLine();
//Console.Write("Enter path: ");
//string path = Console.ReadLine();
string input = "A52";
string path = "tst.txt";
CalcAndSave(input, path);
}
static void CalcAndSave(string str, string path)
{
List<char[]> ls = MakeList(str);
char[] state = new char[ls.Count];
using (var writer = new StreamWriter(path))
{
CalcAndSave(ls, 0, state, writer);
}
}
static void CalcAndSave(List<char[]> ls, int level, char[] state, StreamWriter writer)
{
if (level >= ls.Count)
{
foreach (char c in state)
{
writer.Write(c);
}
writer.Write("\r\n");
return;
}
foreach (char c in ls[level])
{
state[level] = c;
CalcAndSave(ls, level + 1, state, writer);
}
}
/// <summary>
/// makes list of all possible characters, for every character in a character array
/// </summary>
/// <param name="inputChars"></param>
static List<char[]> MakeList(string input)
{
var same = new List<string> { "a@&", "s5", "1!" };
var ls = new List<char[]>();
foreach (char c in input)
{
HashSet<char> chars = new HashSet<char>
{
char.ToLower(c),
char.ToUpper(c)
};
foreach (char cs in same
.Where(s => s.Contains(c, StringComparison.CurrentCultureIgnoreCase))
.SelectMany(s => s))
{
chars.Add(char.ToLower(cs));
chars.Add(char.ToUpper(cs));
}
ls.Add(chars.ToArray());
}
return ls;
}
虽然您可以使用静态变量,但我删除了它们。当您将各个部分分开时,它使程序更容易理解。有几点需要注意
- 字符串本身就是一个
IEnumerable
,所以你可以遍历它
- 有两个递归函数通常很方便。一个执行实际的递归,一个提供简单的接口并启动递归
- 递归函数有两部分。终止条件和递归步骤。每一步都会增加等级。
这可能就是您所需要的。但我想补充一点。您要做的是遍历 n 维 space。最直接的选择是使用某种形式的向量迭代器——一个标量迭代器数组。递归就是这样做的,它在每个级别上都使用带有标量迭代器的堆栈。它在进入更深层次时创建标量迭代器,并在上升时销毁完成的迭代器。但这不是唯一的选择。最后,每一个递归都可以转化为非递归程序。您真正需要的是一些可以容纳 n 个迭代器的内存。然后你就在每一步中推进这个记忆。
所以,我想配置我的路由器,这是一个蹩脚的无名路由器,所以无法连接到控制台端口。 唯一的方法是通过浏览器。 不,我之前已经配置了密码,我什至把它写下来了。原来,我可能写错了,所以是的...
我尝试了所有组合,但仍然没有成功。由于我不想重置路由器,出于某些原因,除非我真的必须这样做,否则我决定编写一个小程序来尝试各种可能性。 当然,我懒得去暴力破解它,因为我选择的密码非常强大。 因此,我决定让这个程序根据我写下的密码编写一本字典。这意味着,将 'a' 更改为 'A' 或 '@' 等等。
我写了一个小的概念代码,但真的卡在了递归部分,密码实际上被保存到文件中。
所以我想问是否有人可以分享某种有助于实现这一点的算法。
我的做法如下:
-创建一个char数组列表 - 对于输入的每个字符,为该字符创建一个具有多种可能性的数组。 (假设字符是 'a',创建一个具有上述所有可能性的字符数组,并将此字符数组保存到列表中 -遍历所有可能性并将每个可能性保存到 txt 文件
-使用 hydra 或类似工具来暴力破解路由器。
非常感谢您的帮助,保重伙计们
大家保重
using System;
using System.Collections.Generic;
using System.Collections;
using System.IO;
namespace strGen
{
class Program
{
static List<char[]> ls { get; set; }
static string Path { get; set; }
static string input { get; set; }
static char[] inputChars { get; set; }
static void Main(string[] args)
{
Console.Write("Enter tip: ");
input = Console.ReadLine();
Console.Write("Enter path: ");
Path = Console.ReadLine();
inputChars = input.ToCharArray();
MakeList(inputChars);
}
/// <summary>
/// makes list of all possible characters, for every character in a character array
/// </summary>
/// <param name="inputChars"></param>
static void MakeList(char[] inputChars)
{
ls = new List<char[]>();
foreach (char c in inputChars)
{
char cU;
char cL;
char[] tmp;
if (char.IsLetter(c))
{
if (c == 'a' | c == 'A')
{
tmp = new char[3];
if (char.IsUpper(c))
{
cL = char.ToLower(c);
cU = c;
}
else
{
cL = c;
cU = char.ToUpper(c);
}
tmp[0] = cL;
tmp[1] = cU;
tmp[2] = '@';
}
else if (c == 's' | c == 'S')
{
tmp = new char[3];
if (char.IsUpper(c))
{
cL = char.ToLower(c);
cU = c;
}
else
{
cL = c;
cU = char.ToUpper(c);
}
tmp[0] = cL;
tmp[1] = cU;
tmp[2] = '5';
}
else
{
tmp = new char[2];
if (char.IsUpper(c))
{
cL = char.ToLower(c);
cU = c;
}
else
{
cL = c;
cU = char.ToUpper(c);
}
tmp[0] = cL;
tmp[1] = cU;
}
}
else if (char.IsDigit(c))
{
if (c == '1')
{
tmp = new char[2];
tmp[0] = c;
tmp[1] = '!';
}
else
{
tmp = new char[1];
tmp[0] = c;
}
}
else if (c == '!')
{
tmp = new char[2];
tmp[0] = c;
tmp[1] = '1';
}
else
{
tmp = new char[1];
tmp[0] = c;
}
ls.Add(tmp);
}
}
static void Append(string str)
{
File.AppendAllText(Path, str + "\r \n");
}
static void Calc(string str, int index)
{
for(int i = 0; i<ls[index].Length;i++)
{
if (index < ls.Count)
{
}
}
}
}
}
程序比较简单
static void Main(string[] args)
{
//Console.Write("Enter tip: ");
//string input = Console.ReadLine();
//Console.Write("Enter path: ");
//string path = Console.ReadLine();
string input = "A52";
string path = "tst.txt";
CalcAndSave(input, path);
}
static void CalcAndSave(string str, string path)
{
List<char[]> ls = MakeList(str);
char[] state = new char[ls.Count];
using (var writer = new StreamWriter(path))
{
CalcAndSave(ls, 0, state, writer);
}
}
static void CalcAndSave(List<char[]> ls, int level, char[] state, StreamWriter writer)
{
if (level >= ls.Count)
{
foreach (char c in state)
{
writer.Write(c);
}
writer.Write("\r\n");
return;
}
foreach (char c in ls[level])
{
state[level] = c;
CalcAndSave(ls, level + 1, state, writer);
}
}
/// <summary>
/// makes list of all possible characters, for every character in a character array
/// </summary>
/// <param name="inputChars"></param>
static List<char[]> MakeList(string input)
{
var same = new List<string> { "a@&", "s5", "1!" };
var ls = new List<char[]>();
foreach (char c in input)
{
HashSet<char> chars = new HashSet<char>
{
char.ToLower(c),
char.ToUpper(c)
};
foreach (char cs in same
.Where(s => s.Contains(c, StringComparison.CurrentCultureIgnoreCase))
.SelectMany(s => s))
{
chars.Add(char.ToLower(cs));
chars.Add(char.ToUpper(cs));
}
ls.Add(chars.ToArray());
}
return ls;
}
虽然您可以使用静态变量,但我删除了它们。当您将各个部分分开时,它使程序更容易理解。有几点需要注意
- 字符串本身就是一个
IEnumerable
,所以你可以遍历它 - 有两个递归函数通常很方便。一个执行实际的递归,一个提供简单的接口并启动递归
- 递归函数有两部分。终止条件和递归步骤。每一步都会增加等级。
这可能就是您所需要的。但我想补充一点。您要做的是遍历 n 维 space。最直接的选择是使用某种形式的向量迭代器——一个标量迭代器数组。递归就是这样做的,它在每个级别上都使用带有标量迭代器的堆栈。它在进入更深层次时创建标量迭代器,并在上升时销毁完成的迭代器。但这不是唯一的选择。最后,每一个递归都可以转化为非递归程序。您真正需要的是一些可以容纳 n 个迭代器的内存。然后你就在每一步中推进这个记忆。