拆解以识别加密算法

4

目标(总体)
我的最终(长期)目标是编写一个将二进制文件导入到另一个应用程序中的导入器。

问题背景

  • 我对二进制文件格式中的两个领域感兴趣。其中一个是加密的,另一个是压缩的,可能也是加密的(请参见我如何得出这个结论 here)。
  • 我有一个查看器程序(我将其称为viewer.exe),可以打开这些文件进行查看。我希望这能提供一些线索。
  • 我很快就会有相关的解密输出进行比较,并有要搜索的值。
  • 这是我找到的最相关的stackoverflow Q/A

具体问题
在我拥有的资源下,识别使用的算法的最佳策略是什么?

当前想法

  • 我意识到如果没有密钥,仅从数据中识别算法几乎是不可能的。

  • 拥有一个文件和一个viewer.exe,我必须在某个地方有密钥。无论它是公共的,私有的,对称的等等......弄清楚这一点将是不错的。

  • 我想使用OllyDbg和findcrypt插件来反汇编viewer.exe作为第一步。我只是不熟练处理这种事情,无法完成。

资源
完整示例文件
我感兴趣的领域中提取的二进制文件
解密数据在此zip归档中,有一个表示x,y,z的浮点数的二进制列表(model2.vertices),以及一个二进制的整数列表(model2.faces)。我还包括了一个“stl”文件,您可以使用许多免费程序查看,但由于数据存储在STL的奇怪方式,这不是我们期望从原始文件中导出的内容。

进展
1. 我使用Olly进行了程序反汇编,然后在程序导入文件之前暂停后,做了我唯一知道的事情,“搜索所有引用文本”。然后,我搜索了像“crypt,hash,AES,encrypt,SHA”等单词字符串。我找到了很多东西,最明显的是“Blowfish64”,它似乎与我的数据偶尔多4个字节很搭配(而且由于保证mod 12 = 0),这对我来说看起来像是填充64位块大小(奇数数量的定点会导致非mod 8数量的字节)。我还发现了错误消息,如...

“Invalid data size, (Size-4) mod 8 must be 0"

在阅读Igor以下回复后,这是signsrch的输出。我已经更新了这张图片,并用绿点标出,当用int3替换时不会出现问题,如果程序无法启动,则为红色,如果在加载感兴趣的文件时失败,则为橙色。没有点意味着我尚未测试它。

Signsrch结果注释

附属信息

  • 我使用的是Windows 7 64位操作系统
  • viewer.exe是Win32 x86应用程序
  • 数据已经进行了base64编码和加密
  • 解密后的数据是一组12个字节,代表3个浮点数(x、y、z坐标)
  • 我使用的是带有findcrypt插件的OllyDb v1.1,但我的用法仅限于跟随这个家伙的YouTube视频

你为什么不在Superuser上问这个问题呢? - President James K. Polk
IDA有一种名为FLIRT的技术,可以识别已知函数。如果它们使用标准加密库,它可能会识别算法。 - CodesInChaos
@GregS 因为我不知道那是一个更好的提问地点。我会尽快去查看。 - patmo141
我并不认为SuperUser比StackOverflow更适合这个问题。你可以考虑http://security.stackexchange.com/。虽然我不确定它是否比SO显著更好。 - Jonathan Leffler
@CodeInChaos 嗯,我有免费的IDA,FLIRT是内置的还是插件?我也会去查一下。 - patmo141
显示剩余5条评论
2个回答

9

许多加密算法使用非常特定的常量来初始化加密状态。您可以使用类似signsrch的程序来检查二进制文件是否具有这些常量。如果您得到任何可信的命中结果,请在IDA中打开文件并搜索这些常量(Alt-B(二进制搜索)会有所帮助),然后跟随交叉引用以尝试识别使用的密钥。


哇,这太棒了。请查看signsrch输出的照片。由于我仍然不熟悉Olly、IDA等工具,下面的交叉引用部分将会对我有一定难度。 - patmo141
好的,我明白signsrch已经识别出了常量,但是我该如何搜索它们呢?例如,Blowfish bfp表。00856893是实际的常量还是程序中常量的位置?对于幼稚的回答,我深感抱歉。 - patmo141
似乎可以使用-L选项获取实际常量。但是,如果这些数字是文件偏移量,则可以使用“跳转到文件偏移量”导航到那里。 - Igor Skochinsky

1

你无法区分好的加密(例如使用XTS模式的AES)和随机数据。这是不可能的。尝试使用ent比较/dev/urandom数据和TrueCrypt卷。没有办法将它们彼此区分。

编辑:重新阅读您的问题。确定对称算法、哈希和模式的最佳方法(当您拥有解密密钥时)是尝试它们所有。暴力破解可能的组合,并进行一些测试以确定是否成功解密。这就是TrueCrypt挂载卷的方式。它不知道算法,因此尝试所有可能性并测试前几个字节是否解密为TRUE。


1
你说得没错,但是你似乎没有读懂楼主的问题。“我知道如果没有密钥,仅从数据中识别算法几乎是不可能的”。这就是为什么他想要用反汇编器来找出算法。 - CodesInChaos
感谢。选项1:暴力破解,一旦我找到密钥就使用所有合理的方法。 - patmo141

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