私はクラスで非常に奇妙な振る舞いをしておりzipfile
、誰かが私を悩ませている問題を解決するのを手伝ってくれることを願っています.
パスワードで暗号化された zip ファイル (WinRar で圧縮されたもの) を開こうとする短いスクリプトを作成しましたが、zipfile
他のいくつかのパスワードが間違っている場合、クラスは例外を発生させないことがわかりました。
したがって、zipファイルのパスワードは「悪」でしたがzFile.extractall
、パスワードが次のいずれかである場合は実行されませんでした
- 'チェックアウト',
- '断捨離者',
- 「euornithes」または
- 「ヤマルツ」。
zipfile
リストされたパスワードを使用してクラスで抽出した後の追加コンテンツが正しくありませんでした。WinRar でさえ、これらのパスワードを使用して解凍することはできません。
私のPythonコードは次のとおりです。
import zipfile
diffrentPass = [
'wrongpass1',
'wrongpass2',
'checkouts',
'disannuller',
'euornithes',
'evil',
'yamaltu']
def extractFile(zFile, password):
try:
answer= zFile.extractall(pwd=password)
print 'Fount password : ', password
except:
pass
def main():
zFile = zipfile.ZipFile("evil.zip")
for password in diffrentPass:
extractFile(zFile, password)
if __name__ == '__main__':
main()
アップデート :
私は例外をスキップしたことを知っていますが、プログラムから見てください:
wrongpass1 was incorrect
wrongpass2 was incorrect
Fount password : checkouts
Fount password : disannuller
Fount password : euornithes
Fount password : evil
Fount password : yamaltu
Process finished with exit code 0
行:
Fount password : checkouts
Fount password : disannuller
Fount password : euornithes
Fount password : yamaltu
絶対に現れてはならない
たとえば、次のように追加します。
def extractFile(zFile, password):
try:
answer= zFile.extractall(pwd=password)
print 'Fount password : ', password
except Exception, e:
print password + " was incorrect"
出力は何も変わらない
更新 + 何が起こったのか
@Phil Frost何が起こったのか説明してください
それが実際に私の問題のポイントであることを確認するために、スクリプトにいくつかのデバッグ出力を追加して、パスワードとファイルのcheck_byteを比較します。
出力例:
#!! Wrong pass, check_byte are diffrent
# raised RuntimeError("Bad password for file", name)
Checking bytes for : wrongpass1
pass check_byte : 47
file check_byte 112
Pass is correct for zipfile class : False
#!! wrong password but for zipFile is ok , check_byte are the same
# but file will be the unpacked incorrectly
# RuntimeError("Bad password for file", name) will be not rise
Checking bytes for : checkouts
pass check_byte : 112
file check_byte 112
Pass is correct for zipfile class : True
Fount password : checkouts
#!! password ok
Checking bytes for : evil
pass check_byte : 112
file check_byte 112
Pass is correct for zipfile class : True
Fount password : evil
コード :
import zipfile, zlib, binascii, struct
from zipfile import _ZipDecrypter
diffrentPass = [
'wrongpass1',
'wrongpass2',
'checkouts',
'disannuller',
'euornithes',
'evil',
'yamaltu',
'wrongpass1',]
def extractFile(zFile, password, bytes):
print '\nChecking bytes for : ', password
zd = _ZipDecrypter(password)
h = map(zd, bytes[0:12])
print 'pass check_byte :', ord(h[11])
for item in zFile.infolist():
if item.flag_bits & 0x8:
check_byte = (item._raw_time >> 8) & 0xff
else:
check_byte = (item.CRC >> 24) & 0xff
print 'file check_byte ',check_byte
print "Pass is correct for zipfile class : " , ord(h[11]) == check_byte
try:
answer= zFile.extractall(pwd=password)
print 'Fount password : ', password
except Exception, e:
pass
def main():
# begining of ziped file must be cut off dummy method works ony on this specific zip file
# ....20111126036.jpg
bytes = open('evil.zip', 'rb').read(45+12)[-12:]
zFile = zipfile.ZipFile("evil.zip")
for password in diffrentPass:
extractFile(zFile, password,bytes)
if __name__ == '__main__':
main()