Python程序代码混淆、编译、打包、运行(桌面程序防破解向)

Python程序代码混淆、编译、打包、运行(桌面程序防破解向),第1张

像Python这种解释性的语言,要想私有化部署的同时又保护好源码,就像是对于鱼和熊掌的追求。

虽然做不到尽善尽美,但是对代码进行混淆,增加一点破解的难度,或许能规避一些泄露的风险。

本次演示环境:linux

确保要发布的包根目录("demo")中有__main__py文件,这个是程序执行入口。

编译

批量改名pyc文件

移动pyc文件

清理py文件

清理__pycache__文件夹

打包成zip

运行时只要将zip文件作为参数即可

最终整合脚本

调用方式

对于在变量和函数名上的混淆有点小儿科,而对于跨文件的类名的混淆又太容易实现。

所以对于混淆程度的取舍,要视工程的规模而定。

21 混淆工具pyminifier

在原来的工具 pyminifier上修复了几个bug。

安装:

python3 安装

或者clone下来,自行安装

使用例子

22 源码变更

不同的配置对于源码的要求不同,以下是笔者踩过的坑。

其他混淆想法

结合混淆、编译和打包,尝试出以下发布脚本。

主要的思路 :创建一个工作目录tmp,然后在此目录下混淆、编译python代码,完成后把内容打包成pyc文件,再将pyc文件和其他配置文件移动到dist,发布dist即可。

混淆的目的是最大程度保护源码,在发布到客户端后不被轻易破解。

__name__ 是当前模块名,当模块被直接运行时模块名为 __main__ 。

__name__ 是当前模块名,当模块被直接运行时模块名为 __main__ 。这句话的意思就是,当模块被直接运行时,以下代码块将被运行,当模块是被导入时,代码块不被运行。

对于很多编程语言来说,程序都必须要有一个入口,比如 C,C++,以及完全面向对象的编程语言 Java,C# 等。如果你接触过这些语言,对于程序入口这个概念应该很好理解,C 和 C++ 都需要有一个 main 函数来作为程序的入口,也就是程序的运行会从 main 函数开始。

同样,Java 和 C# 必须要有一个包含 Main 方法的主类来作为程序入口。而 Python 则有不同,它属于脚本语言,不像编译型语言那样先将程序编译成二进制再运行,而是动态的逐行解释运行。也就是从脚本第一行开始运行,没有统一的入口。

一个 Python 源码文件除了可以被直接运行外,还可以作为模块(也就是库)被导入。不管是导入还是直接运行,最顶层的代码都会被运行(Python 用缩进来区分代码层次)。而实际上在导入的时候,有一部分代码我们是不希望被运行的。

Python中的程序基本结构通常包括以下几个组成部分:

1 模块导入:使用`import`语句引入需要使用的外部模块。

2 变量定义:在程序中定义需要使用的变量。

3 函数定义:使用`def`语句定义自定义函数,以便在程序中多次使用。

4 主程序代码:包含程序的主要逻辑代码。主程序代码应当是程序的入口点,它会调用其他函数和模块来完成特定的任务。

5 执行程序:使用`if __name__ == '__main__':`判断当前代码是否为主程序,并在其下方编写执行主程序的代码。

下面是一个简单的 Python 程序示例,展示了这些基本结构:

```python

# 导入模块

import math

# 定义变量

radius = 10

# 定义函数

def calc_circle_area(radius):

return mathpi radius 2

# 主程序代码

area = calc_circle_area(radius)

print(f"The area of the circle is {area:2f}")

# 执行程序

if __name__ == '__main__':

pass

```

在这个示例中,我们首先使用 `import` 语句导入了 Python 的标准数学库 `math`。然后,我们定义了一个名为 `radius` 的变量,并使用 `def` 语句定义了一个名为 `calc_circle_area` 的计算圆面积的函数。

接着,我们在主程序代码中调用了 `calc_circle_area` 函数,计算圆的面积并将结果存储在变量 `area` 中。最后,我们使用 `print()` 函数输出结果到控制台。

最后,我们使用 `if __name__ == '__main__':` 判断当前代码是否为主程序,并在其下方放置执行主程序的代码。

默认情况下,Python 3 源码文件以 UTF-8 编码,所有字符串都是 unicode 字符串。 当然你也可以为源码文件指定不同的编码:

在 Python 3 中,非 ASCII 标识符也是允许的了。

保留字即关键字,我们不能把它们用作任何标识符名称。Python 的标准库提供了一个 keyword 模块,可以输出当前版本的所有关键字:

Python中单行注释以 # 开头,实例如下:

执行以上代码,输出结果为:

多行注释可以用多个 # 号,还有 ''' 和 """:

执行以上代码,输出结果为:

python最具特色的就是使用缩进来表示代码块,不需要使用大括号 {} 。

缩进的空格数是可变的,但是同一个代码块的语句必须包含相同的缩进空格数。实例如下:

以下代码最后一行语句缩进数的空格数不一致,会导致运行错误:

以上程序由于缩进不一致,执行后会出现类似以下错误:

Python 通常是一行写完一条语句,但如果语句很长,我们可以使用反斜杠()来实现多行语句,例如:

在 [], {}, 或 () 中的多行语句,不需要使用反斜杠(),例如:

python中数字有四种类型:整数、布尔型、浮点数和复数。

实例

输出结果为:

函数之间或类的方法之间用空行分隔,表示一段新的代码的开始。类和函数入口之间也用一行空行分隔,以突出函数入口的开始。

空行与代码缩进不同,空行并不是Python语法的一部分。书写时不插入空行,Python解释器运行也不会出错。但是空行的作用在于分隔两段不同功能或含义的代码,便于日后代码的维护或重构。

记住: 空行也是程序代码的一部分。

执行下面的程序在按回车键后就会等待用户输入:

以上代码中 ," "在结果输出前会输出两个新的空行。一旦用户按下 enter 键时,程序将退出。

Python可以在同一行中使用多条语句,语句之间使用分号(;)分割,以下是一个简单的实例:

执行以上代码,输出结果为:

缩进相同的一组语句构成一个代码块,我们称之代码组。

像if、while、def和class这样的复合语句,首行以关键字开始,以冒号( : )结束,该行之后的一行或多行代码构成代码组。

我们将首行及后面的代码组称为一个子句(clause)。

如下实例:

print 默认输出是换行的,如果要实现不换行需要在变量末尾加上 end=""

以上实例执行结果为:

在 python 用 import 或者 fromimport 来导入相应的模块。

将整个模块(somemodule)导入,格式为: import somemodule

从某个模块中导入某个函数,格式为: from somemodule import somefunction

从某个模块中导入多个函数,格式为: from somemodule import firstfunc, secondfunc, thirdfunc

将某个模块中的全部函数导入,格式为: from somemodule import

import sys print ( ' ================Python import mode========================== ' ) ; print ( ' 命令行参数为: ' ) for i in sys argv : print ( i ) print ( ' python 路径为 ' , sys path )

from sys import argv , path # 导入特定的成员 print ( ' ================python from import=================================== ' ) print ( ' path: ' , path ) # 因为已经导入path成员,所以此处引用时不需要加syspath

很多程序可以执行一些 *** 作来查看一些基本信息,Python可以使用-h参数查看各参数帮助信息:

以上就是关于Python程序代码混淆、编译、打包、运行(桌面程序防破解向)全部的内容,包括:Python程序代码混淆、编译、打包、运行(桌面程序防破解向)、if __name__ == '__main__'是什么意思、Python中的程序基本结构有哪些呢等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10053453.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-04
下一篇 2023-05-04

发表评论

登录后才能评论

评论列表(0条)

保存