最近刚高考(成人高考)完,寻思着写几篇文章看看能不能转正。正好这几天成绩下来了,有那么一点时间,就写了这篇关于指令保护和破解这个领域的文章,希望能给新手带来一定的参考作用和指引。各位大神们,不喜勿喷哈,多谢!
线性反汇编是最容易实现,也是最容易出错的一种反汇编技术,该技术优先将字节码按照线性排列翻译成指令。然而二进制文件中,既有代码,也有数据。代码编写者完全可以利用这个漏洞,植入能够组成多字节指令机器码的数据字节到代码中去。让一些无关的数据被错误地“翻译”成call指令、jmp指令等等垃圾指令,干扰反汇编器的分析。
典型例子:PEiD、PE Explorer等各种老式反汇编工具
这类反汇编器在遇到带有保护的程序时,非常容易出错,甚至直接完全无法识别代码。如下图:
这是一种更先进的反汇编技术,它并不是盲目地按照线性排列去反汇编整个缓冲区,也不假设仅有指令而无数据。相反,它会随着代码逻辑,边走边“翻译”,建立一个需要反汇编的地址队列,逐个进行反汇编。
典型例子:IDA Pro
IDA Pro可以提供生成类似于C语言的伪代码的功能,给反编译工作带来了很大的便利:
在第1种和第2种技术上,仍然出现一些问题,例如代码采用加密代码或者大量混淆的形式来抵御,那么在一定程度上都阻碍这些破解者。但是基于动态调试跟踪的反汇编,则可以实现对程序的完全分析,因为即便加密了代码,在真正运行时都需要解密。
典型例子:IDA Pro、OllyDbg
所谓对抗反汇编技术,就是在程序中使用特殊构造的代码或数据,让反汇编工具产生不正确的指令,干扰破解者的正常分析。在程序代码中使用该技术,可以在一定程度上增加程序破解者的破解难度,但不可能指望代码100%不被破解。
(本文仅讨论对抗反汇编技术,不讨论反调试、反篡改之类的技术)
花指令,就是像“花”一样的指令,仅供观赏,而没有实际用处,仅仅是用来混淆破解者的指令。例如,可以插入大量没有实际用处的运算代码、判断代码,使得反编译者的破解难度加大。
可以选择使用市面上的插花软件,但一般更偏向于手动加花指令。例如,加入一堆没用的判断或者加减乘除这类的操作。
所谓代码混淆,就是把代码打混,用专业术语来说就是“控制流平坦”,当然也加上“虚假控制流”。原理也很简单,把代码拆分成N块,将顺序打乱后通过jmp连接在一起,高级一点的会用switch(N)来分发执行。再配合“插入虚拟控制流”和“同等指令替换”等技术,可以达到不错的效果
典型例子:OLLVM(开源项目)
使用OLLVM混淆前,使用IDA Pro反编译之后:
使用OLLVM马力全开之后:
这要是不去除混淆的话,简直没法看了。
这里的指令虚拟化,大多指的是VMP技术,而不是虚拟机那种虚拟化。就是将基于原CPU汇编指令系统的可执行代码转换为字节码指令系统的代码,以达到保护原有指令不被轻易逆向和修改的目的。这种指令也可以叫伪指令,跟Java的Opcode有点类似。简单来说,就是将真正的指令转换成随机定义的指令,构造一个自己的指令虚拟机,在运行时通过模拟执行的方式运行。是目前破解难度最高的一种指令保护方式,并且提供这种功能的都是商业级的保护工具。
典型例子:VMProtect、Code Virtualizer
一般手工打造的花指令基本上不能通过常规方法去除,只能靠手动去除。但是反过来说,手工打造的花指令基本上不可能大规模使用,而自动插入的花指令基本上和原指令没有太多的关联性,很容易去除。
去除混淆目前最有效的方法就是,通过研究目标的混淆规则和特征,通过编写反混淆脚本来破解。(就是网上说的“通过符号执行去除OLLVM混淆”)
参考:
https://bbs.pediy.com/thread-217727.htm
https://github.com/GeT1t/deollvm
将VMP伪代码直接还原成汇编代码难度非常大,除了需要人工分析大量的匹配规则,还必须解决寄存器轮转问题。除了要保护其逻辑正确,还需要注意其中可能包含的暗桩。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!
最后于 2020-11-17 15:52
被恋空编辑
,原因: 更改一个更好的标题