0

我想做的是保护一个 Python 程序不被没有计算机知识的人窃取。我接受程序被盗版的必然性,我要做的就是保护它免受普通用户的侵害。

我提出了两个想法。1.)通过在线检查日期和时间来设置时间限制。IE 下载后 10 天。2.)检查下载它的计算机的IP或名称,并使程序仅在该计算机上运行。(以防止朋友简单地共享文件)。

这两者的问题是我需要“即时”创建一个 .py 文件,然后使用 pytoexe 之类的东西将它变成一个 .exe,这样用户就不需要安装 Python。

第二个问题是,据我了解,更改 ip 并获取计算机名称是一种安全风险,可能会吓跑用户。

综上所述,这是我的两个问题:1.)python中有没有一种好方法只允许程序在那台计算机上运行?2.) 实现“动态”创建 exe 的最佳方法是什么?(我打算在我的计算机上托管网站并学习 php(?)/servers。

我有中等的 c/c++ 和基本的 html/css、java 和 python 经验。

感谢您的时间!

4

4 回答 4

5

乱七八糟的生意。您可能已经明白,已编译并不意味着已加密

但是,如果您的老板认为 c-compiled 令人满意,您可以使用cython将您的 python 代码编译为 c-code,然后使用 gcc 编译 c-code。

在此处查看如何构建 setup.py 脚本。

http://docs.cython.org/src/reference/compilation.html#compiling-with-distutils

您可以使用以下选项将 python using 嵌入到生成的 c 代码中--embed

# will generate the target.c 
$ cython target.py --embed
于 2013-03-01T08:15:12.340 回答
1

为每个用户提供一个定制的安装程序,其中包含一个唯一的密钥。当它运行时,它联系服务器(使用密钥)并请求实际程序。在服务器端,您检查密钥是否有效,如果有效,则为使用密钥定制的程序提供服务,并将密钥标记为已使用。安装程序将程序保存在用户可以访问的地方,并创建一个隐藏文件,其中包含计算机内部深处某处的密钥,“普通用户”不会想到查看。程序运行时,首先检查隐藏文件是否存在以及是否包含正确的密钥,如果不存在则拒绝运行。

(我假设解压缩可执行文件和阅读源代码超出了“普通用户”(阅读:“奶奶”)的能力,所以使用 py2exe 是可以的。)

于 2013-03-01T07:51:33.147 回答
0

为避免接触 Internet 上的任何内容,您可以使用以下方式“加密”您的程序:

  • 采取程序的重要部分(没有它其余部分将无用),
  • 把它放到一个字符串中,
  • 用运行它的计算机的MAC 地址对称地加密该字符串,
  • 然后在你的程序中这样做:
    • 使用它运行的当前机器的 MAC 地址解密该字符串,并且
    • 使用 调用该解密字符串exec

重要部分的示例是print "hello world"

def getMyMac():
  return 123456789L  # for testing now
  return uuid.getnode()  # this would be the real thing

def strxor(s, key):
  key *= len(s) / len(key) + 1
  return ''.join(chr(ord(key[i]) ^ ord(s[i])) for i in range(len(s)))

def performVitalCode():
  code = 'A@ZZA\x16\x15P\\]^\\\x14BYET]\x13'
  # I found that code by entering:
  # strxor('print "hello world"', str(getMyMac()))
  realCode = strxor(code, str(getMyMac()))
  exec realCode
  • 我在这里对字符串使用了一个简单的 xor 进行加密(这不是一个难以破解的密码)。
  • 当然,“允许”计算机的用户可以将他的 MAC 地址交给下一个用户,然后
    • 要么可以修补getMyMac()要么
    • 欺骗自己的MAC地址;大多数网卡都允许这样做。

因此,这不是解决您问题的“安全”解决方案。

但是,如果一个计算机知识很少的人在没有任何进一步信息的情况下将您的代码提供给其他人(可能通过将其放在论坛或类似网站上),接收者将无法开箱即用地执行它。

最后我需要指出的是,每一个链接到特定计算机的代码都可能成为代码的合法用户的麻烦。如果我使用的程序因为我切换到不同的硬件而停止工作(可能只是因为我买了一台新笔记本电脑),我通常会生气并诅咒该代码的作者。您可能不想惹恼您的客户。

于 2013-03-01T09:18:24.607 回答
0

似乎这里的东西组合在一起。像其他人建议的那样封装 python 是一个很好的方法,用于捆绑。你也可以考虑混淆,就像在另一个 StackOverflow 线程中讨论的那样:

Python 代码混淆

其中参考:

http://freecode.com/projects/pyobfuscate

至于让别人不能仅仅下载你的程序并在别处运行或分发它,你愿意给你的最终用户带来不便吗?:)

正如上面其他人所指出的,您可以生成具有特定于用户的 ID 的已编译和捆绑的代码位。这样,如果/当应用程序打电话回家时,您可以跟踪使用情况。

如果您的最终用户/客户满足以下要求:

  • 您的帐户,他们可以登录并检查他们的订阅/帐户状态
  • 运行程序的机器的 Internet 连接

您可以使安装过程执行以下操作:

  • 安装程序不是完整的程序。生成机器的配置文件。
  • 捆绑此配置文件并生成哈希。两者都上传到您的服务器。
  • 一旦他们登录到他们的在线网络帐户,哈希就会显示给最终用户输入。
  • 安装应用程序的用户提交哈希,并获得下载链接和解锁密钥。该密钥仅适用于动态生成的下载,并且仅适用于该机器。但是,下载的程序将接受一系列自身独有的密钥(迭代生成等)。
  • 然后用户可以完成安装并运行他们的程序。该程序将定期检查它所在机器的配置文件,以确保散列不会偏离。如果是这样,程序可以提示他们登录到他们的网络帐户以生成新密钥。然后使用新密钥刷新他们的应用程序。这可以由应用程序自动执行,但根据互联网法律等,让用户登录他们的帐户并可能同意对 EULA 的任何更新会更好。

如果他们决定在 VM 包中共享程序,他们仍然需要一个活动帐户来获取密钥。

请注意,这不会阻止某人绕过哈希检查。但是对于普通用户来说,这将成为阻止人们放弃或转售您的程序的好方法。

请记住,没有系统是万无一失的。

于 2013-03-09T00:53:16.843 回答