如果真的怕泄露,别用python
我以前做过这类事情,而且当时更严格,需要打包部署到客户的服务只在有效期内有效,超过有效期必须更新证书才行。
Python代码用任何方法都没法保证保密性,这个时候你可以考虑用一个工具「nuitka」,这个工具会把你的python源代码映射为c++然后编译为二进制,因此对方是无论如何得不到你的源代码的。
代价就是nuitka这个工具并不完美,有一些限制并不能100%完美的转换所有python代码。
1用Cython编译python成 Windows的pyd文件或Linux的so文件,二进制文件相对安全性较高。
2用源码混淆器把代码搞的又臭又长。。。混淆完了再用Cython编译为二进制。。。这样静态反编译逆向难度也不小。
3同其他语言程序一样,可以对调试状态进行检测,当处于调试状态时退出程序或进入混乱代码耗费逆向工程人员心神。
4分享一个跨平台反调试手段,检测函数运行时间,加断点会导致函数运行时间变长,也可感知正在被调试。
Python是提倡开源的,既然选择Python还是拥抱开源才好~ 都开源还担心逆向工程嘛
没有不能逆的软件。
只要汇编语言过关,逆向工程都是可以实现的,不要有其它想法。
你唯一可以做的,就是不让别人用python读取源代码而已。那样实现起来比较简单。
python 适合开发服务器程序,或者自己科研使用的程序,如果是 作为用户程序,安装到 pc 或手机上,还是 其它 c++ 或java 比较合适
1)可以把需要保护的部分用c语言实现,从而编译成so等文件,这样逆向的成本会比较高,可以防止直接打开python文件看到代码逻辑。
2)so文件通过ida等工具也是可以反汇编的,可以通过对c语言进行代码混淆,花指令等 *** 作,提高通过ida等反汇编工具的分析难度。
3)不存在绝对无法逆向的技术手段,因此只能是看具体需求,选择具体的防逆向的技术手段。
有工具类似py2exe转成可执行程序,隐藏全部源代码,虽然bytecode还是可以反编译,但是难度大多了
1 最稳的就是你改cpython加载代码的过程,改zip包读取最稳。
2 借助一些加密工具在编译pyc之前进行一定的混淆,可以防君子,自我安慰一下。
商用一般都是用第一种办法,小打小闹用第二种。
可以考虑使用pymod工具,使用pymod pack 将模块加密打包,发布的时候一个模块就一个文件。
先睹为快,看看一个项目发布的时候,只有几个文件,
mainpy 项目程序入口
settingpy 项目配置
apps 项目模块
plusins 项目插件目录
创建项目 pymod create demo1
cd demo1
创建模块 pymod add mod1
启动pycharm 开始编写功能模块
一个模块默认由三个文件组成
__init__py 、 handlerspy 、param_schemaspy
业务逻辑主要在handlerspy中编写
__init__py
from pymodblueprint import Blueprint api = Blueprint("/mod1") from handlers import
param_schemaspy
schema_sfz = { "type": "object", "required": ["sfz", "nl"], "properties": { "sfz": { "type": "string", "minLength": 18, "maxLength": 18, "description": "身份z明号码" }, "nl": { "type": "integer", "minimum": 0, "maximum": 150, "description": "年龄" } } }
handlerspy
from import api from pymodext import RequestHandler, params_validate,TrueResponse,FalseResponse from param_schemas import schema_sfz from pymodplugins import sfz_check @apiadd_route('/hello') class Hello(RequestHandler): def get(self): selfwrite('Hello World') @params_validate(schema_sfz) def post(self): sfz = selfget_json_arg("sfz") nl =selfget_json_arg("nl") # selfwrite(TrueResponse(sfz=sfz, nl=nl)) if sfz_checkcheck_sfzmhm(sfz): selfwrite(TrueResponse(hint="身份z明号码验证通过")) else: selfwrite(FalseResponse(hint="身份z明号码验证失败"))
三、项目部署
程序调试 修改settingpy
# 开发模式下 运行的模块名称必须填写
modules = ["mod1"] modules_config ={ "mod1": { "deny_ip": "", "allow_ip": "" } }
启动程序 python mainpy
调试没有问题,进入发布模式
在项目目录下
pymod pack mod1
在target目录下生成mod1mod文件,将其复制到apps目录中
修改settingpy
# 开发模式下 运行的模块名称必须填写
modules = []
再次运行 python mainpy 测试
一切OK,系统就可以发布了。
说不能保密的,是没有研究过python的机制的。我做个一个项目,所有源代码自定义加密,运行时解密。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)