我试图读取最初由Visual Basic 6编写的程序生成的数据文件(后来又用Java重写),以便可以使用自己的工具来处理它们。
该程序是美国政府创建的公共领域软件;没有许可协议禁止这样做。我不能提及程序的名称或指向其网站的链接,因为程序员可能会更改明年版本的混淆,并且我将不得不重复我的反向工程工作。
基础数据文件格式是基于文本的,而混淆是带有硬编码密钥的某种流密码。我可以将数据文件XOR在一起以取出一些数据(用重复的ASCII字符填充字符串字段之一),但是我想避免将整个密钥流嵌入到程序中。
在.exe文件中进行搜索会显示对名为RC4ini的子例程的调用以及一个我认为是关键的字符串(它不会出现在用户界面的任何位置)。我在Planet Source Code上发现了此加密库的源代码,对RC4的有效实现进行了正确的更改(在JavaScript中,因为这是我主要使用的编程语言),并尝试使用它。
我试图在文件中的每个偏移处搜索加密的数据,但是解密失败。为什么会这样呢?
最佳答案
如果他们使用的是RC4,则有几种选择。
一种选择是找出他们何时调用RC4并转储密钥或纯文本消息。使用像Windbg或ollydbg这样的调试器,这很容易做到。从根本上讲,它们正在违反加密法,并且由于此属性,所有DRM都将失败。
另一攻击是,如果相同的密钥用于2条消息,则如果您知道一条消息的纯文本,则可以将其与相应的密文进行异或运算以显示PRNG流。然后可以将此PRNG流与未知消息的密文进行XOR运算,以获得其对应的明文。自然,如果每个消息的密钥都不相同(例如使用IV),则此攻击将无效。
关于java - 如何打败RC4般的混淆?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4334944/