混淆Python程序

混淆Python程序

在以下教程中,我们将了解如何混淆Python程序。我们将使用一个名为 pyarmor 的Python包来进行混淆。

有时我们可能会遇到一种情况,我们必须直接将代码交给客户端出于某种原因。然而,这样做会失去对代码的控制。在这种情况下,我们可能会加密脚本以保护它,保留控制权,并包含一些回退条件来控制依赖性,就像我们只向客户交付了一段时间使用的代码一样。

在以下教程中,我们将使用一个包含上述功能的函数来解决上述问题。我们将使用 pyarmor 的Python库来混淆任何Python代码。

那么,让我们开始吧。

创建一个基本函数

我们将首先创建一个新的Python程序文件,以便在Python代码上实施混淆。在文件中,我们将定义一个推断函数,并稍后对其进行加密。

让我们考虑以下推断函数的代码片段。

文件:func.py

# importing the required modules
import os
import json
import sys
from datetime import datetime

# defining an inference function
def infer(person_name = "", tag = True):
    '''
    if the present year is 2021, then inference function will execute properly, else it fails.
    Here the attribute variable contains the string version of the date in MM-DD-YYYY format
    '''

    print("Hello " + person_name + ", the inference function has been initiated successfully")

    atr = str(datetime.now().strftime('%m-%d-%Y'))
    resp = "Your license has been expired, please contact us."
    expiration_year = int(2023)

    try:
        assert int(atr.split('-')[-1]) == expiration_year, resp
    except AssertionError as e:
        print(resp)
        sys.exit()

    # if the above assertion is True, it will reach until this point,
    # otherwise it will stop in the previous line.

    if tag:
        print("Inference function has been done properly!")
        return True
    else:
        return False

if __name__ == "__main__":
    _ = infer(person_name = "Peter Parker")

    '''
    Function outputs,
    Case 1: if expiration_year = int(2021)
    Hello Peter Parker, the inference function has been intiated successfully
    Inference function has been done properly!
    [Finished in 0.2s]

    Case 2: if expiration_year = int(2022)
    Hello Peter Parker, the inference function has been intiated successfully
    Inference function has been done properly!
    [Finished in 0.2s]

    Case 3: if expiration_year = int(2023)
    Hello Peter Parker, the inference function has been intiated successfully
    You license has been expired, please contact us.
    [Finished in 0.2s]
    '''

输出:

Hello Peter Parker, the inference function has been initiated successfully
Your license has been expired, please contact us.

解释:

在上面的代码片段中,我们导入了一些必需的模块。然后定义了一个推断函数, infer() ,它接受两个参数 – person_nametag = True 。接下来,我们打印了一个用户初始化推断函数的语句。然后,我们定义了一个变量 atr 来存储当前日期和一个字符串变量 resp 。我们还将另一个变量 expiration_year 赋值为 2023 。然后,我们使用了 try-exception 方法来处理可能引发的异常。最后,我们使用了 if-else 条件语句根据情况打印了一条语句。最后,我们将 __name__ 赋值为” __main__ “以执行推断函数。

现在,让我们将这个Python文件保存在一个文件夹中。

混淆Python程序

使用pyarmor对文件进行加密

通过pyarmor帮助将文件加密的过程分为两个步骤:

步骤1:安装pyarmor包

我们可以使用pip安装程序来安装pyarmor包,如下所示:

语法:

$ pip install pyarmor

混淆Python程序

步骤2:加密Python文件

我们可以在命令提示符中输入以下命令来加密该文件。

语法:

$ pyarmor obfuscate --restrict=0 

现在,让我们在func.py文件上实现上述命令。

语法:

$ pyarmor obfuscate --restrict=0 func.py

混淆Python程序

现在,如果我们打开包含原始 func.py 文件的文件夹,我们会看到一个新的子文件夹被创建,被称为 dist

dist 文件夹中,我们会找到另一个文件夹 pytransform 和一个加密的 func.py 文件。

现在,让我们看看这个文件中的内容。

文件:func.py(加密)

from pytransform import pyarmor_runtime
pyarmor_runtime()
__pyarmor__(__name__, __file__, b'\x50\x59\x41\x52\x4d\x4f\x52\x00\...', 2)

混淆Python程序

导入推断函数

一旦我们完成了,直到这一节,现在让我们尝试在一个名为new.py的新Python文件中导入这个加密的func.py,它是在dist文件夹下创建的。

允许我们在运行时解密func.py的强制性密钥是使用pyarmor处理的。它存在于pytransform文件夹中,因此使代码对其他人而言无法阅读。

然而,如果我们想对实际的func.py脚本进行一些修改,我们必须从步骤1开始,继续按照相同的步骤进行。

混淆Python程序

让我们考虑一下我们需要在new.py文件中输入的以下代码片段。

文件:new.py

# importing the inference function definition inside the func.py file
from func import infer

_ = infer(person_name = "Tony Stark")

输出:

Hello Tony Stark, the inference function has been initiated successfully
Your license has been expired, please contact us.

解释:

在上面的代码片段中,我们导入了我们在新建的Python文件中的 func.py 的推理函数,文件名为 new.py 。然后,我们使用与 func.py 相同的配置来执行该函数。

Camera课程

Python教程

Java教程

Web教程

数据库教程

图形图像教程

办公软件教程

Linux教程

计算机教程

大数据教程

开发工具教程