了解信使协议加密

逆向工程 加密 密码学 协议
2021-06-24 22:19:03

为了我个人的好奇心和发展(构建一些模仿协议的代码),我试图弄清楚在 Windows 的特定聊天应用程序中通信协议加密是由什么组成的。

根据我几年前所知道的,有人设法对加密进行逆向工程,它使用 - 至少是 AES 加密和一些异或。从那以后它已经更新了很多次,当我尝试运行它时signsrch,与旧版本相比,它有很多参考资料。

所以,我试图阅读我能找到的关于如何识别应用程序中的加密方法的内容,到目前为止,我已经到了每当我尝试发送某些东西(登录名和密码)时在 Ollydbg 中触发断点的地步.

但是现在,我迷路了……

我应该查看堆栈以尝试找到显示我在加密之前输入的字符串的纯 ASCII 还是什么?

此外,令我感到困惑的是signsrch,在 Ollydbg 中查看时,显示的地址似乎与应用程序中的地址不同:据我所知,地址指向各种加密签名,但这些地址 - 在 Ollydbg 中- 只是汇编命令。

有人能就这个问题给我一些建议吗?

2个回答

例如,请考虑https://polarssl.org/aes-source-code 上的AES 源代码这有各种表,其中之一是Forward S-Box, FSb- 在所有 AES 实现中应该是相同的。因此,signsrch如果找到 fsb 表,像这样的签名检查器会说“AES”,但它不知道使用了哪种 AES 实现。

现在,FSb 表用于源代码中的各种功能 - aes_gen_tables, aes_setkey_enc, aes_setkey_dec, aes_crypt_ecb- 它们都使用相同的 FSb 数组。如果您查看不同的 AES 实现,这些函数可能会有不同的名称,使用不同的局部变量集,以不同的方式处理错误,并且在目标代码中与 polarssl 的目标代码不会太相似。

此外,根据您的编译器使用的框架,您的应用程序可能会调用一个框架函数,该函数调用其他东西......并到达aes_*更深 5-10 级的基本函数。因此,没有简单的方法可以将您的断点与实际的 aes_* 函数相匹配。

第三,signsrch检测 AES 签名的事实并不一定意味着根本使用 AES。您的应用程序可能会链接openssl库,这些库会引入各种加密功能,甚至可能是您的应用程序中未使用的那些。

你能做的最好的事情是在 FSb 或类似的表上放置一个硬件断点,当程序实际使用 AES 时会触发。然后,向上遍历堆栈以找出哪个函数调用了哪个函数,以及这与您的名称/密码函数有何关联。尝试将此函数回溯与已知的 AES 实现相匹配(我将从 openssl 开始),这样您就可以找出高级例程的位置。然后,在这些高级例程上放置断点,以了解加密的内容、加密结果是什么,以及这与网络上的位有何关系,您可以使用wireshark 或类似工具捕获这些信息。

这本身不是逆向工程答案,而是更多的一般常识方法。由于它是一个聊天应用程序,它大概使用了网络。我会在使用诸如wireshark之​​类的网络数据包解析器(嗅探器)时启动该应用程序。从那里我会尝试确定是否正在使用常见的加密技术(例如 TLS 加密)。您可能会发现这是一个适当的解决方案。此外,在调试器中运行程序时使用网络嗅探器可以帮助您识别与网络数据包传输相对应的代码的相关部分,从而通过从该点反向逐步进行构建。