type
status
date
slug
summary
tags
category
icon
password
代码混淆是什么
代码混淆是将计算机程序的代码,转换成一种功能是上等价,但是难以阅读和理解的
形式的行为
函数
- 函数是代码混淆的基本单位,一个函数由若干个基本块组成,有且仅有一个入口块,可能有多个出口块
- 一个函数可以用一个控制流图(Control Flow Graph, CFG)表示
基本块
- 基本块由一组线性指令组成,每一个基本块都有一个入口点(第一条执行的指令)和一个出口点(最后一条执行的指令,亦即终结指令)
- 终结指令要么跳转到另一个基本块 (br, switch),要么从函数返回 (ret)
- 基本块等于执行指令 + 终结指令
控制流
- 控制流代表了一个程序在执行过程中可能遍历到的所有路径
- 通常情况下,程序的控制流很清晰地反映了程序的运行逻辑,但经过混淆的控制流会使得人们难以分辨正常运行逻辑
不透明谓词
- 不透明谓词指的是其值为混淆者明确知晓,而反混淆者却难以推断的变量。
- 例如混淆者在程序中使用一个恒为 0 的全局变量,反混淆者难以推断这个变量恒为 0。
这两个代码编译后用 ida 反编译会产生两个截然不同的两种结果,很好玩
代码混淆技术
分类
- 花指令
- 壳
- 虚拟机
- 符号混淆
- 控制流混淆
- 控制流平坦化
- 虚假控制流
- 随机控制流
- 计算混淆
- 指令替代
- 常量替代
- 其他混淆器 (例如 mov 混淆器等,ollvm 也算一种)
符号混淆
将函数的符号,如函数名、全局变量名去除或者混淆。对于 ELF 文件可以通过 strip 指令去除符号表完成。
控制流混淆
- 控制流混淆指的是混淆程序正常的控制流,使其在功能保持不变的情况下不能清晰地反映原程序的正常逻辑
计算混淆
- 计算混淆指的是混淆程序的计算流程,或计算流程中使用的数据,使分析者难以分辨某一段代码所执行的具体计算。
虚拟机混淆
这个我学了很久,后面一定写一篇文章好好总结,这个理解说难也不难,说简单也不简单,就是做起来很复杂
虚拟机混淆的思想是将一组指令集合(如一组 x86 指令),转化为一组攻击者未知的自定义指令集。并用与程序绑定的解释器解释执行。
虚拟机混淆代表:VMProtect。
虚拟机混淆是目前最强力的混淆,但也有许多缺点:如性能损耗大、容易被杀毒软件报毒等。
花指令
我之前参考吾爱大神的一篇写的一篇
花指令详解分析(代码分解)