无法终止我的Python代码。出什么问题了?

4 投票
4 回答
642 浏览
提问于 2025-04-16 22:41

好的,我正在用Python写一个非常简单的密码破解程序,它通过暴力破解的方式尝试找出密码,这个密码由字母和数字组成。目前这段代码只支持1个字符的密码,并且需要一个包含md5哈希密码的密码文件。将来我会加入一个选项,让用户可以指定字符的限制(也就是破解程序尝试多少个字符后就停止)。现在我遇到的问题是,我无法在想停止这个程序的时候把它杀掉。我已经加了一个try和except的代码片段,但它没有起作用。我哪里做错了呢?

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

这是对我有效的方法...

import sys

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

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

要让程序在按下 KeyboardInterrupt 时正常结束,其实就是什么都不做。这个操作依赖于没有任何东西在 except 块中捕获它;当一个异常从程序(或线程)中完全冒出来时,程序就会终止。

你现在做的事情是捕获 KeyboardInterrupt,然后通过打印一条消息来处理它,之后程序继续运行。

至于为什么程序会卡住,原因是 num1 从来没有改变,所以每次计算 md5 的结果都是一样的。如果你想遍历 alphaNumeric 中的符号,可以这样做:for symbol in alphaNumeric: # 对'symbol'做点什么

当然,这样做还是只考虑了每一个可能的一字符密码。你得更加努力才行... :)

我觉得你可能对类的使用有些困惑。Python并不要求你把所有东西都放在一个类里面。你程序最后的 main 其实没有什么用;你的代码之所以能运行,是因为编译器在试图弄明白 main 类是什么时会执行这些代码。这其实是语法的误用。你应该把这段代码放在一个主函数里,然后调用这个函数(就像你现在调用 checker 一样)。

1

除了打印信息,你在捕捉到 KeyboardInterrupt 时,还需要真正退出你的程序,现在你只是打印了一条消息。

撰写回答