2012-12-30 87 views
0

我和zipfile类有很奇怪的行为,我希望有人能帮我解决困扰我的问题。zipfile几个密码匹配

我写了尝试打开由密码(这是被WinRAR ziped)加密的压缩文件很短的剧本,但原来这zipfile类不涨异常其他几个这是不正确的密码。

所以我对zip文件的密码是 '恶',但zFile.extractall没涨execpction时的密码是的

  • '结账' 之一,
  • 'disannuller',
  • 'euornithes' 或
  • 'yamaltu'。

使用任何列出的密码zipfile类中提取出后附加内容是不正确的。即使WinRar也不允许使用这些密码进行unziping。

我的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() 

UPDATE:

我知道,我跳过异常,但请从程序看的出来:

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" 

没有什么改变输出


UPDATE +发生了什么

@Phil冰霜Explain what happened

是确定它实际上是我添加的问题点o使用一些调试打印来比较密码和文件中的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() 
+3

它通过调用通 –

+0

确保为UKU写给使用(我认为这将是)除了NameError提高你只是忽略它的异常:然后做的东西,而不是传球。一个例子可能是:messagebox.showerror(“错误”,“错误的密码”)。 – Evilunclebill

+0

但如果exepction在行回答惜售= zFile.extractall(PWD =密码)下一行不应该被执行... –

回答

1

我猜这个计划的目标是暴力破解密码了一个zip文件。我猜你已经尝试了更长的密码列表,只有少数列出的问题没有引发异常,而你有更多的行为像预期的那样。

在我看来,随着zipfile的实施,你有一个接受密码的概率为1/255,因此不会引发异常。这是因为密码是通过检查一个字节的校验和验证:

if ord(h[11]) != check_byte: 
    raise RuntimeError("Bad password for file", name) 

full source

编辑:经过进一步的研究,这可能是a duplicate question

据我所知,压缩加密薄弱,通过比蛮力等手段容易破碎。然而,我从来没有理由自己去做,我也不知道你想要完成什么的细节,所以我不能提出更具体的解决方案。

+0

你是对的,我做了更多的教育目的比具体使用 –

+0

我写了一些代码,检查你已经解释(更新的第一篇文章),是的检查通过zipFile类的方式是不可靠的,谢谢你的帮帮我! –

3

将引发异常,但你“吞咽”,因为你不显示它的任何错误,只是忽略它称呼“通过”。

此外,您的代码还有另一个问题,主模块部分缩进不正确。 在当前的代码在main()不会被调用,因为调用主模块是你忽略了在代码中异常的main()的

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: 
     print password + " was incorrect" 


def main(): 
    zFile = zipfile.ZipFile("evil.zip") 

    for password in diffrentPass: 
     extractFile(zFile, password) 

if __name__ == '__main__': 
    main() 
+0

...我知道了这个代码... wrongpass1是不正确的 wrongpass2是不正确的润版液 密码:检出 润版液密码:disannuller 润版液密码:euornithes 润版液密码:邪恶 润版液密码:yamaltu 进程退出代码为0完成工作 –

+0

罚款除了这个事实,它应该实际上停止时,它已经找到了正确的:) –

+0

@UkuLoskit当然你可以停下来找到一个匹配的密码,但是不管怎样,它不应该开始报告不正确的密码。 –

0

定义的一部分。如果你想让它引发异常,则:

def extractFile(zFile, password): 
    try: 
     answer= zFile.extractall(pwd=password) 
     print 'Fount password : ', password 
    except Exception, e: 
     # do something here before raising exception 
     raise e 

或者根本就不使用tryexcept块。

评论后编辑

如果你想向大家报告,密码是错误的,那么你需要做的是,在except块,因为当执行zFile.extractall(pwd=password)异常已经抛出了错误的密码,所以print会从未执行过。

def extractFile(zFile, password): 
    try: 
     answer= zFile.extractall(pwd=password) 
     print 'Password "%s" is correct' % password 
    except Exception, e: 
     print 'Password "%s" is incorrect' % password 
     pass 
+0

当最初抛出excetion时,'print'不会执行。不报告*期望*错误有什么问题? –

+0

@ Anony-Mousse请检查最新的答案。谢谢 –

+0

你最后除了有什么问题。在你的例子中除了密码是inccorect时将打印'fount密码'? – Evilunclebill

0

它看起来像你明确放弃可能被提出,这里的任何异常:

try: 
    answer= zFile.extractall(pwd=password) 
    print 'Fount password : ', password 
except: 
    pass 

如果zFile.extractall()抛出一个异常,则执行except:块。您的除外块包含pass,这在Python中意味着“什么都不做”或“无操作”。

+0

的'print'当EXCETION最初抛出将不会执行。不报告*期望*错误有什么问题? –

+0

@ Anony-Mousse好点。我现在意识到代码的意图必须是尝试许多密码并打印出正确的密码。我会建议以不同的方式来构建代码,以便清楚地表明这一点,但这会导致无关紧要的问题。 –

0
try: 
    zFile.extractall(pwd=password) 
    print 'Fount password : ', password 
except: 
    pass 

我删除了“答案=”,它没有任何意义。 另外如果你想出路的异常处理程序循环,你可以这样做:

def zipExit(password): 
    print 'Password found: '+password 
    exit(0) 

def extractFile(zFile, password) 
    try:  
     zFile.extractall(pwd=password) 
     zipExit(password) 
    except: 
     pass 

def main(): 
    ....the rest of your code here. 

而对于一个密码破解(如果你使用Linux,但我不asuming因为你使用WinRAR)你不想在屏幕上输出失败的尝试,这就是为什么异常处理程序通过而不是打印某些东西。 因为您可以将程序指向输出到文件。

〜/蟒蛇zipcrack.py> cracked.password

这样的事情。