Python中如何防止代码被反编译?

昨天看见 最近用 Python 写了个工具,有没有什么办法防止被反编译 讨论 Python 源码保护的问题。

结果显而易见如帖子 33 楼说的:没什么办法能够完全阻止反编译。给予足够的付出,任何程序都可以逆向出来

但是略微提高些反编译的门槛的小方法还是有的,现在将一个加密代码用这个办法写了个小 DEMO ,欢迎各位尝试反编译,将此 DEMO 加密后的值: 3518d7401d60a79a22f326ada22f116d 进行解密。

DEMO: https://pan.baidu.com/s/1nuMV5Ip

加个小彩头吧~ 第一个给出反编译方法的 支付宝 10 块钱 (穷那...


Python中如何防止代码被反编译?

17 回复

CC 昨天的楼主

对啦,补充一下,方法直接发楼里就好,反正不是什么严谨的比赛 : )


这问题挺实际的。Python确实容易被反编译,因为.pyc字节码文件的结构是公开的。完全防止不可能,但可以增加破解难度。

核心思路就几种:

  1. 代码混淆:用工具把变量名、函数名改成无意义的字符,让代码难以阅读但功能不变。
  2. 编译成C扩展:用Cython把关键部分写成.pyx文件,编译成.so(Linux)或.pyd(Windows)二进制文件。
  3. 使用加壳工具:比如PyInstaller打包后,再用第三方加壳工具对可执行文件进行保护。

这里给个Cython的简单例子。假设你有核心算法文件 secret_logic.py

# secret_logic.py
def calculate_something(important_data):
    # 你的核心逻辑
    result = important_data * 2 + 42
    return result

先写个 setup.py

from setuptools import setup
from Cython.Build import cythonize

setup(
    ext_modules = cythonize("secret_logic.py", language_level="3")
)

然后在命令行运行:

python setup.py build_ext --inplace

这会生成一个 secret_logic.c.so/.pyd 二进制扩展文件。最后把原来的 secret_logic.py 删掉,只分发二进制文件。别人导入你的模块照样能用,但看不到源代码。

总结:用Cython编译关键模块成二进制是最有效的方法。

用 ctypes 调用就行吧

from Crypto.Cipher import AES
import base64
import sys
from Crypto.Cipher import AES
from binascii import b2a_hex, a2b_hex

class prpcrypt:

def init(self):
global ak
ak = ‘gxu’
self.mode = AES.MODE_CBC
self.accs()
self.eaf()
self.afd()
self.fds()

def accs(self):
global ak
ak += ‘isCc’

def eaf(self):

#3 真快啊,方法是对了的,但是需要解密上面的 token

可是解这个跟这个加密有什么关系 V2EX plus

#5 这样好给你发个小红包呀… 毕竟上面这样写的,你加我微信吧, id 名

不用,大家技术交流而已,哈哈,也算是学习一下

研究过一段时间,最终使用 ctypes 将 py 转为 c ,然后 gcc 编译为.o ,入口文件 import .o 就可以了

#8 实际上有简单些的方法

请教下,烦请告知方法哈

我有个安全相关的工具,因为 py 容易被反编译,结果最后改成 go 来做,效果不错…

#10 着急的话,微信加我 id 我们讨论下,不着急的话,我晚上在附言也说说我的方法

使用定制的 python 主程序,这样别人的反不出你的代码了。但其实也就是增加别人的时间成本罢了。

#10 我的思路已经补充到附言了

使用 ctypesgen ?

回到顶部