其实这篇文章是讲讲最简单的花指令,这标题是写到后面发现360报木马,所以有此题目。
开始之前
首先编写一个简单的hello world程序,并编译
1 | #include "stdio.h" |
花指令可以简单理解为欺骗杀软,给分析者增加障碍的指令,但是对程序的运行结果没有影响的指令,比如下面的(高级点的使ida反汇编的时候出错,让破解者无法清楚正确地反汇编程序的内容,迷失方向)
1 | push eax |
再比如
1 | sub eax, 1 |
有时候会在jmp的下一行插入一些干扰ida静态分析的字节,而jmp是刚好跳过这些垃圾字节的
实践
指导思想:我们使用od在程序比较后的没有代码的地址编写一些简单花指令,之后跳回真正的入口点(当然我们要将程序的入口点修改为我们的代码的地址)
实践前我们先查下壳(其实这是vs2015编译的)
我们编写如下代码,当然你可以根据自己的需要写出自己的
之后我们通过计算可以知道我们的代码的相对偏移为0x1C5A(这是针对我的程序,只要减去当前程序加载的基址就行了)
当然不要忘记复制到文件中了
最后我们修改程序的入口点(用lordpe比较方便)
【注:由于我od打开了这个文件,所以截图是readonly了,所以修改时记得关闭程序,之后你的保存按纽就会点亮】
当然你也可以自己通过工具找到偏移,在用winhex等16进制工具修改
我们看看程序能否正常运行
360马上报毒……(通过这个实验,我们可以知道360会对程序的入口点的汇编代码进行检测,因位壳和混淆过的代码都比较不正常,这也是检测病毒木马有杀错无放过的一种方式)
关闭360先,ok成功运行
我们现在再来查查壳,peid核心扫描是扫不出来的,因为它是基于userdb.txt里面的特征查找的,还是从入口点开始查找的
其实这个还是可以查到的,推荐个工具
后记
其实代码加花的初衷是想给人阅读和判断制造障碍,绕过杀软等,但是360宁可错杀也不放过helloworld……