如何在可执行文件中记录序列号?

时间:2010-01-04 16:37:58

标签: c# security usb

我正在尝试保护应用程序仅从特定的USB磁盘运行。 我有代码从设备获取序列号,但我能按照我想要的方式工作的唯一方法是手动将序列号编码到二进制文件中。 有没有办法我可以创建一个存根应用程序来修改现有的二进制文件,以便在编译后将序列号插入其中? 我以前在C ++中看到过这种情况,但那是很久以前的事了,我不记得我们当时是怎么做到的。

4 个答案:

答案 0 :(得分:8)

将它存储在装配体中是一个坏主意。这就是我要做的事情(过去也做过类似的事情):

  1. 确保您正在签署程序集。
  2. 创建一个包含许可数据的XML文档 - 在您的情况下是USB设备的序列号。
  3. 利用.NET中的SignedXml库(实现XMLDSIG)来签署包含序列号的许可XML文档。您将使用用于对程序集进行签名的相同私钥。
  4. 当您的应用启动时,它会使用签名时使用的公钥验证XML文件的签名是否有效(并嵌入到程序集中)。
  5. 显然,您不会发送私钥,因此如果应用程序需要自己生成XML配置文件(而不是您发送给用户的文件),则需要实现Web服务。

答案 1 :(得分:0)

我不知道,但这并没有阻止我回答。

也许弄清楚你想在可执行文件中存储SN的位置(它应该只有一个地方,对吧?)并且只将可执行文件视为巨大的二进制blob,并使用存根程序将其插入到需要的地方去吗?

答案 2 :(得分:0)

也许你想获得一个像这些单独的USB许可证密钥:

http://www.bhphotovideo.com/c/buy/USB-License-Keys/ci/12454/N/4294550039

???

答案 3 :(得分:0)

为什么有人想在可执行文件中保存任何内容。如果您计划签署可执行文件以进行分发,则以某种方式更改可执行文件会破坏签名并将二进制文件中的某些内容保存到可执行文件中,这不会阻止某人将值从可执行文件中删除。

您可以做的最好的事情是将序列号存储到文件,注册表或其他位置,然后加密该值,以便在不破坏它的情况下对其进行修改。我使用的是一个名为SpearmanTech的新公司提供License Vault的库。您可以使用它们的库以加密形式将加密值存储到.NET machine.config文件中,以便它不会被篡改。这样,您可以在应用程序启动时从.config文件中提取信息。

您是否正在使用C ++或本机C ++编写.NET应用程序,无论哪种方式,您都应该能够与.NET框架进行通信,以便此解决方案能够正常运行。

我会在http://www.spearmantech.com查看他们的产品。希望它适合你。