无法杀死我的python代码。怎么了?

时间:2011-08-02 01:53:50

标签: python try-catch keyboardinterrupt

好的,所以我在python中编写了一个非常简单的密码破解程序,强制使用字母数字字符密码。目前,此代码仅支持1个字符的密码和密码文件,其中包含md5哈希密码。它最终将包含指定您自己的字符限制的选项(破解程序在失败之前尝试的字符数)。现在,当我希望它死时,我无法杀死这段代码。我已经包含了一个尝试,除了snippit,但它不起作用。我做错了什么?

代码: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

4 个答案:

答案 0 :(得分:1)

允许KeyboardInterrupt结束程序的方法是不执行任何操作。他们的工作依赖于except块中没有捕获它们的东西;当异常从程序(或线程)中一路消失时,它就会终止。

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

至于为什么程序被卡住,没有任何东西会导致num1改变,因此md5计算每次都是相同的计算。如果您想迭代alphaNumeric中的符号,请执行以下操作:for symbol in alphaNumeric: # do something with 'symbol'

当然,这仍然只考虑每个可能的单字符密码。你将不得不更加努力......:)

我认为你对课程的使用感到困惑。 Python 要求您将所有内容都包装在一个类中。程序结束时的main没有任何用处;您的代码运行是因为在编译器试图找出main类时会对其进行求值。这是滥用语法。您要做的是将此代码放在主函数中,然后调用函数(与您当前调用checker的方式相同)。

答案 1 :(得分:1)

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

答案 2 :(得分:0)

这对我有用......

import sys

try:
    ....code that hangs....

except KeyboardInterrupt:
    print "interupt" 
    sys.exit()  

答案 3 :(得分:0)

好吧,当您使用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()。此外,您应该将最后一段代码(在类中)分组为单独的函数。我希望这可以帮助你!