我正在尝试对协议进行逆向工程(它适用于服务器即将关闭的游戏)。我有两件事:1)程序的二进制文件 2)来自 Wireshark 的数据包转储(如果需要,我仍然能够获得另一个转储)。现在,从我从转储中可以看到的协议是 TLS/SSL(不确定是哪一个)加密的。我知道 Wireshark 具有解密这些数据包的能力,因为我有所需的密钥......但是我到底如何从二进制文件中提取密钥?
tl;dr 鉴于原始二进制文件,我可以访问纯文本 SSL 吗?
我正在尝试对协议进行逆向工程(它适用于服务器即将关闭的游戏)。我有两件事:1)程序的二进制文件 2)来自 Wireshark 的数据包转储(如果需要,我仍然能够获得另一个转储)。现在,从我从转储中可以看到的协议是 TLS/SSL(不确定是哪一个)加密的。我知道 Wireshark 具有解密这些数据包的能力,因为我有所需的密钥......但是我到底如何从二进制文件中提取密钥?
tl;dr 鉴于原始二进制文件,我可以访问纯文本 SSL 吗?
如果您在二进制文件运行时有权访问它,则完全有可能提取解密 SSL/TLS 会话所需的密钥,即使使用完美的前向保密。有一个 48 字节的密钥,称为主密钥,由双方共享,用于生成连接的会话密钥。
如果应用程序使用标准的 Win32 API 进行 SSL 连接,则拦截密钥生成的点在 inside lsass.exe
, at:
Caller: ncrypt!_Tls1ComputeMasterKey@32+0x57
EIP: ncrypt!_PRF@40+0x11a
更多信息可以在我对“解密 Windows 8 应用程序和 Azure 之间的 TLS 数据包”的回答中找到。
更一般地说,我(与几位优秀的合著者)最近开发了用于扫描所有内存访问以获取有趣数据(例如 SSL/TLS 密钥)的技术。一篇关于此的论文(“ Tappan Zee (North) Bridge: Mining Memory Accesses for Introspection ”)已在 CCS 上发表,其软件可在 github 上找到:PANDA/TZB。特别看一下keyfind
插件,它采用样本(加密)数据包并扫描内存访问以获取 TLS 主密钥。
查找新应用程序生成 TLS 主密钥的位置的过程是:
begin_record <session_name>
,运行应用程序,然后end_record <session_name>
.scripts/list_enc.py
在抓包上运行以提取keyfind
插件所需的信息。将此信息放在keyfind_config.txt
.begin_replay <session_name>
使用-panda-plugin x86_64-softmmu/panda_plugins/panda_keyfind.so
命令行上的指定运行会话的重播(在 QEMU 监视器中)。在(非常)很长时间后,它会吐出匹配 TLS 密钥被读取或写入的代码位置key_matches.txt
。该文档目前非常粗略,但查看源代码应该可以解决您的任何问题(并随时在此处要求澄清!)。
有关为此使用熊猫的更多信息,请参见:此处
正确实施的SSL 流量具有前向保密性。这意味着即使您拥有整个数据包转储和所需的私钥,您也无法解密它。正如 Brendan Dolan-Gavitt 在他的回答中指出的那样,您需要在运行时访问二进制文件才能做到这一点。
您可以尝试做的是使用ettercap 之类的东西设置 SSL mitm 。根据 SSL 实现,这可能有点复杂并且可能不起作用。
现在,不是直接回答您的问题,但它可能会帮助您实现您想要的:
你可以做的另一件事,因为你的目标是分析底层协议是在更高层次上做钩子。我以前使用oSpy做过类似的工作。
oSpy 是一个帮助在 Windows 平台上运行的逆向工程软件的工具。由于当今存在的专有系统数量众多(同步协议、即时消息等),如果仅限于传统技术,开发可互操作的解决方案所需的工作量将很快成为一个很大的负担。然而,当嗅探在 API 级别完成时,它允许对正在发生的事情进行更细粒度的查看。
oSpy 通过附加到要分析其流量的进程然后监视某些 API 来工作。