0

我正在用 C# 开发一个程序。它连接到 Internet 以查看此副本是否有效。

目前,如果密钥有效,我只是发送许可证密钥并获得响应(0 或 1)。

问题是一些用户只是用一些数据包捕获工具伪造数据并重放它。所以应用程序很容易被破解。我怎样才能防止这种情况?

这是我本质上想要防止的:

  • 网络重放攻击
  • 身份验证“模拟器”

应该不可能找出发送了哪些数据。也许我应该添加当前时间然后加密数据包?所以总是不一样?

注意:请不要警告我,通过修改应用程序本身很容易破解。我知道。这个问题只是关于网络部分。

4

2 回答 2

3

如果您使用 SSL 或 HTTPS,那么您不必担心用户破解数据包。这很容易,因为这些库已经存在并且易于实现。以 C# 和 II 为例,只需安装证书和更改一些配置项即可。(可能需要重新编译一些细微的代码更改)。

于 2012-07-11T03:00:51.603 回答
0

假设您确实想防止许可证滥用,有更好的方法可以做到这一点。“电话回家”方法很容易自己动手,但正如您所注意到的那样,它充满了漏洞。

免责声明:我在一家生产商业工具来解决这些许可证管理和版权保护问题的公司工作。还有其他类似的产品可从各种供应商处获得。

这与考虑如何为您的应用程序进行设置没有什么不同。选择是自己推出或购买现有的第 3 方工具集。乍一看,自己动手做看起来更便宜,但这可能只是因为你还没有真正发现创建健壮可靠的东西的所有真正要求。第三方工具供应商需要为其产品收费,但他们花了数年时间发现特定问题集的所有问题并解决了问题。这样您就可以省去工作,让您可以自由地专注于您的应用程序可以增加价值的地方。

不同之处在于,如果您设置错误,您的用户会被激怒;如果您获得错误的版权保护,您的产品将被盗版。

无论如何,将许可证验证检查减少到二进制“非此即彼”条件是非常容易破解的——通过网络进行检查使其容易 10 倍(记录播放攻击)。现代方法对可执行文件进行加密,并且许可证包含在解密它的密钥中(这是一种过度简化,因为实际的方法包括更多的复杂性,使其几乎不可能绕过)。只有拥有有效的许可证才能在程序加载和运行时解密可执行文件。

如果您想按照您描述的方式进行操作,请考虑以下事项:让应用程序使用可预测的、不断变化的值(例如从随机数表中查找加上一些外部值(如时间))来创建某种散列. 让服务器实现相同的代码。服务器将哈希发送到应用程序,应用程序将其与自己的哈希进行比较。如果它们匹配,则允许该应用程序运行。如果他们不这样做,它就会出错。由于哈希在每次启动尝试时都不同,因此通过网络记录它不会允许用户在下次尝试启动时让它运行。

于 2012-07-11T15:53:57.307 回答