聊下 Python 的代码混淆,对 Python 的代码做混淆感觉是不伦不类,但是对于外包项目交付型的,又有一些需要。

混淆的目的就是加大别人分析你代码逻辑和流程的难度,让代码看上去杂乱,逻辑混乱。但是程序要能正常运行。

一般混淆

对 Python 代码做简单点混淆的就是变量名/类名/字符串/常量做混淆,把名称变成很长或者近似。

这类的混淆库很多,比如 Intensio-Obfuscator 这个库,这个库分简单和复杂混淆,来看下用它的简单模式来混淆 Python 代码:

左边是混淆前,右边是混淆后,只是把变量名方法名混淆并且加长了。

这种简单混淆的意义不大,字符串和常量都一目了然,代码结构,就靠静态分析,代码的脉络也看得还是清楚。

再复杂一点的混淆就是把关键代码藏起来,和在代码里加一些无效代码。

还是 Intensio-Obfuscator 这个库的复杂混淆模式,我们来看看:

右边初看,貌似不像是 Python 代码,实际上右边那串字符串就是左边的 Python 代码,只不过是 unicode 码。  因为 Python 有个内置函数 exec() 可以执行字符串程序,像这样:

> exec("1+1")

>2

我们把这个字符串里的内容打印成 utf8 看看里面的内容:

如上图,它的混淆一是把变量名做得更长,二是代码里加了些干扰代码,看标红处,原始代码本来没有 for 和 if 语句,混淆后的代码有了。看上去如果要静态分析这个代码很困难了,实际如果把变量名重名命和变短后,这部分多余的 for 和 if 通过静态分析,还是较容易跳过去。

总结下  Intensio-Obfuscator 库复杂混淆模式,先是把代码变量函数名弄得很长,然后是在代码里加入了无效代码,最后是把源代码压缩当成一个字符串,用 exec 来执行。

抽象语法树混淆

上面的混淆方式相对简单,通过静态分析就能反混淆出来。更复杂一点的混淆就是控制流混淆。通常程序的执行流程都是很有条理的,控制流混淆就是把程序的执行流程混淆。

比如代码里多了很多 while for if 乃至 lamdb 语句,把赋值,加减操作,变成位运算等等。让你通过静态分析的方式,很难看出代码的目的和逻辑是什么。

怎么做到控制流混淆,要通过抽象语法树 (AST),通过抽象语法树,可以做到用程序来修改程序。通过抽象语法树,可以很精确的知道程序在做什么操作,这样就能很精准的修改代码。

先看一下简单的通过抽象语法树来混淆程序的例子,还是拿上面的程序来举例。

左边是混淆前的代码,后面是混淆后的。这个例子也是把变量名混淆了,然后是把字符串和常量,还有 import 也混淆了。反混淆的难度比上面大了一点,要通过动态调试才知道程序在干嘛。

什么是抽象语法树

见名知意就是把程序抽象成一棵树,代码里的语句被拆成了树上的一个个节点。Python 里有个 AST 模块就是用来干这个的,还是上面的源代码,看下被 AST 拆成节点后是什么样。

第二张图就是把第一张图创建为了抽象语法树,并且把源代码按树的节点打印出来了。

红箭头标注了,有 Import 节点,Assign 节点, 函数节点, 加法节点等等。这颗树可以完全表达上述程序。我们可以通过访问这颗树,来用程序修改程序。

自定义一个类,继承 ast.NodeTransformer ,比如你想访问字符串,就实现visit_Str这个方法,想访问 Import 就实现 visit_ImportFrom 这个方法。在实现的方法里,你可以用一些混淆算法去混淆,(注意只能是混淆,不能改变结果)。这样就能做到精细化和更复杂的混淆。

有一个 ASTObfuscate 第三方混淆库就是通过操作 AST 来混淆代码,不过对程序逻辑流的混淆没有,要实现更复杂的控制流混淆,要完整实现这颗解析树。

当然 Python 的代码混淆更难的话,应该是通过混淆字节码,或者把关键代码做成 so 文件,这样的混淆难度更大。 字节码和 so 文件都是汇编指令。

我的公众号:猿人学 Python 上会分享更多心得体会,敬请关注。

***版权申明:若没有特殊说明,文章皆是猿人学 yuanrenxue.com 原创,没有猿人学授权,请勿以任何形式转载。***

