社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

如何对 Python 代码进行混淆

进击的Coder • 1 年前 • 356 次点击  
这是「进击的Coder」的第 861 篇技术分享
作者:kingname
来源:未闻 Code

阅读本文大概需要 5 分钟。


目前市面上没有任何方法能够完全避免你的程序被人反编译。即便是 3A 游戏大作,发布出来没多久也会被人破解。现在只能做到增大反编译的难度,让程序相对无法那么快被破解。

我们知道,Python 代码默认是公开的。当你要把一个 Python 项目给别人运行的时候,一般来说别人就能看到你的全部源代码。我们可以使用 Cython、Nuitka 对代码进行打包,编译成 .so 文件、.dll 文件或者是可执行文件,从而在一定程度上避免别人看到你的源代码。我在字节的时候,内部的一个系统就是使用 Cython 打包的,然后部署到客户的服务器上。

Cython、Nuitka 在打包大型项目时,需要写大量的配置文件甚至是额外的程序,有一定的使用成本。如果你对安全的要求并没有那么高,那么其实你只需要对 Python 代码进行混淆,就能防止自己的代码被人轻易看到了。

我们可以使用Pyminifier来对Python代码进行混淆。它的使用方法非常简单,pip安装以后,执行几行命令就可以完成。我们来看几个例子。

假设我有一段 Python 爬虫代码。原始代码是这样的:

import glob
import uvicorn
import random
from pathlib import Path
from fastapi import FastAPI
from fastapi.responses import FileResponse

IMAGE_TYPE = ['*.J*''*.P*''*.j*''*.p*''*.GIF''*.gif']
app = FastAPI()


def iter_images(folder='*'):
    images = []
    target_folder = Path('images') / Path(folder)
    if folder != '*':
        if not Path(target_folder).exists():
            return []
    for image_type in IMAGE_TYPE:
        images.extend(glob.glob(str(target_folder / Path(image_type))))
    return images


@app.get('/')
def index():
    images = iter_images()
    if not images:
        return {'success'False'msg''No Images.'}
    path = random.choice(images)
    return FileResponse(path)


@app.get('/every/{name}')
def get_one_goddess(name):
    images = iter_images(name)
    if not images:
        return {'success'False'msg''No Images.'}
    path = random.choice(images)
    return FileResponse(path)



if __name__ == '__main__':
    uvicorn.run(app='main:app')

这段代码能够实现一个简单的图片服务器,当我们访问http://127.0.0.1:8000时,就会随机显示一张图片,如下图所示:

我们现在来安装pyminifier 。由于这个程序的代码很久没有更新了,因此如果你的 Python 版本比较高,那么需要首先降一下setuptools的版本,然后再安装pyminifier

pip install "setuptools<58.0.0"
pip install pyminifier

安装完成以后,我们来对代码进行混淆,执行如下命令:

pyminifier --nonlatin --replacement-length=50 main.py > output.py

生成的output.py就是混淆以后的代码,效果如下图所示:

这样的代码,显然已经完全没法看了。除非对方就是冲着对你的代码进行破解来的,否则一般人看了这个混淆以后的代码,直接就走了。

混淆完成以后,这个代码依然是直接运行python output.py。功能不受任何影响。

这样的混淆,属于『君子锁』,只放君子不防小人。真的要反混淆其实并不困难。只是增加了几步操作而已。在对保密要求不那么高的情况下可以使用,毕竟非常简单,不需要对已有代码做任何修改。


欢迎大家加入【ChatGPT&AI 变现圈】,零门槛掌握 AI 神器!我们带你从小白到高手,解锁智能问答、自动化创作、技术变现的无限可能。与我们共同成长,开启 AI 新征程!立即行动,未来已来!(详情请戳:知识星球:ChatGPT&AI 变现圈,正式上线!

扫码加入:




点个在看你最好看


Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/160645
 
356 次点击