通过分析可执行文件来反转加密

逆向工程 加密
2021-06-12 01:54:59

我有一个程序可以从文件中读取数据,解析/组织它,然后将它作为加密的 XML 输出。应用程序还可以采用加密的 XML 并吐出原始文件。我此时的目标是访问明文 XML(我对明文原始文件不感兴趣,因为它不是 XML 组织的)

我还不知道加密是什么,尽管论坛上的一个人说它是 AES-128(不确定他是如何得出这个结论的)。

我在应用程序上使用 KANAL 插件运行 PEiD,它没有检测到任何加密签名。

因为我可以访问该程序,并且有一些过去在 WinXP 上利用 BO 的一些经验以及一些 ASM 知识,所以我想我可以使用调试器尝试一下。

简而言之,我应该遵循哪些一般步骤来解决这个问题?在这种情况下,最好开始寻找加密密钥本身,还是找到一种方法来使用应用程序的加密/解密功能对我有利?

1个回答

通常有很多方法可以开始,您想使用哪一种取决于您的经验。此外,对一个目标有效的方法可能在另一个目标上失败,反之亦然。我首先要说的是:

  • 使用 signrch 检查可执行文件是否链接了标准加密算法。请注意,这可能会产生误报(例如,如果应用程序链接 openssl,您可能会发现许多算法的签名,即使其中只有一两个被使用)
  • 检查文件中与加密相关的字符串,并在谷歌上搜索它们。也许这有助于找到使用了哪个加密库。例如,该字符串可SHA-%d test #%d:快速通向polarssl源代码。
  • 在运行 procmon 时跟踪应用程序。在写入加密文件时,您可能会发现一系列CreateFile, multipleWriteFile和 a CloseFilecall ,与ReadFile读取加密文件时相同在某些情况下,这些调用的参数已经给了你一个提示;例如,如果第WriteFile一个的字节数为 32,之后的每个调用都为 4096,这可能暗示前 32 个字节是 256 位密钥。
  • 当调用ReadFileWriteFile发生时检查堆栈,您可以通过在调试器下运行应用程序时在那里放置断点来做到这一点,或者(更简单的恕我直言)查看多个procmon调用的堆栈这会提示您哪些函数链加密文件并写入文件。
  • 注意CreateFile,WriteFile加密文件上的堆栈差异,可能还有WriteFile其他东西。这些也可能会提示您哪个是您的加密功能。例如:

    • CreateFile为加密文件具有堆栈ABCDEFGH
    • WriteFile为加密文件具有堆栈ABCIJKLM
    • WriteFile其他东西有栈ABNOPKLM

    其中每个字母是一个堆栈条目。在这种情况下,我认为KLM是运行时库(的一部分fwritewrite......),因为无关WriteFile一同分享它,C是主要的作家功能(因为它是最后调用CreateFileWriteFile),并IJ功能加密和写入。

  • 将文件加载到 IDA 或 OllyDbg,并仔细查看C,IJ. 他们调用了哪些其他函数?其中一些功能是否与您之前使用 signrch 识别的功能相同?
  • 运行IDA,或OllyDbg的控制下的文件,并在放置断点CIJ,也许有些功能你发现signsrch。检查进入和退出这些功能的参数。他们中的一些人会敲钟吗?其中一个函数是否有一个参数,该参数是指向在调用函数之前看起来像 XML 的缓冲区的指针,而在调用函数之后则是垃圾?阅读时反之亦然?恭喜,您刚刚找到了进行加密的函数。
  • 当您找到执行加密的函数时,与其弄清楚它是如何工作的,不如用一系列s替换对它的调用(但请注意返回代码,也许您需要设置一些东西)可能会更容易Bingo,您现在有一个程序可以编写纯 XML 而不是加密的 XML,而无需弄清楚加密的细节,也不必编写一行代码(除非您考虑一系列s 代码)。NOPeaxNOP