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

C# 使用WebRequest检查许可证是否有效,c#,.net,security,webrequest,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

这就是在服务器检查期间将应用程序加载到hiccup所需的全部时间,它允许我单击“继续”并完全绕过所有“安全性”,继续使用该程序而不会过期

现在,一个普通人会走到这一步(十六进制编辑)来试图通过我的保护计划吗?不太可能,但是,作为一种学习经验,我可以做些什么作为额外的步骤,以使十六进制编辑或任何其他常见的解决办法不起作用,除非是由“专业”破解者

再说一次,我不是偏执狂,我只是渴望更多地了解应用程序的安全性。我为自己感到骄傲,同时也为自己创造和破坏了自己的保护而感到羞愧

如果评论,请客气,因为我知道这可能是一个肱骨的职位,以那些比我更知情,因为我真的没有什么经验,在编写软件,从来没有采取任何类型的课程等。感谢阅读

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

我想,这取决于这个应用程序对那个“正常人”有多有用,以及他如何决定让它工作

大多数.net应用程序除非经过模糊处理,否则可以使用()之类的工具轻松地反编译为源代码,或者他们可以简单地使用
ildasm
查看IL代码,我听说甚至有反编译模糊的.net库的工具,尽管我没有使用或找到任何工具

根据我的经验,我可以提出两种方法

  • 在用户机器上运行的应用程序中强制许可并破解它是一个非常重要的问题,您可以通过将应用程序功能的某些部分移动到服务器并将其公开为客户端可以使用的web服务,从而为代码添加一些额外的保护。移动到服务器的部分必须是应用程序的重要部分应用程序很难工作,应该是很难模拟的
  • 另一种方法是向应用程序添加自动更新程序功能,该功能将检查服务器的最新更新,当发现新版本时,它将覆盖旧版本,从而覆盖任何已破解的版本,这可以轻松禁用,但如果禁用,这也将停止您可能发布的任何错误修复
  • 我尝试了这两种方法,但它们只在某种程度上有用,你必须决定是否值得努力

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

    我想,这取决于这个应用程序对那个“正常人”有多有用,以及他如何决定让它工作

    大多数.net应用程序除非经过模糊处理,否则可以使用()之类的工具轻松地反编译为源代码,或者他们可以简单地使用
    ildasm
    查看IL代码,我听说甚至有反编译模糊的.net库的工具,尽管我没有使用或找到任何工具

    根据我的经验,我可以提出两种方法

  • 在用户机器上运行的应用程序中强制许可并破解它是一个非常重要的问题,您可以通过将应用程序功能的某些部分移动到服务器并将其公开为客户端可以使用的web服务,从而为代码添加一些额外的保护。移动到服务器的部分必须是应用程序的重要部分应用程序很难工作,应该是很难模拟的
  • 另一种方法是向应用程序添加自动更新程序功能,该功能将检查服务器的最新更新,当发现新版本时,它将覆盖旧版本,从而覆盖任何已破解的版本,这可以轻松禁用,但如果禁用,这也将停止您可能发布的任何错误修复

  • 我尝试了这两种方法,但它们只在某种程度上有用,您必须决定是否值得强制执行

    另一种绕过许可证检查的方法是将检查url重定向到localhost,始终返回所需的文本…
    更好的方法是调用执行相同操作的函数,但将服务器响应设置为带签名的XML,包括服务器响应时间戳,您可以使用系统日期时间(两边都使用UTC日期)检查添加情况。每当发生异常时,抛出异常也是一个好主意