打包你的Python程序并绑定CPU

举报
云享专家 发表于 2019/10/18 10:22:08 2019/10/18
【摘要】 客户想要运行你的程序,还有以下步骤: 第一步,让你客户在他的机器上运行程序获得CPU序列号并发给你,你用你的授权码生成算法生成一个授权码发个客户; 第二步,客户把授权码配置到程序中(比如,写入一个指定文件)就可以成功运行了。

你的Python程序写好了,该如何发布呢?最简单的当然是发布源代码,这也是开源世界推崇的方式。可是,有时候,给最终用户代码是不切实际的,让人挠头的。比如,


你用python给你的女朋友写了个小软件,还带GUI界面,女朋友很喜欢它,也更喜欢了你。然后,你把源代码给她,给她安装好Python,然后教她如何进到源代码的目录,如何运行这个Python代码。。。如果是这样,女朋友会疯的,对你的好感度也会直线下降。你需要做的是,给她一个可执行文件,双击即可使用。


再比如,


你用Python实现了客户的需求,要把程序部署到客户那里。但是,你想保护你这部分代码里面的算法。或者不想客户把代码改来改去增加你的客服量。


这些时候,你需要打包你的Python程序。Python打包程序有很多,比如Windows上的py2exe,跨平台的pyinstaller等等。在这里,强烈推荐一下pyinstaller打包。非常简洁也非常强大,Windows、Linux、Mac通吃。


$ pyinstallter -F --key password main.py


一行命令就把main.py 打包成一个独立(-F 选项)的可执行文件,顺便还加了个密(--key 选项)。


如果你只是想打包Python程序,看到这里就可以了,赶紧去学习Pyinstaller打包技能吧。


但是,你给客户的程序合同上写的是单台机器授权,多台机器再加钱。有人的地方就有利益,有利益的地方就要考验人性,自己要做到守信但也要防一下客户。程序给了客户,你完全不能控制他不在别的机器上跑你的程序。这时候,你就想要把程序跟硬件绑定。


可以绑定的硬件信息有很多,比如mac地址、硬盘、主板等等。mac地址容易修改,硬盘和主板信息似乎不太好获取。那我们就来绑定CPU吧。


x86架构的CPU可以通过CPUID操作码来获取处理器的类型和特性支持(例如MMX/SSE),通过这些信息,我们就可以唯一确定CPU。这里我们不研究具体的如何通过EAX获得信息都是什么意思,详情见这里:

https://en.wikipedia.org/wiki/CPUID


通过研究上面这篇CPUID的词条,获取了不同的CPU信息组成一个序列号来唯一确定CPU,具体代码如下:


image.png


可以看到,这个函数对不同级别的EAX寄存器的值做了取舍(a,b,c,d四个值的一部分),这是因为,对于同一个有些值会变(比如,level == 1 时的b)。有兴趣的同学可以把注释去掉,隔几秒运行一下,看看寄存器值的变化情况。最终选取7个值的十六进制生成一个字符串作为CPU的序列号。这个序列号,即使对同一个CPU下的Virtualbox虚拟机的CPU序列号和其宿主的CPU序列号也是不同的。


到了这里,还不算完。咱们说的是Python,可上面是C啊。别急,先编译一下这个C代码生成一个库文件:


gcc -fPIC -shared cpusn.c -o cpusn.so


通过Python的ctypes就可以使用这个cpusn.so库来获取CPU序列号了:


image.png


运行这段python代码,就可以获得类型下面的字符串:


0000000D_000306A9-7FBAE3FF-BFEBFBFF_76035A01-00F0B2FF-00CA0000


有了这个CPU序列号,我们就可以把Python程序和CPU绑定了。在你需要绑定的程序的入口处加入你的验证流程:


(1)获取用户配置的授权码(比如,读取某个文件);

(2)通过cpusn.so获取当前机器的CPU序列号

(3)通过你的授权码生成算法计算当前CPU序列号对应的授权码;

(4)对比用户配置的授权码(你发给他的)和第三步计算得到的授权码,二者不一样就说明当前机器没有获得授权,随便打印些警示信息,然后就可以退出程序了。


加入以上验证流程后,你就可以用Pyinstaller打包你的程序,和获取CPU序列号的程序一起发给客户了。


客户想要运行你的程序,还有以下步骤:


第一步,让你客户在他的机器上运行程序获得CPU序列号并发给你,你用你的授权码生成算法生成一个授权码发个客户;


第二步,客户把授权码配置到程序中(比如,写入一个指定文件)就可以成功运行了。


最后,说说授权码生成的算法,就是把一个字符串(CPU序列号)转换成另外一个字符串(授权码):


授权码 = 算法(CPU序列号)


这个算法必须不可逆,也就是,无法通过授权码反向计算出CPU序列号。这是一个简单但可以充分发挥你想象力的算法,比如,数据库保存密码时的原则是“加盐做哈希”,这个方法就可以用在这里。


授权,除了绑定机器,可能还要绑定时间(比如,到年底过期)。那么,如果把时间绑定也加入到授权码算法中呢?你可以再发挥自己的想象力。


以上绑定的方法,主要是考虑客户那边不能访问互联网的情况。如果客户那边可以访问互联网,你的授权又该怎么做呢?环境不同,解决问题的方法就不同,无聊什么样的问题,都难不倒一个身为爱思考、善动手的程序员的你。



作者:王平

十年专注于python web 开发,网络爬虫。深入理解Python语言,对Python特性深度了解.


【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。