Pythonを使って簡単なzipファイルの解凍パスワードを手作業で解く
はじめに
使用するコアモジュールは、python標準ライブラリのzipfileモジュールです。このモジュールは zip ファイルに関する様々な関数を実装することができ、その内容は公式のリファレンスドキュメントに記載されています。ここでいうブルートフォースクラッキングとは、パスワードの並びうる値の中から一つずつパスワードを試していくことで、人間には難しいがコンピュータには不可能である。私たちは、解凍するためにパスワードを必要とするZIPファイルをダウンロードすることがありますが、それは私たちが知らないものであり、知るためにお金を払う必要があります。そこで、暴力的なクラッキングのためのパスワードの2つの主要な種類を紹介します:純粋な数字パスワードと英数字の組み合わせパスワードです。
ファイルの作成
最初のテストファイルはtest.txt(1行のテキストのみ含む)、圧縮ファイルはtest.zip、圧縮パスワードは2340、ディレクトリ内のtxtファイルを削除するために圧縮します。
上の画像では、従来の暗号化にチェックが入っていることに注意してください。
純粋数値暗号
とは、0 から始まらない数字のパスワードを指す。 0 の後に続く文字の組み合わせを参照。原理は、zipfile モジュールが圧縮ファイルを展開するとき、パスワードが不正になるとプログラムが終了し、try 文の中で展開に成功したパスワードだけが、extract 関数が続く文を呼び出すまで実行されることになる。
コード
import zipfile
import time
import threading
startTime = time.time()
# Determine if the thread needs to be terminated
flag = True
def extract(password, file):
try:
password = str(password)
file.extractall(path='.' , pwd=password.encode('utf-8'))
print("the password is {}".format(password))
nowTime = time.time()
print("send time is {}".format(nowTime - startTime))
global flag
# Successfully decompress the rest of the threads to terminate
flag = False
except Exception as e:
print(e)
def do_main():
zfile = zipfile.ZipFile("test.zip", 'r')
# Start trying
for number in range(1, 9999):
if flag is True:
t = threading.Thread(target=extract, args=(number, zfile))
t.start()
t.join()
if __name__ == '__main__':
do_main()
明らかに解凍は成功しました。ここで重要なのは、このエンコーディングパスワードは従来のZIP暗号化に対してのみ有効で、winrarには新しいタイプのデフォルトの暗号化があることです。
英数字混じりのパスワード
この場合、パスワードの組み合わせが多すぎるため、メモリのオーバーフローを防ぐために、代わりにイテレータが使用されます。このケースは時間がかかるので、暇なときにスクリプトにぶら下げることができる。ここでは、ファイルは再び圧縮され、パスワードはpythonです。
import zipfile
import random
import time
import sys
class MyIterator():
# The set of unit characters
letters = 'abcdefghijklmnopqrstuvwxyz012345678'
min_digits = 0
max_digits = 0
def __init__(self, min_digits, max_digits):
# instantiate the object with a range of password digits, typically 4 to 10 digits
if min_digits < max_digits:
self.min_digits = min_digits
self.max_digits = max_digits
else:
self.min_digits = max_digits
self.max_digits = min_digits
# Iterator access definition
def __iter__(self):
return self
def __next__(self):
rst = str()
for item in range(0, random.randrange(self.min_digits, self.max_digits+1)):
rst += random.choice(MyIterator.letters)
return rst
def extract():
start_time = time.time()
zfile = zipfile.ZipFile("test.zip")
for p in MyIterator(5, 6):
try:
zfile.extractall(path=". ", pwd=str(p).encode('utf-8'))
print("the password is {}".format(p))
now_time = time.time()
print("send time is {}".format(now_time - start_time))
sys.exit(0)
except Exception as e:
pass
if __name__ == '__main__':
extract()
文字の並びは組み合わせが多いので、待つ必要があります。
補足説明
この方法が有効でないのは、主にファイルパスが正しくないこと(私のコードは解凍のためにPythonスクリプトがあるディレクトリのzipファイルをデフォルトとしています)、暗号化方法が従来の暗号化でないことが理由です。このブルートフォース方式は、ビット数とパスワードの形式(文字だけなど)を覚えている場合にのみ有効で、完全なブルートフォースクラッキングは現実的ではありません、何しろ暗号化は無意味に行われるものではありませんからね。
今回はPythonを使った簡単なzipファイルの解凍パスワードについて紹介しましたが、より関連するPythonのzipファイルの解凍パスワードの内容はBinaryDevelopの過去の記事を検索するか、以下の関連記事を引き続き閲覧してください!今後ともBinaryDevelopをよろしくお願いします。
関連
-
[解決済み】ロガーにハンドラが見つからない
-
[解決済み】RuntimeError: 無効な DISPLAY 変数
-
[解決済み] テスト
-
[解決済み】plotly: TypeError: 辞書の更新シーケンス要素#0をシーケンスに変換できない
-
[解決済み] [Solved] 'list'オブジェクトに'items'属性がないのはなぜですか?
-
[解決済み] 'ValueError: not enough values to unpack (expected 2, got 0)'.
-
[解決済み] numpy ValueError 形状が整列していない
-
[解決済み] NumPyの配列を列ごとに解凍する
-
長年にわたるPythonで陥った落とし穴~不要な文字の消去について
-
redis' という名前のモジュールがない
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】pythonで文字通り何も返さない方法はありますか?
-
[解決済み】範囲外のポップインデックス【重複あり
-
[解決済み】pytorchでmodel.eval()は何をするのですか?
-
Pythonプログラミング webpyフレームワーク 学習とdefのテンプレート
-
[解決済み] pipが壊れました。DistributionNotFoundエラーを修正するには?
-
[解決済み] 「from __future__ imports must occur at the beginning of the file": ファイルの先頭を定義するものは何ですか?
-
[解決済み] AttributeError: 'tuple' オブジェクトには 'shape' という属性がありません。
-
[解決済み] Python flask-cors ImportError: flask-cors'という名前のモジュールがない Raspberry pi
-
[解決済み] ソースディレクトリとビルドディレクトリを分離する」とはどういう意味ですか?
-
[解決済み] フロート値が整数であるかどうかを確認する方法