不能杀死我的蟒蛇代码。怎么了?



好吧,我正在用python编写一个非常简单的密码破解器,它可以用字母数字字符强制执行密码。目前这个代码只支持1个字符的密码和密码文件与md5哈希密码里面。它最终将包括指定您自己的字符限制的选项(多少字符饼干尝试,直到它失败)。现在,当我想要终止代码时,我无法终止它。我已经包括了一个尝试和除了片段,但它不工作。我做错了什么?

代码:http://pastebin.com/MkJGmmDU

import linecache, hashlib
alphaNumeric = ["a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","A","B","C","D","E","F","G","H","I","J","K","L","M","N","O","P","Q","R","S","T","U","V","W","X","Y","Z",1,2,3,4,5,6,7,8,9,0]
class main:
    def checker():
            try:
                    while 1:
                            if hashlib.md5(alphaNumeric[num1]) == passwordHash:
                                    print "Success! Your password is: " + str(alphaNumeric[num1])
                                    break
            except KeyboardInterrupt:
                    print "Keyboard Interrupt."
    global num1, passwordHash, fileToCrack, numOfChars
    print "What file do you want to crack?"
    fileToCrack = raw_input("> ")
    print "How many characters do you want to try?"
    numOfChars = raw_input("> ")
    print "Scanning file..."
    passwordHash = linecache.getline(fileToCrack, 1)[0:32]
    num1 = 0
    checker()
main

允许KeyboardInterrupt结束程序的方法是什么都不做。它们的工作依赖于在except块中没有捕获它们;当一个异常从程序(或线程)中冒泡出来时,它就终止了。

您所做的是捕获KeyboardInterrupt,并通过打印消息来处理它们,然后继续。

至于为什么程序会卡住,没有任何东西会导致num1改变,所以md5计算每次都是相同的计算。如果你想遍历alphaNumeric中的符号,那么这样做:for symbol in alphaNumeric: # do something with 'symbol' .

当然,这仍然只会考虑所有可能的单字符密码。你得再努力一点……:)

我想你也对类的使用感到困惑。Python 不要求你把所有东西都包装在一个类中。程序末尾的main没有做任何有用的事情;你的代码运行是因为当编译器试图找出什么是main类时,它被评估。这是对语法的滥用。你要做的是把这段代码放在一个主函数中,然后调用函数(与当前调用checker的方式相同)。

除了打印,您还需要在捕获KeyboardInterrupt时实际退出程序,您只打印一条消息。

这对我来说是有效的…

import sys
try:
    ....code that hangs....
except KeyboardInterrupt:
    print "interupt" 
    sys.exit()  

嗯,当您使用tryexcept块时,当该错误发生时将引发错误。在您的情况下,KeyboardInterrupt是您的错误。但是当KeyboardInterrupt被激活时,什么也没有发生。这是由于except部分中没有任何内容。您可以在导入sys:

之后执行此操作
try:
    #Your code#
except KeyboardInterrupt:
    print 'Put Text Here'
    sys.exit()

sys.exit()是安全退出程序的简单方法。这可以用于制作带有密码的程序,以便在密码错误或类似情况下结束程序。这应该修复except部分。现在到try部分:

如果您将break作为try部分的结尾,则不会发生任何事情。为什么?因为break只对循环有效,所以大多数人倾向于对while循环这样做。我们来举几个例子。这里有一个:

while 1:
    print 'djfgerj'
    break

break语句将立即停止并结束循环,不像它的兄弟continue语句继续循环。这只是额外的信息。现在,如果你把break放在像这样的地方:

if liners == 0:
    break

这取决于if语句在哪里。如果它在循环中,它将停止循环。否则,什么都不会发生。我假设您尝试退出函数,但该函数不起作用。看起来程序应该结束了,所以像我上面展示的那样使用sys.exit()。此外,您应该将(类中的)最后一段代码分组到一个单独的函数中。我希望这对你有帮助!

相关内容

  • 没有找到相关文章

最新更新