逆向工程可以绕过软件密码吗?
简而言之,是的,您可以修改可执行文件、使用调试器等来更改正在执行的代码的逻辑。
但是,这可能还不够。
要使用您的“.zip 密码”示例,受密码保护的档案使用密码来派生加密密钥。除非您提供正确的密码,否则生成的密钥将是错误的,即使您将其修改为使用错误的密钥,也无法成功解密 ZIP 文件。
另一种情况可能涉及以更高权限运行的 setuid 可执行文件。您可以在调试器下运行它,或者将其复制到您的用户帐户并进行更改,但这将实现的只是使用您的用户权限运行它,从而消除利用的可能性。
那么您对 .zip 密码的看法并不准确。许多其他程序也使用的方法是始终运行解密算法并获得结果,甚至在程序达到“密码好坏”决定之前。诀窍是解密会在任何密码上产生垃圾,除了一个“神奇”(或者更确切地说 - 数学上)计算正确数据的好密码。所以程序不知道好的密码是什么。
您要破解的“好或坏”时刻仅检查结果是否为垃圾。覆盖它并没有太大的好处。
是和否。
由于还没有人想出一个现实生活(非计算机相关)的例子,我会在这里尝试:
想象一下试图登机。你需要一张登机牌,否则安检人员不会让你通过。如果您可以访问系统并且可以修改它(假设您是 CEO),您可以绕过安全性吗?是的!你可以:
- 删除安全人员(删除整个身份验证组件)
- 要求伙计们让所有人进入(删除“如果乘客有有效登机牌”检查)
- 如果有人出示了特殊的登机牌,请这些人给予访问权限(添加新的验证规则以允许伪造凭据)
现在,另一种情况:一堆保险箱存放在银行中。要打开保险箱,您需要一把物理钥匙来转动锁。
能拉上前一招吗?是的,你可以,但这无济于事。这不像站在那里的安全人员可以访问所有保险箱 - 他没有任何一个保险箱的钥匙。你可以打败他,但他不仅拥有打开锁所必需的东西(物理钥匙)。
您可以尝试撬锁(暴力破解),但这将非常耗时(现代加密密钥的数学表明您需要数十亿年才能解锁它,即使您拥有世界上所有的计算机)你)。所以你就在那里 - 在这个设计(数据加密)中,获取存储数据的唯一方法是使用密钥,这使得它无法绕过。
当然,软件可以做任何你编程它做的事情。
举个简单的例子,如果为我提供了一个检查密码的 Python 程序:
password = raw_input('Enter your password: ')
if password != 'oh-so-secret':
sys.exit(1)
do_secure_thing()
我可以很简单地将其更改为不关心密码是什么:
password = raw_input('Enter your password: ')
do_secure_thing()
(在这种情况下,您也可以只查看硬编码的明文密码并输入它。)
对于二进制应用程序,您必须先对它们进行反编译,然后才能修改源代码,但是对于常用语言有很多反编译器。
这就是存在代码签名的原因。
现在,如果这不是您自己的系统,您的选择可能会更加有限。在大多数类 Unix 系统上,可执行文件通常以非 root 用户的只读和只执行权限存储;因此,如果您不是 root,则无法修改目标可执行文件。还有其他不太直接的方法可以尝试,但如果这些方法失败了,您正在考虑转移到不同的向量。
例如,键盘记录器将记录用户输入的密码,以便您以后自己重用它们。
另一种不需要修改程序源的攻击方法是修改动态库加载路径,使程序使用您编写的库调用,而不是它期望的调用。如果他们使用外部的、动态加载的库来管理密码,并且该库具有verify_password()
返回布尔值的函数,则您可以编写自己的verify_password()
始终返回 true 的函数,然后将其加载。
将答案从“是”变为“否”的真正区别在于密码是否实际上不是密码,而是加密密钥。如果数据被加密,那么任何外部程序做什么都无关紧要 - 在解密算法被提供正确的密钥之前,它仍然加密数据。