因此。 我在visual basic中制作了一个bruteforcer。 它有一个字符集,如下所示:
Dim charset as string
charset = "abcdefghijklmnopqrstuvwxyz1234567890."
有37种不同的字符吗?该程序用于搜索使用此charset制作的所有不同组合,最多包含3个不同的字母。例如
这是一个组合: ac6
因此,由于有37个字母和3个插槽,因此可能的组合为37 ^ 3
但是我希望我的程序不要尝试两次相同的组合。
因此它保存了在此位置尝试的每个组合(桌面)
Dim filex As System.IO.StreamWriter
filex = My.Computer.FileSystem.OpenTextFileWriter("c:\Users\" + Environment.UserName + "\desktop\alreadytested.txt", True)
filex.WriteLine(combination)
filex.Close()
而且,在检查新组合的Sub的开头,我有这个
text = File.ReadAllText("c:\Users\" + Environment.UserName + "\desktop\alreadytested.txt")
index = text.IndexOf(combination) 'checks if it has been generated already
If index >= 0 Then
keyword() 'The sub
End If
但经过一些组合(在这种情况下最大37 ^ 3~ = 50.000而我程序尝试了大约5200次)我得到了这个错误
mscorlib.dll中出现未处理的“System.StackOverflowException”类型异常
此错误指向此行代码
filex = My.Computer.FileSystem.OpenTextFileWriter("c:\Users\" + Environment.UserName + "\desktop\alreadytested.txt", True)
但为什么呢?在5200,仍然有44800种可能的随机组合,为什么我会出现溢出?
如果我在50000可能测试的50000组合中得到它会有意义,但现在我只有10%,所以为什么我会溢出?
答案 0 :(得分:1)
您继续以递归方式调用keyword()
方法。每次调用方法时,它的返回地址和可能的参数都被添加到调用堆栈中。 callstack只能在溢出之前接听一定数量的电话,而对于你的计算机和你的特定方法,这个数量似乎大约是5200。
您应该切换到使用例如While
- 循环,并且每当您想要阻止执行的其余部分并返回到循环的开头时,您只需调用{{1 }}
还有一点需要注意的是,每次读/写时都不应该打开和关闭文件。而是将文件的内容存储在一个长字符串中(或者更好,在HashSet(Of T)中),并在每次需要时检查,然后在循环结束时将所有内容写入文件。
如果您仍希望在此过程中写入文件,请执行此操作。但是在循环开始之前打开一个流,直到循环结束,然后关闭流。