4

さて、私は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

4 に答える 4

1

KeyboardInterruptがプログラムを終了できるようにする方法は、何もしないことです。それらは、exceptブロック内でそれらをキャッチするものに依存することによって機能します。例外がプログラム (またはスレッド) から完全に出てくると、例外は終了します。

あなたが行ったことは、 をトラップしKeyboardInterrupt、メッセージを出力してから続行することでそれらを処理することです。

なぜプログラムが動かなくなるのかというと、何もnum1変化を起こさないので、md5 の計算は毎回同じ計算です。のシンボルを繰り返し処理したい場合はalphaNumeric、次のようにしますfor symbol in alphaNumeric: # do something with 'symbol'

もちろん、考えられるすべての 1 文字のパスワードのみが考慮されます。あなたはそれ以上に頑張らなければならないでしょう... :)

クラスの使用についても混乱していると思います。Pythonでは、すべてをクラス内にラップする必要はありません。プログラムのmain最後の は何も役に立ちません。mainコンパイラがクラスとは何かを理解しようとするときにコードが評価されるため、コードが実行されます。これは構文の乱用です。あなたがしたいことは、このコードを main関数に入れ、関数を呼び出すことです (現在呼び出しているのと同じ方法ですchecker)。

于 2011-08-02T01:58:23.060 に答える
1

印刷するだけでなく、 capturinKeyboardInterruptのときに実際にプログラムを終了する必要があります。メッセージを印刷するだけです。

于 2011-08-02T02:11:49.747 に答える
0

これは私のために働いたものです...

import sys

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

except KeyboardInterrupt:
    print "interupt" 
    sys.exit()  
于 2013-02-22T02:24:52.497 に答える
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ます。いくつか例を挙げてみましょう。ここに1つあります:

while 1:
    print 'djfgerj'
    break

このステートメントは、ループを続行するbreak兄弟 とは異なり、すぐに停止してループを終了します。continueそれは単なる追加情報です。今、あなたがbreakこのようなものを持っているなら:

if liners == 0:
    break

ifそれは、そのステートメントがどこにあるかによって異なります。ループしている場合は、ループを停止します。そうでなければ、何も起こりません。機能しなかった機能を終了しようとしたと思います。プログラムが終了するはずなので、sys.exit()上で示したように使用してください。また、(クラス内の) コードの最後の部分を別の関数にグループ化する必要があります。これがお役に立てば幸いです。

于 2015-01-16T00:36:08.770 に答える