首页
社区
课程
招聘
指令保护系列 (一):各种指令保护技术和破解技术介绍
2020-9-4 20:43 7576

指令保护系列 (一):各种指令保护技术和破解技术介绍

2020-9-4 20:43
7576

最近刚高考(成人高考)完,寻思着写几篇文章看看能不能转正。正好这几天成绩下来了,有那么一点时间,就写了这篇关于指令保护和破解这个领域的文章,希望能给新手带来一定的参考作用和指引。各位大神们,不喜勿喷哈,多谢!

一、反汇编技术分析

1、线性反汇编
 

线性反汇编是最容易实现,也是最容易出错的一种反汇编技术,该技术优先将字节码按照线性排列翻译成指令。然而二进制文件中,既有代码,也有数据。代码编写者完全可以利用这个漏洞,植入能够组成多字节指令机器码的数据字节到代码中去。让一些无关的数据被错误地“翻译”成call指令、jmp指令等等垃圾指令,干扰反汇编器的分析。

 

典型例子:PEiD、PE Explorer等各种老式反汇编工具

 

这类反汇编器在遇到带有保护的程序时,非常容易出错,甚至直接完全无法识别代码。如下图:
PE Explorer

2、面向代码流反汇编
 

这是一种更先进的反汇编技术,它并不是盲目地按照线性排列去反汇编整个缓冲区,也不假设仅有指令而无数据。相反,它会随着代码逻辑,边走边“翻译”,建立一个需要反汇编的地址队列,逐个进行反汇编。

 

典型例子:IDA Pro

 

IDA Pro可以提供生成类似于C语言的伪代码的功能,给反编译工作带来了很大的便利:
IDA Pro演示

3.基于动态调试的反汇编
 

在第1种和第2种技术上,仍然出现一些问题,例如代码采用加密代码或者大量混淆的形式来抵御,那么在一定程度上都阻碍这些破解者。但是基于动态调试跟踪的反汇编,则可以实现对程序的完全分析,因为即便加密了代码,在真正运行时都需要解密。

 

典型例子:IDA Pro、OllyDbg

二、对抗反汇编的启示

所谓对抗反汇编技术,就是在程序中使用特殊构造的代码或数据,让反汇编工具产生不正确的指令,干扰破解者的正常分析。在程序代码中使用该技术,可以在一定程度上增加程序破解者的破解难度,但不可能指望代码100%不被破解。
(本文仅讨论对抗反汇编技术,不讨论反调试、反篡改之类的技术)

三、各种对抗反汇编技术

1.插入花指令
 

花指令,就是像“花”一样的指令,仅供观赏,而没有实际用处,仅仅是用来混淆破解者的指令。例如,可以插入大量没有实际用处的运算代码、判断代码,使得反编译者的破解难度加大。
可以选择使用市面上的插花软件,但一般更偏向于手动加花指令。例如,加入一堆没用的判断或者加减乘除这类的操作。

2.代码混淆
 

所谓代码混淆,就是把代码打混,用专业术语来说就是“控制流平坦”,当然也加上“虚假控制流”。原理也很简单,把代码拆分成N块,将顺序打乱后通过jmp连接在一起,高级一点的会用switch(N)来分发执行。再配合“插入虚拟控制流”和“同等指令替换”等技术,可以达到不错的效果
典型例子:OLLVM(开源项目)

 

使用OLLVM混淆前,使用IDA Pro反编译之后:
混淆前

 

使用OLLVM马力全开之后:
混淆后
这要是不去除混淆的话,简直没法看了。

3.指令虚拟化
 

这里的指令虚拟化,大多指的是VMP技术,而不是虚拟机那种虚拟化。就是将基于原CPU汇编指令系统的可执行代码转换为字节码指令系统的代码,以达到保护原有指令不被轻易逆向和修改的目的。这种指令也可以叫伪指令,跟Java的Opcode有点类似。简单来说,就是将真正的指令转换成随机定义的指令,构造一个自己的指令虚拟机,在运行时通过模拟执行的方式运行。是目前破解难度最高的一种指令保护方式,并且提供这种功能的都是商业级的保护工具。
典型例子:VMProtect、Code Virtualizer

四、对抗代码保护技术

1.去除花指令

一般手工打造的花指令基本上不能通过常规方法去除,只能靠手动去除。但是反过来说,手工打造的花指令基本上不可能大规模使用,而自动插入的花指令基本上和原指令没有太多的关联性,很容易去除。

2.去除混淆

