Python中如何防止自己写的工具被反编译

null
Python中如何防止自己写的工具被反编译

42 回复

代码混淆?


这个问题挺实际的。防止Python代码被完全反编译确实很难,因为.pyc字节码本身就是为了能被解释器执行而设计的,逆向工程的门槛相对较低。不过,可以采取一些措施来增加反编译的难度和成本。

最直接有效的方法是使用代码混淆工具,比如pyarmorpyobfuscate。它们会重命名变量、函数、类名为无意义的字符,插入垃圾代码,打乱控制流,让反编译出来的代码可读性变得极差。这里给你一个用pyarmor的基本例子:

# 假设这是你的原始脚本 main.py
def calculate_something(important_data):
    result = important_data * 2 + 10
    return result

if __name__ == "__main__":
    data = 5
    print(f"The result is: {calculate_something(data)}")

安装pyarmor后,在命令行对脚本进行混淆和加密:

# 安装
pip install pyarmor

# 对单个脚本进行混淆(会生成一个dist目录,里面是受保护的脚本)
pyarmor gen -O dist main.py

# 使用更高级的混淆模式,并绑定到特定机器(需要硬件信息)
pyarmor gen --advanced 2 --bind-mac "xx:xx:xx:xx:xx:xx" -O dist main.py

混淆后的main.pydist文件夹里,内容已经面目全非,核心逻辑被加密。用户运行它时,pyarmor的运行时环境会动态解密并执行。虽然理论上仍可被破解,但成本会高很多。

另一种思路是将核心逻辑用C/C++编写,编译成动态链接库(.so或.pyd),然后在Python中通过ctypescffi调用。这样关键算法就在二进制文件里了,逆向难度比Python字节码大一个数量级。

// core_logic.c
__declspec(dllexport) int calculate_something(int important_data) {
    return important_data * 2 + 10;
}
# 在Python中调用
import ctypes
lib = ctypes.CDLL('./core_logic.pyd')  # 或 .so
result = lib.calculate_something(5)

总结:混淆加二进制化是相对靠谱的组合拳。

请大牛们指导下

我印象中好像没啥好办法,不过 google 了一下,在知乎上找到了一个问题,你可以参考下
https://www.zhihu.com/question/20069661

#3 好的

关键代码包装成服务, http 调用

开源就不会被反编译了。

#5 额。这是个办法、、、

python 大神去那公司有这技术,叫什么 dropbox 公司

用 Cython 編譯代碼然後打包成 egg 或者 wheel 文件

#10 我想打包成在 windwos 下执行的

带有这种目的的 task 我都尽量尝试用 c++来完成。

#12 大牛

真要反编译你的程序,不做加壳之类的一些加固处理也是分分钟的事,用啥语言都一样,做了防护处理也得看是那群人盯上你的程序了

wheel 文件可以跨平台的, 現在 http://www.lfd.uci.edu/~gohlke/pythonlibs/ 上面都是 wheel 文件了

自带 bug ,漏洞百出的程序不怕被人抄袭。如果真是写程序的高人,也不怕抄, Linux , Python 之父都是搞开源的

#14 比较赞同 你得看是什么人顶上你的程序 真正的逆向高手那里…哪些商业软件被爆菊都是正常的 只是别人搞不搞你

#include <python.h>
#include <stdio.h>
#include <stdlib.h>


int main(int argc, char *argv[])
{

Py_Initialize();

FILE * fp = NULL;

PyRun_SimpleString(“execfile(‘test.py’)”);


Py_Finalize();

printf("---------------------END--------------------\n");

return 0;
}

有启发没 明显你没看过 python 的源代码

#18 知道了。拜拜

混淆字节码

最安全的办法就是用自己写的 python 解析器 /斜眼笑

没有,下一题 23333

用 cython 编译成 c

某公司出售的分布式扫描器就是自己研发的 python 解释器,改了字节码。别无他法。

或许可以试试用 http://nuitka.net/ 编译成 c ?

转成 exe ,然后加加密壳,能防住大多数人了

这个只有法律手段了。

IronPython ,编译成 .NET ?

#30 不行吧

现在有工具能编译成 golang ,再编译。

没什么办法能够完全阻止反编译。给予足够的付出,任何程序都可以逆向出来

你首先要考虑别人反编译你的程序会得到什么好处,如果能够降低其逆向价值,先降低其逆向给人带来的价值

如果不能,那么你只要找到一个逆向代价比这个价值高的保护手段就可以了

#33 赞

nuitka 编译。。。

同意 lss 观点,真的有人想破根本没办法防的,想想这么多单机游戏怎么被破解,还被汉化的…
应该有不少游戏也是用 Python 当逻辑脚本的,不得不承认的确有人看汇编就像看代码一样

编译成 pyo 然后打包成 exe

某公司是?

用 cython 把文件转换成二进制的 pyd 不就行了么,看这里 https://www.hajiaoshou.com/10.html

#40 我试试

回到顶部