使用python语言如何保密源代码以防止逆向工程?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用python语言如何保密源代码以防止逆向工程?相关的知识,希望对你有一定的参考价值。
参考技术A 大家都很忙,谁有时间看你的的烂代码!如果真的怕泄露,别用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 将模块加密打包,发布的时候一个模块就一个文件。
先睹为快,看看一个项目发布的时候,只有几个文件,
main.py 项目程序入口
setting.py 项目配置
apps 项目模块
plusins 项目插件目录
创建项目 pymod create demo1
cd demo1
创建模块 pymod add mod1
启动pycharm 开始编写功能模块
一个模块默认由三个文件组成
__init__.py 、 handlers.py 、param_schemas.py
业务逻辑主要在handlers.py中编写
__init__.py
from pymod.blueprint import Blueprint api = Blueprint("/mod1") from .handlers import *
param_schemas.py
schema_sfz = "type": "object", "required": ["sfz", "nl"], "properties": "sfz": "type": "string", "minLength": 18, "maxLength": 18, "description": "身份证明号码" , "nl": "type": "integer", "minimum": 0, "maximum": 150, "description": "年龄"
handlers.py
from . import api from pymod.ext import RequestHandler, params_validate,TrueResponse,FalseResponse from .param_schemas import schema_sfz from pymod.plugins import sfz_check @api.add_route('/hello') class Hello(RequestHandler): def get(self): self.write('Hello World') @params_validate(schema_sfz) def post(self): sfz = self.get_json_arg("sfz") nl =self.get_json_arg("nl") # self.write(TrueResponse(sfz=sfz, nl=nl)) if sfz_check.check_sfzmhm(sfz): self.write(TrueResponse(hint="身份证明号码验证通过")) else: self.write(FalseResponse(hint="身份证明号码验证失败"))
三、项目部署
程序调试 修改setting.py
# 开发模式下 运行的模块名称必须填写
modules = ["mod1"] modules_config = "mod1": "deny_ip": "", "allow_ip": "*"
启动程序 python main.py
调试没有问题,进入发布模式
在项目目录下
pymod pack mod1
在target目录下生成mod1.mod文件,将其复制到apps目录中
修改setting.py
# 开发模式下 运行的模块名称必须填写
modules = []
再次运行 python main.py 测试
一切OK,系统就可以发布了。
说不能保密的,是没有研究过python的机制的。我做个一个项目,所有源代码自定义加密,运行时解密。
如何防止反编译或检查 python 代码?
【中文标题】如何防止反编译或检查 python 代码?【英文标题】:How to prevent decompilation or inspecting python code? 【发布时间】:2011-09-17 10:38:22 【问题描述】:让我们假设有一个大型商业项目(a.k.a Project),它在后台使用 Python 来管理插件,以配置可以由 Project 附加和使用的新控制界面。
有一个小的信息泄露,项目的 Python API 的某些部分泄露给了公共信息,人们能够编写 Python 脚本,这些脚本被底层 Python 实现调用作为项目插件加载机制的一部分。
进一步,使用inspect
模块和原始__dict__
读数,人们能够找出 Project 底层 Python 实现的主要部分。
有没有办法让 Python 密码保密?
快速浏览 Python 的文档发现了一种以这种方式抑制 inspect
模块导入的方法:
import sys
sys.modules['inspect'] = None
是否彻底解决了问题?
【问题讨论】:
对于您的最后一个答案,我仍然可以:del sys.modules['inspect']
:)
相关:***.com/questions/261638/how-do-i-protect-python-code
不可能。 但是——看看this answer,它建议使用 Cython。当然,任何东西都可以逆向工程,但是由于 Cython 生成的 c 代码编译成机器代码,因此逆向工程可能与用 c 编写的任何东西一样难。
而不是“保持[ing] Python 密码的秘密”,您应该这样做,以便 Python 代码一开始就不需要是秘密的。正如 Sven 链接的问题的答案中所建议的那样,将敏感代码放在扩展模块中并在 Python 脚本中使用它比试图隐藏用不是为隐藏而设计的语言编写的代码要好。
@mouad - 啊啊啊! :D 聪明! :D
【参考方案1】:
不,这不能解决问题。有人可以将检查模块重命名为其他内容并将其导入。
您尝试做的事情是不可能的。 python 解释器必须能够获取您的字节码并执行它。总有人能够反编译字节码。他们将始终能够生成 AST 并查看带有变量和类名的代码流。
请注意,此过程也可以使用已编译的语言代码完成;不同之处在于您将获得组装。一些工具可以从程序集中推断 C 结构,但我没有足够的经验来评论细节。
您想隐藏哪些具体信息?您能否保留算法服务器端,并将您的软件变成接触您的 Web 服务的客户端?将代码保存在您控制的机器上是真正控制代码的唯一方法。你不能给某人一个上锁的盒子,盒子的钥匙,并阻止他们在必须打开盒子才能运行它时打开它。这与 DRM 不起作用的原因相同。
话虽如此,逆向工程仍然可能困难,但当客户端拥有可执行文件时,这绝不是不可能的。
【讨论】:
他们会得到变量名。由于所有这些都可以在运行时进行自省,因此它们都存在于字节码中。【参考方案2】:没有办法让您的应用程序代码绝对保密。
坦率地说,如果一群敬业而坚定的黑客(在良好的意义上,而不是贬义的意义上)能够破解 PlayStation 的代码签名安全模型,那么您的应用就没有机会了。一旦您将应用交到公司以外的人手中,就可以对其进行逆向工程。
现在,如果你想努力让它变得更难,你可以编译你自己的嵌入式 python 可执行文件,去掉不必要的模块,混淆编译后的 python 字节码并将其包装在一些拒绝启动你的应用程序的恶意软件 rootkit 中如果调试器正在运行。
但您应该真正考虑一下您的商业模式。如果您认为对您的产品充满热情的人是一种威胁,如果您认为那些愿意花时间和精力来定制您的产品以个性化他们的体验的人是一种危险,那么您可能需要重新考虑您的安全方法.假设您不从事 DRM 业务,或者有类似的模式需要从不情愿的消费者那里榨取资金,请考虑开发一种与用户共享信息并允许他们协作改进您的产品的方法。
【讨论】:
我提出的问题源于纯粹的好奇。项目不是我的创作,我是提到的用户之一。事实上,我非常感谢完整记录的公共 API 来扩展 Project 的功能。据我所知 - Project 的开发人员和另一家公司之间有一项商业协议,以适应和集成可视化的模块化脚本语言,作为扩展包的一种形式,显然 - 确实要花一分钱。为了尊重开发者的利益,我特意不提项目名称。【参考方案3】:有没有办法让 Python 密码保密?
没有。
Python 特别容易逆向工程,但其他语言,即使是编译的语言,也很容易逆向。
【讨论】:
【参考方案4】:您无法完全防止软件的逆向工程 - 如果归根结底,人们总是可以分析您的程序所包含的汇编指令。
但是,您可以使该过程显着复杂化,例如通过弄乱 Python 内部结构。但是,在跳到如何 去做之前,我建议你评估一下是否 去做。通常,“窃取”您的代码(毕竟,需要完全理解它们才能扩展它们)比自己编写代码更难。然而,一个纯粹的、未混淆的 Python 插件界面对于围绕您的程序创建一个完整的生态系统至关重要,远远超过让某人窥视您可能设计不完美的编码内部结构可能带来的不利影响。
【讨论】:
以上是关于使用python语言如何保密源代码以防止逆向工程?的主要内容,如果未能解决你的问题,请参考以下文章
原神代码疑似遭恶意泄露!对中国游戏企业数据保密都有哪些启发?