前言

文的文字及图片来源于网络,仅供学习、交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理。

作者: 王平

PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取http://t.cn/A6Zvjdun

聊下 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或者正在学习Python,Python的教程不少了吧,但是是最新的吗?说不定你学了可能是两年前人家就学过的内容,在这小编分享一波2020最新的Python教程。获取方式,私信小编 “ 资料 ”,即可免费获取哦!

 

Python 控制流代码混淆简介,加大别人分析你代码逻辑和流程难度的更多相关文章

  1. 脚本代码混淆-Python篇-pyminifier(1)

    前言 最近研究了一下脚本语言的混淆方法,比如 python,javascript等.脚本语言属于动态语言,代码大多无法直接编译成二进制机器码,发行脚本基本上相当于暴露源码,这对于一些商业应用是无法接受 ...

  2. 代码混淆工具——Virbox Protector Standalone

    VirboxProtector Standalone 加壳工具可对代码加密的技术有:代码混淆.代码虚拟化.代码加密. 代码混淆:利用花指令和代码非等价变形等技术,将程序的代码,转换成一种功能上等价,但 ...

  3. APP安全之代码混淆防止反编译查看真实的头文件函数声明

    现在有的公司对自己的爱屁屁(APP)安全上有重视,所以本篇讲一下代码混淆,即使别人反编译出来,也看不出来头文件的信息. 上菜: 1.首先安装class-dump,下载地址:http://steveny ...

  4. .NET代码混淆工具NET Reactor - 初学者系列-学习者系列文章

    这几天无事,除了看书,然后就倒腾原来的代码.想起.NET的代码混淆工具软件,所以今天就讲讲这个.NET代码混淆工具. .NET代码混淆工具软件,以前有了解和找过,但是当时需求不大,所以找了下就搁置了. ...

  5. python学习笔记1--python简介和第一行代码编写

    一.什么是python? python是一种面向对象,解释型语言,它语法简介,容易学习.本节博客就来说说本人学习python的心得体会. 二.python环境安装 目前python版本有python2 ...

  6. Python 代码混淆和加密技术

    动机 Python进行商业开发时, 需要有一定的安全意识, 为了不被轻易的逆向. 混淆和加密就有所必要了. 混淆 为了增加代码阅读的难度, 源代码的混淆非常必要, 一个在线的Python代码混淆网站. ...

  7. 利用Python进行异常值分析实例代码

    利用Python进行异常值分析实例代码 异常值是指样本中的个别值,也称为离群点,其数值明显偏离其余的观测值.常用检测方法3σ原则和箱型图.其中,3σ原则只适用服从正态分布的数据.在3σ原则下,异常值被 ...

  8. Python代码混淆和加密技术

    Python进行商业开发时, 需要有一定的安全意识, 为了不被轻易的逆向. 混淆和加密就有所必要了. 为了增加代码阅读的难度, 源代码的混淆非常必要, 一个在线的Python代码混淆网站. http: ...

  9. android对app代码混淆

    接到新任务.现有项目的代码混淆.在此之前混淆了一些理解,但还不够具体和全面,我知道有些东西混起来相当棘手. 但幸运的是,现在这个项目是不是太复杂(对于这有些混乱).提前完成--这是总结. 第一部分 介 ...

随机推荐

  1. ADO.NET 的使用(二)

    一.本篇主要讲ADO.NET的核心DataSet DataSet里面有个DataTable,DataTable还有个对应的DataView 首先呢,假设数据库的数据 id name mob 100 张 ...

  2. Thread---重排序

    重排序 数据依赖性 如果两个操作访问同一个变量,且这两个操作中有一个为写操作,此时这两个操作之间就存在数据依赖性.数据依赖分下列三种类型: 名称 代码示例 说明 写后读 a = 1;b = a; 写一 ...

  3. Failed RMAN Catalog Upgrade from 11.2.0.2 to 12.1.0.2 ( ORA-02296 RMAN-06004 )

    Failed RMAN Catalog Upgrade from 11.2.0.2 to 12.1.0.2  ( ORA-02296  RMAN-06004 ) 由于后期使用12c的数据库,需要对现有 ...

  4. Git之旅

    ithub安装,我选择的是windows下的版本. git配置用户信息 安装完成后,还需要最后一步设置,在命令行输入: $git config --global user.name "You ...

  5. JS 剑指Offer(五) 二叉树的重建

    题目:输入某二叉树的前序遍历和中序遍历的结果,请重建该二叉树.假设输入的前序遍历和中序遍历的结果中都不含重复的数字. 题目分析:已知二叉树的前序和中序遍历,根据前序遍历和中序遍历的规则,前序遍历的第一 ...

  6. 用<center/>标签实现markdown 图片文字等内容居中显示

    markdown中,文字居中的方式是借助了html标签<center></center>的支持 示例 ![](https://img2018.cnblogs.com/blog/ ...

  7. JVM系列十(虚拟机性能监控神器 - BTrace).

    BTrace 是什么? BTrace 是一个动态安全的 Java 追踪工具,它通过向运行中的 Java 程序植入字节码文件,来对运行中的 Java 程序热更新,方便的获取程序运行时的数据信息,并且,保 ...

  8. 一个关于HttpClient的轮子

    由于本文较长,需要耐住性子阅读,另外本文中涉及到的知识点较多,想要深入学习某知识点可以参考其他博客或官网资料.本文也非源码分析文章,示例中的源码大多是伪代码和剪辑过的代码示例,由于该轮子为公司内部使用 ...

  9. SpringMVC(一):简介和第一个程序

    本文是按照狂神说的教学视频学习的笔记,强力推荐,教学深入浅出一遍就懂!b站搜索狂神说或点击下面链接 https://space.bilibili.com/95256449?spm_id_from=33 ...

  10. 数据结构和算法(Golang实现)(30)查找算法-2-3-4树和普通红黑树

    文章首发于 阅读更友好的GitBook. 2-3-4树和普通红黑树 某些教程不区分普通红黑树和左倾红黑树的区别,直接将左倾红黑树拿来教学,并且称其为红黑树,因为左倾红黑树与普通的红黑树相比,实现起来较 ...