我正在用C#开发一个程序。 它连接到互联网以查看此副本是否有效。
目前我只是发送许可证密钥并在密钥有效时获得响应(0或1)。
问题是有些用户只是用一些数据包捕获工具伪造数据并重放它。 所以应用程序很容易破解。我该如何防止这种情况?
这是我基本上想要防止的:
找不到发送的数据应该是不可能的。 也许我应该添加当前时间然后加密数据包? 所以它总是不同的?
注意:请不要警告我,通过修改应用程序本身很容易破解它。我知道。这个问题只涉及网络部分。
答案 0 :(得分:3)
如果您使用SSL或HTTPS,则无需担心用户破解数据包。这很容易,因为库已经存在并且易于实现。以C#和IIs为例,只需安装证书并更改一些配置项即可。 (可能需要重新编译一些代码更改)。
答案 1 :(得分:0)
假设您确实想要防止滥用许可证,那么有更好的方法可以做到这一点。 “手机之家”的方法很容易让自己滚动,但正如你已经注意到它充满了漏洞。
免责声明:我为一家制作commercial tools to solve these license management and copy-protection issues.的公司工作。还有其他类似产品可供各种供应商使用。
这与考虑如何为您的应用程序进行设置没有什么不同。选择是自己动手或购买现有的第三方工具集。乍一看滚动自己看起来更便宜,但这可能只是因为你还没有真正发现创造强大和可靠的东西的所有真正要求。第三方工具供应商需要为他们的产品收费,但他们花了数年时间发现特定问题集的所有问题并解决了问题。这样就可以省去你的工作,让你可以专注于你的应用程序可以增加价值的地方。
不同之处在于如果设置错误,您的用户会感到烦恼;如果您的副本保护错误,您的产品将被盗版。
无论如何,将许可证验证检查减少到二进制“或/或”条件非常容易破解 - 通过网络进行检查使其更容易10倍(记录回放攻击)。现代方法对可执行文件进行加密,并且许可证包含在密钥中以对其进行解密(这是过于简单化,因为实际的方法包括更多的复杂性以使其几乎无法绕过)。只有拥有有效的许可证才能在程序加载时解密可执行文件并运行。
如果您想按照您描述的方式进行操作,请考虑以下事项: 让应用程序使用可预测的,不断变化的值(例如从随机数字表中查找并结合某些外部值(如时间))来创建某种哈希值。让服务器实现相同的代码。服务器将哈希值发送到应用程序,并将其与自己的哈希值进行比较。如果匹配,则允许该应用运行。如果他们不这样做,就会出错。由于哈希在启动尝试时是不同的,因此通过网络记录它将不允许用户在下次尝试启动时使其运行。