python控制流_Python 的控制流代码混淆相关推荐

  1. python控制流_Python学习--控制流

    控制流 在Python中有三种控制流语句--if.while和for. if语句 if语句用来检验一个条件,如果条件为真,我们运行一块语句(称为if-块), 否则我们处理另外一块语句(称为else-块 ...

  2. python樱花_python画樱花树代码 具体代码介绍

    1.python画樱花树代码为: import turtle as T import random import time 2.# 画樱花的躯干(60,t) def Tree(branch, t): ...

  3. python注入_Python如何考虑代码注入安全?

    使用ast.literal_eval(), 只允许使用 string,bytes,number,tuples,lists,discts,set,booleans,None ast.literal_ev ...

  4. oc代码混淆_OC代码混淆工具

    之前用python写了一个OC代码混淆脚本(python脚本),每次运行不方便,且其他人使用起来困难,就尝试写了一个mac工具. 工具地址:点我下载   密码:2405 现阶段工具还处于初级阶段,功能 ...

  5. 代码混淆之道——控制流扁平与不透明谓词理论篇

    控制流是指代码执行时指令的执行顺序.在各种控制逻辑的作用下,程序会沿着特定的逻辑顺序执行.一般控制逻辑包括有无条件分支.循环.函数调用等. 本文原创作者:i春秋签约作家--penguin_wwy 一. ...

  6. Python代码混淆技术

    Python代码混淆技术 1. .py代码混淆技术 我们一般对反汇编代码进行还原时,默认CALL就是对一个函数的调用,碰到RET就是函数返回,条件分支两侧的代码都有可能被执行.而代码混淆就是打破了这种 ...

  7. python while循环if_20170403Python控制流if、while、for语句学习

    控制流if.while.for语句学习 if elif else语句 if语句是一种最常见的控制流语句类型.它用于判断一个条件,如果为True,则执行紧跟其后的代码块. 一条if语句可以跟上一个或多个 ...

  8. python代码代写_python代写代码

    广告关闭 腾讯云11.11云上盛惠 ,精选热门产品助力上云,云服务器首年88元起,买的越多返的越多,最高返5000元! 1 原则在开始讨论python社区所采用的具体标准或是由其他人推荐的建议之前,考 ...

  9. 【Python编程基础】控制流之链式比较运算符

    现实生活中会出现一些情况,当我们需要做出一些决定时,我们会根据这些决定来决定下一步应该做什么.类似的情况也出现在编程中,我们需要做出一些决定,并根据这些决定我们将执行下一个代码块. 本文章为系列文章, ...

最新文章

  1. 使用iText在word文档中插入复杂的Table表格
  2. protobuf repeated类型的使用
  3. TP5 实现微信支付和支付宝支付
  4. python学习环境安装_python学习系列----环境的安装
  5. LeetCode打卡 52八皇后Ⅱ53最大子序和54螺旋矩阵
  6. 低延时直播与RTC融合架构设计②:直播与RTC低延时方案
  7. Windows的Win键被自动按下解决方案
  8. win7系统怎样打开音频服务器,win7系统打开音频管理器的具体教程
  9. 数据仓库相关书籍调研
  10. mysql获取离当前数据最近的数据_Mysql 获取最近数据信息
  11. spring中用到的9种设计模式
  12. redis 命令别名_【死磕 Redis】 哨兵(一):部署哨兵架构
  13. Python:列表list对应项求和
  14. linux3.8内核下载,linux 3.8内核usbmouse代码注释
  15. PAT 乙级 1051. 复数乘法 (15) Java版
  16. JDK5.0新特性系列---11.5.4线程 同步装置之Exchanger
  17. Spring自学教程-AOP学习(五)
  18. linux安装i3wm桌面环境,ArchLinux + i3wm 桌面 Windows10 双系统安装(重点记录)
  19. 支付宝小程序开发笔记
  20. 支持ESMTP身份验证的邮件发送

热门文章

  1. 记一次小机器的 Python 大数据分析
  2. 撒列实现关键字过虑二(附源码)
  3. 你不可不知的家庭装修禁忌
  4. [转]你在修佛,还是在修魔
  5. Java时间操作工具类
  6. Android开发实战三之导入现有Android工程项目
  7. Exchange2003中实现两个邮件系统收发邮件配置实例
  8. 碰上摩尔纹怎么办?这5招帮你解决!
  9. 转:测试部工作不受重视怎么办?
  10. 用字体在网页中画Icon图标