使用WebRequest检查许可证是否有效

时间:2011-12-12 04:47:17

标签: c# .net security webrequest

我不是软件工程师,因为你会看到你是否继续阅读,但我设法写了一个非常有价值的应用程序,为我们公司节省了大量资金。我没有报酬写软件,我没有报酬写这个应用程序,也不是我的职称软件工程师所以我想完全控制谁使用这个应用程序,如果我不得不离开,因为据我所知它不合法(在公司时间也没写)。

这可能听起来很幼稚,但我花了很多时间,而且我几乎每天都在维护它,所以我觉得我应该控制它,或者至少可以把它卖给我的公司如果他们不得不让我离开,或者我想继续前进。

我对此应用程序的当前保护方案如下所示:

string version;
WebRequest request = WebRequest.Create("http://MyWebSiteURL/Licence text file that either says 'expired' or "not expired'");
WebResponse response = request.GetResponse();
StreamReader stream = new StreamReader(response.GetResponseStream());
version = stream.ReadToEnd();
stream.Close();
response.Close();

if (version == ("not expired") == false)
{
    MessageBox.Show(Environment.NewLine + "application expired etc etc", "Version Control");
}

它检查我的服务器是否“未过期”(用纯文本格式),如果webrequest以“未过期”的形式返回,它最终会弹出另一个表单,表明它已过期并允许您输入密码对于那个是当前日期乘以预定数字乘以当天创造“日间通行证”的那一天(我认为艾伦·图灵刚刚在他的坟墓里翻过来)。

不是最好的安全方案,但我认为没有软件安全经验非常聪明。然而,我听说过十六进制编辑以解决安全问题,所以我对科学进行了一些测试,并找到了我编译的EXE的这个区域:

  

“System.Net.WebRequest”。我用零填充的内容如下:System.Net000000000

这就是在服务器检查期间将应用程序加载到打嗝所需的全部内容,这使得我可以单击“继续”并完全绕过我的所有“安全性”并继续使用该程序而不会过期。

现在一个正常的人会去这个长度(十六进制编辑)试图超越我的保护计划吗?不太可能,但作为一种学习经验,我可以做什么作为一个额外的步骤,使十六进制编辑或任何其他常见的解决方法不起作用,除非它是由“专业”饼干?

同样,我不是偏执狂,我只是渴望了解有关应用程序安全性的更多信息。我为自己感到骄傲,同时也为自己的保护而羞愧。

如果评论,请善待,因为我知道这可能是一个比我更有信息的人的肱骨帖,因为我真的没有编写软件的经验,也从未参加过任何类型的课程等等。感谢阅读!

2 个答案:

答案 0 :(得分:1)

绕过许可证检查的另一种方法是将检查URL重定向到localhost,始终返回所需的文本...
更好的方法是调用函数执行相同的操作,但使服务器响应成为签名的XML,包括服务器响应时间戳,您可以使用系统日期时间检查(使用双方的UTC日期)。每当某些事情不符合您的预期时,抛出异常也是一个好主意,并通过异常处理来控制程序的流程。
检查以下内容以获得如何线索:
How to: Sign XML Documents with Digital Signatures
How to: Verify the Digital Signatures of XML Documents

答案 1 :(得分:0)

  

现在一个普通人会去这个长度(十六进制编辑)来尝试   通过我的保护计划?

嗯,我猜,这取决于应用程序对“正常人”的有用程度,以及如何确定他是如何使其正常工作。

大多数.net应用程序,除非模糊处理,可以使用像{Telerik JustDecompile这样的工具轻松地解编译为源代码,或者他们可以简单地使用ildasm来查看IL代码,我听说有甚至可以去编译模糊的.net库的工具,虽然我没有使用或找到任何。

凭借我的经验,我可以提出两种方法

  1. 在用户计算机上明确运行的应用程序中执行许可并破解它是cat and mouse game,您可以通过将部分应用程序功能移动到服务器并将其公开为代码来为代码添加一些额外的保护客户端可以使用的Web服务,移动到服务器的部分必须是应用程序工作的重要部分,并且应该是难以模拟的部分。
  2. 另一种方法是为您的应用程序添加一个自动更新程序功能,以检查服务器是否有最新更新,当它找到新版本时,它将覆盖旧版本,从而覆盖任何破解版本,这很容易已禁用,但如果已禁用,则还会停止您可能会发布的任何错误修复
  3. 我尝试了这两种方法,但它们只在某种程度上有用,你必须决定是否值得努力执行