如何解决寻找一种方法来避免应用程序授权中的 IP 欺骗
我开发了 C# 应用程序,它通过 TCP 使用授权。它连接到服务器应用程序(位于亚马逊 VPS 上),发送授权字符串并获得响应。 TCP 信息交换流通过 TLS1.2 加密,此外还使用 Rijndael 对称加密。同样在客户端应用程序内部,在 RemoteCertificateValidationCallback 上检查 SSLStream,其中将从 serer 获得的 ssl 证书的指纹与硬编码的指纹进行比较。客户端应用程序使用 .NetReactor 进行混淆,还可以选择生成本机 .exe,并且该 exe 还使用 Themida 进行压缩。但是黑客以某种方式破解了协议并创建了自己的假授权服务器,并将非法程序副本出售给他的“客户”。每次我更改加密秘钥,他马上就带着新的更新出去,所以是无限的挣扎。他不需要破解客户端.exe,他只需要更新他这边的服务器。我知道他使用 Windows 标准 postproxy 重定向流量,我已经在客户端 exe 中进行了额外检查,以查看注册表中是否存在 windows postproxy 记录,但没有任何效果。
所以我的问题是:在 C# 中有什么方法可以检查应用程序是否连接到“正确”服务器而不是“假”服务器?我正在使用标准的 TcpClient 类进行授权,但如果有帮助,可以迁移到其他类。
解决方法
正如@00110001 所提到的,您的问题可能比这更多,但可能public key pinning can help you。
假设您的二进制文件已签名(即,直接从您的网站下载后无法轻易更改,启动期间不会产生警告):
ServicePointManager.ServerCertificateValidationCallback += (sender,certificate,chain,sslPolicyErrors) =>
{
if (sender is HttpWebRequest httpWebRequest
&& httpWebRequest.RequestUri.Host.Contains("<your pinned domain>",StringComparison.OrdinalIgnoreCase))
{
return _allowedPublicKeys.Contains(certificate?.GetPublicKeyString());
}
else if (sslPolicyErrors == SslPolicyErrors.None)
{
return true;
}
return false;
};
但是,如果“黑客”重新发布您的二进制文件及其更改,这似乎是该人指向另一个授权服务器时所做的,那么您就不走运了。
编辑:如果您使用 HttpClient
并且只需要固定一些出站请求,您可以执行以下操作:
internal HttpClient GetSecureHttpClient()
{
var handler = new HttpClientHandler();
handler.ClientCertificateOptions = ClientCertificateOption.Manual;
handler.ServerCertificateCustomValidationCallback = (httpRequestMessage,sslPolicyErrors) =>
{
if (httpRequestMessage.RequestUri.Host.Contains("<your pinned domain>",StringComparison.OrdinalIgnoreCase))
{
return _allowedPublicKeys.Contains(certificate?.GetPublicKeyString());
}
else if (sslPolicyErrors == SslPolicyErrors.None)
{
return true;
}
return false;
};
var client = new HttpClient(handler);
return client;
}
// use:
var _ = await GetSecureHttpClient().GetAsync("https://google.com");
参见 dotnetfiddle 示例:https://dotnetfiddle.net/q1ggDS
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。