花指令透彻分析
花指令透彻分析
0x01 花指令介绍
花指令实质就是一串垃圾指令,它与程序本身的功能无关,并不影响程序本身的逻辑。在软件保护中花指令被作为一种手段来增加静态分析的难度,花指令也可以被用在病毒或木马上,通过加入花指令改变程序的特征码,躲避杀软的扫描,从而达到免杀的目的。花指令一般被分为两类:会被执行的和不会被执行的(垃圾指令)。
0x02 会被执行花指令
这类花指令本身是正常的汇编指令,它们运行完后不会改变原来程序的堆栈/寄存器,但能起到干扰静态分析的作用。一般分为两种:
- 形式一:改变堆栈操作
- 形式二:利用call或者jmp指令增加执行流复杂度
形式一
原理
1 |
|
用32位编译一下,正常来说应该ida识别不出来,但是不知道什么情况,我的ida就能识别出来,暂且不管。
形式二
原理
执行call执行时会向堆栈中压入返回地址,我们可以修改这个返回地址,配合ret指令跳转到任意一个想去的地方。
示例代码:
1 |
|
32位编译一下,然后我们运行一下,看有没有问题,结果很显然,非常正常
用ida反编译一下,看看花指令到底影响我们的ida识别没有
直接飘红,F5后给出无效反编译代码
ida认为到第一个ret就结束main函数了
修复
我们就根据add指令把esp指向的地址加几个字节,我们就nop几个字节,然后Edit function改一下函数结束地址就修复成功了
0x03 不会被执行花指令
花指令虽然被插入到了正常代码的中间,但是并不意味着它一定会得到执行。这类花指令一般不属于CPU可以识别的操作码,那么就需要在上面用跳转跳过这些花指令才能保证程序的正常运行
形式一
原理
如果我们插入的花指令是一个操作码,那么后面程序原本的机器码就会被误认为是这个操作码的操作数,从而导致反汇编引擎的解析错误。
示例代码:
1 |
|
由于经过xoreax,eax后,ZF标志位被置为1,那么jz这条跳转指令必定会被执行,后面插入的0x11,0x22,0x33就会被跳过,程序正常运行。
ida反编译效果
修复
只需要把跳转中间不会被执行的指令nop掉就行了
形式二
原理
插入的花指令也可以是改变堆栈平衡的汇编代码,跟形式一相同,在这些花指令上面写上跳转指令,虽然花指令不会被执行,但是IDA进行解析时会认为该函数堆栈不平衡,从而使F5功能失效。
示例代码:
1 |
|
ida反编译效果
修复
类似于形式一,把中间跳过的字节nop掉就行