如果您可以看到TLS握手,但仅此而已(即连接请求之后没有任何其他请求),客户端(本例中的恶意软件)可能会将服务器证书(或至少是公钥)固定在一起,并拒绝Fiddler提供的证书,因为这不是期望的证书。如果是这样的话,您仍然有一些选项(然而,它们都需要某种程度的反向工程)。不按特定顺序:
- 由于.NET二进制文件通常严重依赖于.NET运行时提供的类,所以您可以用修改后的版本替换关键DLL,从而使功能变得更好。例如,您可以将它使用的任何HTTP客户端类替换为同样记录所有请求和响应(以纯文本形式)到文件的类。其中一种方法就是下载相关DLL的源代码,编辑您所关心的类(Es),然后重新编译它。不过,如果恶意软件对其库强制执行签名检查(几乎可以肯定),这将无法工作;您需要禁用这些检查。
- 您可以尝试反向工程恶意软件,以找到证书/公钥固定代码,并禁用它。如果二进制文件不是模糊的,但实际上它很可能是模糊的,那么这几乎是微不足道的;混淆会使逆向工程变得更难,但并非不可能。.NET程序集有许多免费的反编译工具可供使用。
- 与#2相同,除了尝试更改代码流以不执行证书钉扎外,您还需要查找被固定到的证书或公钥(注意:它可能只是键/ cert的散列/拇指打印,而不是完整的东西),并将其替换为它从Fiddler看到的证书的适当值。如果您非常幸运,那么预期的cert存储在二进制文件之外,您可以简单地替换它;如果不太幸运,则需要深入到二进制文件中,以找到执行检查的位置以及预期值的计算方式,并更改可能是硬编码的数组或其他东西。
- 类似于#1,在带有HTTP客户端函数断点的调试器下运行恶意软件,并找到HTTPS请求和响应的纯文本值。假设恶意软件使用标准的.NET HTTP客户端类,这需要相对较少的反向工程,并且您不需要恶意软件的私有符号(微软类的符号可以从它们的符号服务器获得)。然而,几乎所有的恶意软件检查附加调试器-这是书中最古老的技巧之一-所以你需要首先找到和禁用这些检查,如果你想要工作。
- 同样,与#1和#2相结合,您可以对恶意软件进行反编译,查找它在何处发出HTTPS请求,从何处获取响应,并使用您自己的代码“检测”这些函数,这些代码以纯文本的形式将这些请求和响应记录到文件中。这样做的好处是不需要阅读太多的代码(大概是模糊的)--您只是在寻找一些特定的类,然后可能会在调用它们的过程中添加一个包装器--但这仍然是一项很大的工作。此外,恶意软件可能具有自我完整性检查,如果它认为自己已被修改,将无法运行或更改其行为;为了获得适当的结果(对于这种方法或其他更改二进制文件的方法),您也需要查找、删除或修复这些检查。
另一种可能是服务器在完成握手之前正在等待来自恶意软件的客户端证书,但在这种情况下,我希望Fiddler会提示您。如果最终发现问题是客户端证书,您将需要找到该证书并将其提供给Fiddler。
恶意软件分析可能很难。一个写得很好的恶意软件将是一个很难破解的难题。另一方面,真正严重的恶意软件不太可能用.NET编写--反编译太容易了,而且您可以使用本机代码使用更复杂的技巧--所以反分析缓解可能不会太重。