去除混淆目前最有效的方法就是,通过研究目标的混淆规则和特征,通过编写反混淆脚本来破解。(就是网上说的“通过符号执行去除OLLVM混淆”)

 

参考:
https://bbs.pediy.com/thread-217727.htm
https://github.com/GeT1t/deollvm

3.对抗VMP保护

将VMP伪代码直接还原成汇编代码难度非常大,除了需要人工分析大量的匹配规则,还必须解决寄存器轮转问题。除了要保护其逻辑正确,还需要注意其中可能包含的暗桩。

 

对于VMP破解这块目前还没有见到有公开可用的,可以将VMP直接还原成原始代码的工具开放。但也有很多前辈的研究成果,下面主要介绍的都是基于OD的辅助分析插件,部分如下:
FKVMP:nooby&fengyue大佬开发的插件,应该耳熟能详。nooby是很早研究VMP插件的前辈,FKVMP可以进行handler的识别得到伪指令序列,早期神器。
VMP分析插件v1.4:zdhysd大佬开发的(http://bbs.pediy.com/thread-154621.htm )毫不过分的说这里目前市面的可以见到的最好用的VMP分析插件,没有之一。可以自行添加handler识别规则和化简规则。除了基础的识别handler之外,最酷的功能是表达式化简功能,可以将VMP伪代码转化成可读性更好的表达式,并进行了数据流分析进行表达式化简,内置近100条化简规则,化简后的表达式可以看到和原始代码相当接近的语义。非常强大!小问题是由于不是常见的汇编代码或C代码,阅读起来仍不是特别方便。
ZVM:zvrop 开发的工具,开放了源码(http://bbs.pediy.com/thread-155215.htm)根据文档说明该工具是可以直接将早期版本的VMP还原为汇编指令的,工作覆盖从handler认识到伪代码收缩转化,非常全面。系统非常复杂,6万行C++实现。不过我还没有编译运行过,不确定效果如何(有兴趣的同学可以试试,回帖说明,多谢)
其他还有Zeus、VMSweeper、OoWoodOne插件等等不多介绍。

 

参考:https://bbs.pediy.com/thread-217588.htm

总结

安全对抗是一个不断演化的过程,有攻就有防,有防就有攻。在指令保护这个领域里上没有一劳永逸的事情,只有不断去研究新的技术,才能保证自己在攻或防的一边的不会失去优势。


[培训]二进制漏洞攻防(第3期);满10人开班;模糊测试与工具使用二次开发;网络协议漏洞挖掘;Linux内核漏洞挖掘与利用;AOSP漏洞挖掘与利用;代码审计。

最后于 2020-11-17 15:52 被恋空编辑 ,原因: 更改一个更好的标题
收藏
点赞7
打赏
分享
最新回复 (8)
雪    币: 1440
活跃值: (4221)
能力值: ( LV9,RANK:195 )
在线值:
发帖
回帖
粉丝
天水姜伯约 4 2020-9-4 22:31
2
0
vmp的话,vtil直接骑vmp脸上了
雪    币: 5974
活跃值: (3890)
能力值: ( LV7,RANK:110 )
在线值:
发帖
回帖
粉丝
pxhb 2 2020-9-5 08:54
3
0
天水姜伯约 [em_13]vmp的话,vtil直接骑vmp脸上了
有没有使用的例子或者介绍文章
雪    币: 135
活跃值: (1240)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
huojier 2020-9-5 14:34
4
0
pxhb 有没有使用的例子或者介绍文章
https://github.com/can1357/NoVmp
雪    币: 83
活跃值: (1042)
能力值: ( LV8,RANK:130 )
在线值:
发帖
回帖
粉丝
killpy 2 2020-9-5 17:40
5
0
666
雪    币: 19586
活跃值: (60093)
能力值: (RANK:125 )
在线值:
发帖
回帖
粉丝
Editor 2020-9-7 09:54
6
0
感谢分享,后生可畏,加油!
雪    币: 839
活跃值: (5014)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
suuuuu 2020-9-8 11:33
7
0
楼主牛逼
雪    币: 202
活跃值: (3385)
能力值: ( LV5,RANK:75 )
在线值:
发帖
回帖
粉丝
大河向东流哇 2020-9-8 15:11
8
0
牛哇 高考完就会这么多了
雪    币: 123
活跃值: (1675)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
bbsshop 2020-9-9 14:42
9
0

强!

最后于 2020-9-9 14:42 被bbsshop编辑 ,原因:
游客
登录 | 注册 方可回帖
返回