初始花指令
前言
在一般的逆向工程中,一般使用IDA进行逆向,比如,逆向一个exe文件,IDA会将exe的二进制字节码转换为汇编指令,如果想要汇编指令更易于理解,可以F5将汇编指令转换为c语言伪代码,但是有些程序开发者为了保护代码,不被逆向,所以采用花指令骗过IDA,使其不能正常还原为伪代码
花指令是对抗反汇编的有效手段之一,正常代码添加了花指令之后,可以破坏静态反汇编的过程,使反汇编的结果出现错误。错误的反汇编结果会造成破解者的分析工作大量增加,进而使之不能理解程序的结构和算法,也就很难破解程序,从而达到病毒或软件保护的目的。
分类
可执行花指令
可执行式花指令指的是能够正常运行的但又不改变原始程序逻辑性的一组无用指令。这类花指令有如下特点:
①可以正常运行;
②不改变任何寄存器的值;
③反汇编器可以正确反汇编该指令。
例如这样几组花指令就属于该类别:PUSH EAX&POP EAX;NOP,INC EAX&DEC EAX等等。这种类别的花指令组合形式很多,常常用在病毒代码的变形引擎中,病毒在传播时通过变形引擎随机产生一组该类别花指令并插入到病毒正常代码中,可以改变病毒的特征码,从而起到变形的作用。
不可执行花指令(垃圾指令)
不可执行花指令,是指被插入到原始代码中但又不改变原始程序逻辑性的一组无用字节。这类花指令有如下特点:
①不可以正常运行;
②不改变任何寄存器的值;
③反汇编器可能会错误反汇编这些字节。
根据反汇编的工作原理,只有当花指令同正常指令的开始几个字节被反汇编器识别成一条指令时,才能有效破坏反汇编的结果。因此,插入的花指令应当是一些不完整的指令,被插入的不完整指令可以是随机选择的。正因为不可执行花指令有这些特点,该类花指令才能应用到软件保护中。
Cullen等人指出为了能够有效“迷惑”静态反汇编工具,同时保证代码的正确运行,花指令必须满足两个基本特征,即:
- 1)垃圾数据必须是某个合法指令的一部分:
- 2)程序运行时,花指令必须位于实际不可执行的代码路径
不可执行花指令的成功来自反汇编算法的缺陷
当前静态分析中采用的反汇编算法主要可以分为2类:线性扫描算法与行进递归算法。
线性扫描反汇编算法
线性扫描算法p1从程序的入口点开始反汇编,然后对整个代码段进行扫描,反汇编扫描过程中所遇到的每条指令。线性扫描算法的缺点在于在冯诺依曼体系结构下,无法区分数据与代码,从而导致将代码段中嵌入的数据误解释为指令的操作码,以致最后得到错误的反汇编结果。
行进递归反拒绾算法
相比线性扫描算法,行进递归算法通过程序的控制流来确定反汇编的下一条指令,遇到非控制转移指令时顺序进行反汇编,而遇到控制转移指令时则从转移地址处开始进行反汇编。行进递归算法的缺点在于准确确定间接转移目的地址的难度较大。
典型花指令
一般花指令有很多种,下面给出一个典型
花指令程序
1 |
|
以上给了7个常见的花指令的源码,虽然花指令的原理差不多,但是能够让机器不能正常识别就行,好像有这样一句话,就是不影响程序运行,添加无效垃圾指令
去花
在IDA打开这个程序,可以正常的生成没有添加花指令的main函数,但是在各大函数里面就别有洞天了

example1
跟进sub_40100F()函数,直接出现了JUMPOUT(0x401230)的提示,显然就是因为花指令,IDA不能正常给出伪代码
TAP键,切换为汇编代码
点击
00401258,选中地址,U或D键将其转换为数据
将
C2改成90,90就是nop的字节码,可以Edit–patch program–change byte
选中
00401258,C键转换为指令,选中040125A,C键,将其还原为指令
发现其依旧不能转换为伪代码
原因在loc_401250里面也有问题,简单点,就是将其全部nop,改为90

下面再
00401230处P键,最后F5将其转换为伪代码
最后
F5的结果如下
example2
跟进sub_401014()函数,也可以看到一个JUMPOUT(0x401290);的红色提示,那就需要分析汇编指令了
Tab键,查看汇编
在
004012B1处,U键,转换为数据
在
004012B2处C键,将004012B2处的内容识别为代码,而前一行004012B1就是垃圾数据,所以将004012B1和跳转这里的jnz short near ptr unk_4012B1的内容给nop掉,可仍然有问题
将
004012B9到004012C4的内容nop掉,发现还是有问题,结果是,在上一个retn指令后面有一个垃圾数据,0x11,所以将其nop掉,即可得结果
然后在
00401290处,先U键后P键,最后F5生成伪代码
example3
跟进sub_40102D()函数,同样给了个JUMPOUT(0x401300);就没显示其它了,跟进汇编
Tab键,查看汇编
在
00401321处,D键,转换为数据
然后将
0040131D和00401321处的内容nop掉,并将00401322的内容C键识别为代码
最后在
00401300处,依次按U,P,F5键,最后得到伪代码
example4+
example4,5,6,7的花指令都大同小异,可以参照前面的方法自行去除
程序链接
百度云链接:https://pan.baidu.com/s/1xs0lSZJWWcemTNdb1dcFjg 提取码:kata
阿里云链接:https://www.aliyundrive.com/s/kawsoPvtHrJ
参考链接
花指令入门:https://blog.csdn.net/zixiaomuwu/article/details/52895488
逆向之花:https://the_itach1.gitee.io/2020/12/18/%E8%8A%B1%E6%8C%87%E4%BB%A4/
反调试入门-花指令:http://www.360doc.com/content/20/1208/20/71939662_950241977.shtml