免杀技术全称为反杀毒技术Anti Anti- Virus简称“免杀”,它指的是一种能使病毒木马免于被杀毒软件查杀的技术。由于免杀技术的涉猎面非常广,其中包含反汇编、逆向工程、系统漏洞等黑客技术,所以难度很高,一般人不会或没能力接触这技术的深层内容。其内容基本上都是修改病毒、木马的内容改变特征码,从而躲避了杀毒软件的查杀。
免杀-百度百科
杀毒原理浅析
1.1 基于特征码的静态扫描技术
早期基于特征码的静态扫描技术比较普遍。特征码是反病毒公司在分析病毒时,逐个与程序文件比较确定的只有该病毒才可能会有的一系列二进制串,根据从病毒体中提取的病毒特征码,可以与其它病毒或正常程序区别开来。但这种方法在当今病毒技术迅猛发展的形势下已经起不到很好的作用。
1.2 基于行为检测的反病毒技术
行为检测通过hook关键api,以及对各个高危的文件、组件做监控防止恶意程序对系统修改。只要恶意程序对注册表、启动项、系统文件等做操作就会触发告警。最后,行为检测也被应用到了沙箱做为动态检测,对于避免沙箱检测的办法有如下几个:
1.3 基于内存扫描的反病毒技术
内存扫描器一般与实时监控型扫描器协作,从理论上来讲,反病毒软件的文件扫描组件能识别的病毒,内存扫描器也能识别。但是不能从而武断地认为它们用的就是同一套特征码。就算对一个木马文件免杀成功,如果不对其做内存免杀,大多数在运行中的木马文件仍然会被反病毒软件杀掉。作为病毒来讲,被加载到内存就证明它要开始执行一些动作了,在病毒或木马初始化运行环境的时候,会让更多的可疑点暴露出来。
1.4基于新兴技术的反病毒技术
当前较新的反病毒技术包括“主动防御”、“云查杀”、“可信继承”等等。
云查杀基本思路就是以服务器为脑,以所有用户的机器为触角,从而使得服务器可以随时知道每个用户的情况,如果其中某一个用户与其他用户对比发生了异常,那么服务器就会发出指令,让发生异常的机器检查出问题所在,并将问题反馈给服务器,从而在这个问题干扰到其他用户之前将其扼杀掉。
在这其中又发展出了可信继承,顶端的信任体系是由数字签名、样本分析构成的,这些顶端的信任体系在用户的机器上表现出来的形式就是“根可信进程”。所谓的“根可信进程”就是指可信进程链条的顶端,凡是由可信进程开启的新进程都被认为是可信的。
免杀技术
2.1 修改特征码
所谓特征码,就是防毒软件从病毒样本中提取的不超过64字节且能代表病毒特征的十六进制代码。主要有单一特征码、多重特征码和复合特征码这三种类型。既然杀毒软件在最开始时,使用了病毒特征码概念,那么我们可以通过修改病毒特征码的方式躲过杀软扫描。
2.2 花指令免杀
花指令免杀。花指令是设计者特意构思的,它最根本的思想就是希望在反汇编时出错,并为反病毒人员设下陷阱。而如果花指令可以成功保护软件真正代码不被轻易反汇编,那么对于反病毒软件来说,它所检测的自然也就不是木马文件中真正的内容了。花指令可能会用到各种指令:例如jmp, call, ret的一些堆栈技巧,位置运算等等。
2.3 内存免杀技术
反病毒软件的内存扫描原理与文件扫描原理都是通过特征码比对,只是大多数反病毒公司的内存扫描与文件扫描采用的不是同一套特征码,所以只需要这两套特征码全部绕过就能躲过反病毒软件的查杀。
内存免杀技术大多数只需要使用“ShellCode加载器”就可以达到很好的免杀效果,内存免杀后门大部分基于“VirtualAlloc”函数申请内存,使用shellcode加载器将shellcode直接加载进内存,避免文件落地就可以绕过文件扫描。
对比修改特征码,加花指令等需要对PE结构有一定的认知以及汇编基础知识来说,内存免杀技术简单、高效、免杀效果显著使该项技术成为了安全攻防领使用最多的免杀技术。
免杀技术具体实现
3.1 特征码修改
特征码是文件中的某一串二进制代码,这个代码会被杀毒软件识别为木马病毒。想要确定特征码的位置可以利用myccl将00覆盖到文件中,如果此时文件不报毒说明覆盖的地方存在特征码。
如M为特征码存在在某一段中
aaaaa
aMaaa
aaaaa
myccl将代码覆盖生成三个文件
aaaaaaaaaaaaaaa
——aMaaa aMaaa
———— aaaaa
不报毒 报毒 报毒
说明特征码在后面两个文件中,继续缩小范围得到特征码,详细的可以用二进制查看的工具就可以知道myccl的工作原理
继续这个过程得到特征码的准确位置,当然特征码可能有很多个,还会有复合型特征码,还是要看具体看情况去分析。
这里以nc(netcat)为例,通过修改nc的特征码达到免杀效果。需要用到的工具有myccl,火绒,nc和C32asm。
起始位置可以自己定,数量选100,长度会自动算好点一下生成会在被选中的文件同目录下生成OUTPUT文件夹。
第一段0000是文件的序号,第二段是文件开始的位置,第三段是单位长度。
第二个文件是0001,这里应该是文件名排序的问题,E0+17F就是第二个文件的开始。
接下来对文件夹杀毒,然后把扫出有毒的文件删除,点击二次处理,提示找到特征码是否继续,点击yes继续扫描文件夹,发现没有报毒。
点击特征区间,右键复合定位此处特征码。
可以看到缩小了特征码的范围,这里的数量也是可以改的,继续改成100重复之前的操作。
生成->扫描文件夹->删除报毒文件->二次处理->发现没有报毒->复合定位特征码。
现在范围已经确定在两个字节内了可以不用在继续缩小范围,用C32asm打开文件,将NC拖入然后以十六进制打开文件,找到00006678的位置,后面的两个字节就是特征码。
可以看到是一个中括号和一个换行符,把中括号修改一下,随便换个符号
修改好后另存为一下,看看这个修改后的文件能不能使用,help界面的输出被修改了。
最后成功通过了杀软测试
这就是针对特定杀软通过修改特征码,通过扫描文件夹->删除报毒文件->二次处理->发现没有报毒->复合定位特征码->修改特征码->通过杀软这个流程达到免杀的方法。
3.2 花指令
在介绍花指令之前,让我们先来了解一些免杀必备的汇编知识:
栈
栈,是一种数据结构,记住四个字:先进后出。压栈就是把数据放入栈中,从栈顶放入,出栈的时候也是从栈顶取出,所以会有先进后出的特点!先进后出我们可以这样理解,例如:一个乒乓球筒,我们放入乒乓球,然后取出乒乓球,取出的都是就后放进的球。就如我们放入球的顺序是球1、2、3、4,取出的顺序是球4、3、2、1。
push 压栈
pop 弹栈
把b的值送给a
nop 无作用,就是什么也没做
retn 从堆栈取得返回地址并跳到该地址执行
下面是一些算术运算指令:
ADD 加法
sub 减法
inc 加1
dec 减1
跳转指令:
JE 等于则跳转
JNE 不等于则跳转
JZ 为 0 则跳转
JNZ 不为 0 则跳转
JS 为负则跳转
JNS 不为负则跳转
JC 进位则跳转
JNC 不进位则跳转
JO 溢出则跳转
JNO 不溢出则跳转
寄存器
寄存器是中央处理器内的其中组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和位址。我们需要了解的是8个通用寄存器:
EAX,EBX,ECX,EDX,ESI,EDI,EBP,ESP
这些就是我们需要掌握的,一些指令可能看不明白,下面会详细讲解。
此处举例分析几种简单的花指令:
第一种花指令:
特征:先有一个push 操作,然后jmp到一个Call,Call后面跟一个POP
56 EB 27 2B A6 F1 CC 7E 25 31 96 23 39 7D B0 18 5A 1B D7 5E CB 5E FF E6 2B A6 F1 CC 7E 25 31 96 23 39 7D B0 18 5A 1B D7 5E CB E8 E6 FF FF FF 5E
原理:
push D(寄存器) 1.先push esi(使用一个参数,保留环境,这里也可以push eax-edi等寄存器)
jmp C(偏移) 2.通过EB xx的jmp偏移指令,跳转至精心构造的偏移xx处,也就是Call
call B() 3.特定E8的Call指令回退调用(Call => 1.push 下一条指令的地址A。2.jmp 函数地址B)
pop D,jmp D 4.此时pop esi 就把地址A从堆栈中push出来,然后jmp esi就跳转至地址A
pop D 5.再次pop esi 的目的在于还原环境
第二种花指令:
原理:
通过无效指令:如CLC,CLD,FNOP。以及无效跳转:
mov 寄存器,A;
cmp 寄存器,A;
JNZ 迷惑跳转;
来迷惑杀软或者病毒分析人员,让程序不被轻易反汇编,那么对于反病毒软件来说,它所检测的自然也就不是木马文件中真正的内容了
3.3 内存免杀技术
看一个简单的ShellCode加载器
int main(){
unsigned char buf[] = "shellcode";
void* exec = VirtualAlloc(0, sizeof buf, MEM_COMMIT, PAGE_EXECUTE_READWRITE);
memcpy(exec, buf, sizeof buf);
((void(*)())exec)();
return 0;
}
这里我们将进行代码的逐行分析
该段中需要重点关注的两个函数:(1)VirtualAlloc(2)memcpy
(1)VirtualAlloc:是一个Windows API函数,它的作用是调用进程的虚地址空间,预定或者提交一部分页。简单点的意思就是申请内存空间,要让Shellcode执行起来需要先把它放到内存中,
限 时 特 惠: 本站每日持续更新海量各大内部创业教程,一年会员只需98元,全站资源免费下载 点击查看详情
站 长 微 信: lzxmw777