2013-03-01 114 views
0

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

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

这两个问题都是我需要创建一个.py文件“随时”,然后使用类似pytoexe的东西,使其成为一个.exe,使用户不需要有Python已安装。

第二个问题是,我的理解ip的变化和获取计算机名是安全风险,可能会吓跑用户。

所以总结一下,这里是我的两个问题: 1.)在python中有没有一种好的方法只允许程序在单台计算机上运行? 2.)实施exe的“即时”创建的最佳方式是什么? (我要举办我的电脑上的网站和学习PHP(?)/服务器。

我有中度的C/C++和基本的HTML/CSS,Java和Python的经验。

感谢您时间!

+3

如果您使用Py2exe,PyInstaller或cx_freeze,我可以将您的可执行文件上传并读取您的源代码。如果可能,请将您的软件作为Web服务。如果这不可行,请处理盗版问题。 – Blender 2013-03-01 07:37:15

+0

这是一个非常模糊的问题。你的用户是谁?有多少人?你为什么认为人们会复制和“窃取”你的程序?如果您提供的是服务,而且您不希望人们看到您的代码,那么为什么不将其作为Web应用程序运行?一般来说,所有复制保护代码的方案最终都会让客户烦恼,因此最好避免这种情况。 – 2013-03-01 15:20:55

+0

我并不担心保护源代码。我担心没有计算机知识的人可以免费获得我的程序。通过设置他们的系统时钟或通过复制到闪存驱动器/发送电子邮件给他们的朋友。 – user2122589 2013-03-01 18:24:12

回答

1

给每个用户定制安装有它独特的密钥。当它运行时,其接触服务器(用钥匙),并请实际的程序。服务器端,你检查重点是有效的,如果是这样的话,服务用密钥定制的程序,并将密钥标记为已使用。安装程序将程序保存在用户可以访问的地方,并创建一个隐藏文件,其中包含密钥的深处计算机的“肠子”,“普通用户”不会想到看到的。当程序运行时,它所做的第一件事就是检查隐藏文件是否存在以及它是否包含正确的密钥,如果没有,则拒绝运行。

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

+0

非常好的主意,谢谢! – user2122589 2013-03-01 18:36:19

+0

仅适用于Internet访问,您的服务器*必须启动并响应,并且py2exe仅限Windows使用。 – Alfe 2013-03-05 09:08:00

4

凌乱的业务。您可能已经了解编译为并不意味着已加密

但是,如果你是老板认为c编译为满意的,你可以使用cython来编译你的python代码到c代码然后gcc编译c代码。

请点击此处查看如何构建setup.py脚本。

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

,并且可以使用到生成的C代码使用--embed选项把Python:

# will generate the target.c 
$ cython target.py --embed 
0

为了避免在互联网上接触任何东西,你可以用下面的方式来“加密狗'你的程序:

  • 把你的程序的重要部分(没有它的东西,其余的将不会有用),
  • 把它转换成字符串,
  • 加密字符串对称应上运行的计算机的MAC address
  • 然后在你的程序做到这一点:
    • 解密字符串的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 = '[email protected]\x16\x15P\\]^\\\x14BYET]\x13' 
    # I found that code by entering: 
    # strxor('print "hello world"', str(getMyMac())) 
    realCode = strxor(code, str(getMyMac())) 
    exec realCode 
  • 我这里使用上串的简单的XOR为crypting(其不是硬暗号开裂)。
  • 。当然,“允许”计算机的用户可以交出其MAC地址到下一个用户,然后
    • 要么可以修补getMyMac()
    • 欺骗他自己的MAC地址;大多数网卡都允许这样做。

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

但是,如果一个只有很少电脑知识的人在没有任何进一步信息的情况下将你的代码给予其他人(可能通过将其放置在论坛或类似的在线上),接收器将无法执行它框。

最后,我要指出的是,代码到一个特定的计算机的每个链接很可能成为代码的合法用户的麻烦。如果我使用一个程序,它停止工作,只是因为我切换到不同的硬件(也许只是因为我得到一个新的笔记本电脑),我通常生气骂代码的作者。你可能不想惹恼你的顾客。

+0

这太棒了!谢谢!至于担心客户,我认为客户改变硬件的可能性非常低。所以手动重新编译这些实例是可以接受的。 – user2122589 2013-03-01 18:34:39

0

好像事情在这里的组合。像其他人所建议的那样封装python是捆绑的好方法。您也可以考虑混淆,因为这里大约谈了另一个StackOverflow的线程:

Python Code Obfuscation

其中引用:

http://freecode.com/projects/pyobfuscate

至于使得它,从而使他人不能随便下载程序并在其他地方运行或分发它,您是否愿意为最终用户带来不便? :)

正如其他人已经注意到上述,您可以生成一个编码和捆绑的代码与特定于用户的ID。这样,如果/当应用程序回家时,您可以跟踪使用情况。

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

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

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

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

如果他们决定在VM软件包中共享该程序,他们仍然需要一个活动帐户才能获得密钥。

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

只要记住,没有一个系统是万无一失的。