Python: Rar暴力破解器

4

我正在尝试暴力破解一个受3个字符密码保护的RAR归档文件:

import os
Alphabets = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
for a in range(0,26):
 for b in range(0,26):
  for c in range(0,26):
   Brute = Alphabets[a] + Alphabets[b] + Alphabets[c]
   os.popen4("Rar.exe x -p" + Brute + " Protected.rar")
#   raw_input()
raw_input("Done !")

代码运行良好,但是速度非常慢!!

我认为导致它缓慢的原因是 "popen4" 的多次打开。因为我尝试将生成的单词存储在一个文本文件中,程序在不到5秒钟内完成。

有什么想法可以提高性能吗?


我不确定我是否应该帮你,但是一个立即跳入脑海的事情是预生成表。 - Skurmedel
关于Python/算法的合法问题,但意图确实值得怀疑。 - AJ.
11
密码是dog、cat或god。 - Aiden Bell
2
@AJ:安全机制存在就是为了被攻破。 - AndiDog
先尝试这些(对3个被黑客攻击的数据库中最常见密码的分析):http://blog.jimmyr.com/Password_analysis_of_databases_that_were_hacked_28_2009.php - Chris Lawlor
1
也许这只是你问题中的一个笔误,但是你是指“3个数字”还是“3个字符”?如果是实际数字,你的算法将永远找不到密码。 - Robert Gowland
5个回答

9
你可以使用(或学习)rarcrack。它是用C语言编写的,在Linux上编译没有问题(在Windows上需要进行大量更改)。
通常,为每个测试密码打开一个进程非常昂贵。您应该尝试自己打开存档文件,然后针对所有密码进行测试。无论如何,您都需要测试rar.exe的返回值以确定提取是否成功。
为了获得最佳性能,您应该使用C(或类似语言)编写程序。有一个名为“libunrar”的Linux软件包,可以帮助您打开RAR文件。

6
您可能需要考虑使用一些标准库模块:
>>> import string
>>> import itertools
>>> from subprocess import Popen, PIPE
>>> for i in itertools.product(string.ascii_uppercase, repeat=3):
    pr = Popen(['rar.exe', 'x', '-p', ''.join(i), 'protected.rar'], stdin=PIPE, stdout=PIPE)
    pr.communicate()

这并不一定会提高性能,但它确实能让你的代码更加整洁。


1
itertools.permutations不能给你所有可能的3个字符密码。你需要使用itertools.product(*[string.uppercase]*3)。此外,没有名为os.join的函数;最接近的是os.path.join,它执行完全不同的操作。请改用''.join(i)。最后,由于提问者的问题是性能,Python脚本本身所需的时间可以忽略不计,因此这些都不相关。 - David
@David:确实是“product”,谢谢。我认为我的代码提供了所有可能对原始代码进行的性能改进,无论它们是否微不足道都不是很相关。 - SilentGhost

4
生成密码很简单,所以只需要5秒钟就可以创建26^3 = 17576个密码。最耗时间的是打开和尝试解密存档文件,这方面你无法控制。
加速此过程的方法不多,首次尝试后rar二进制文件和输入文件将被缓存在内存中:根据需要让其在过夜或周末运行即可。

1
生成一个100K的文本文件耗费将近5秒钟,对我来说似乎有点慢。 - Mike DeSimone

1

首先生成密码,然后并行调用 rar.exe 进程(这似乎是瓶颈)怎么样?


1

你可能无法缩短尝试解密存档所需的时间,但是假设密码不是完全随机的(虽然它可能是),如果你按使用频率递减的顺序排列字母,你可能会更快地找到正确的密码。

例如,在Linux Journal中,shell脚本栏目分析了一些大型文本,确定e、t、a、o、n、i、s、r、h和d是这些文本中最常见的字母(并且可能接近整个英语)。因此,将第二行更改为:Alphabets = "ETAONIBSRHDCFGJKLMPQUVWXYZ" 可能会使您的算法在较少的迭代次数内找到密码。

编辑:重新考虑 如果密码是如某人所示的“cat”,则原始排序需要通过外部循环进行3次传递,而新版本需要进行11次传递,因此在这种情况下它不会更快地解决问题。因此,也许你需要通过尝试预测最可能的第一个字母来优化外部循环的列表。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接