通过字节码混淆来保护Python代码

Find an English version of this topic here.
转载请保留原文地址http://blog.csdn.net/ir0nf1st/article/details/61650984

<0x00> 前言

Python开发者常常面临这样一个难题,即如何保护代码中的技术秘密。笔者尝试过的一些Python代码保护工具要么难以有效实现该目标,要么有效但是有着不可忽视的缺点。最近笔者也遇到了这个问题,在难以找到一个有效解决方案的情况下,不得不自行开发了一个字节码混淆器。本文首先对常见的Python代码保护机制以及几个比较容易获得的Python代码保护工具进行了简单的分析,然后展示了通过字节码混淆来保护Python代码的技术原理。

<0x01> 源码混淆

笔者尝试过两个源码混淆工具。一个是pyminifier,另一个是提供在线源码混淆服务的http://pyob.oxyry.com/。这两个工具的工作方法类似,他们对类名/函数名/变量名进行重新命名,pyminifier甚至能够对部分Python常量进行扰乱(如True/False/None),然而代码的逻辑与控制流并没有被改变。阅读被混淆过的源码对于读者的眼睛来说是一种摧残,也带来了理解上的困难,但是简单的改名甚至无法对抗基本的文本查找与替换。源码混淆如果只在名字替换上下功夫,要实现代码保护无异于缘木求鱼。笔者认为:源码混淆要实现代码保护,则必须提取目标程序的抽象语法树(Abstract Syntax Tree)并对语法树进行修改,再根据修改后的语法树生成新的源码。然而这么做的工作量不会比实现一个编译器来得更少。这篇英文文章更深入的介绍了基于AST分析的Python源码混淆方法,有兴趣的读者可参考。
以下是pyminifier试用结果,读者可以评估一下名字替换是否可以有效保护源码。http://pyob.oryry.com提供的服务要比pyminifier来得更简单,这里就不提供试用效果了。
混淆前的样例代码:

class SampleClass:
    def __init__(self):
        self.data = None

    def method1SampleClass(self, arg):
        self.data = arg

def function_with_if(arg):
    if arg == True:
        pass
    else:
        pass

def function_with_if1(arg=True):
    if arg == True:
        print('True')
    else:
        print('False')

def function_with_if2():
    if True:
        print('True')
    else:
        print('False')

def function_with_try_except1():
    try:
        data = 1/0
    except:
        print('Constructed Control Flow')

def function_with_try_except2():
    try:
        pass
        print('Constructed Control Flow')
    except:
        pass

global_var1, global_var2, global_var3
pass

a = SampleClass()
a.method1SampleClass()
function_with_if(False)
function_with_if1()
del global_var1, global_var2, global_var3

混淆后的代码:

class N:
y=None
T=True
H=False
 def __init__(P):
  P.data=y
 def b(P,R):
  P.data=R
def x(R):
 if R==T:
  p
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值