免杀小结-

静态免杀与动态免杀

静态免杀

静态免杀多为特征库匹配,也就是云查杀,识别方式是提取文件一段特征码来识别病毒文件

特征码的识别---工具:

常见的特征码定位工具有CCL,MYCCL,工具大致原理就是分割文件,某些分割部分填入数据(0),如果扫描该部分不报警,则特征码在这个部分,如此反复扫描

以上提到的工具均为文件分块定位的办法,定位效果比较随缘

下面这款软件VirTest,很好的解决了随缘检测的问题

先来假设一下报毒过程,对于PE文件的检测,如果在CODE位置存在标志A,在DATA位置存在标志B,在资源位置存在标志C,同时满足这三个条件,那么杀软就会报毒,VirTest工作原理就是要找到引起报毒的最后一个标志,也就是C
​
​
virtest采用二分排除法,先测试标志C位置,为了排除其他可能存在的ABC连锁条件,首先回去找最靠进文件前部的连锁条件,排除掉文件尾部数据,当找到第一个连锁条件后,抹掉标志C,再回复尾部数据
当其余ABC连锁均测试完后,将最后一个连锁的C抹除掉,这个文件就免杀了

另外还有手工查找特征码的方式,但是一般只针对于源码,毕竟都是二进制,对于未知文件直接手工不现实

(关键手工这块咱也不懂......)

免杀修改

前面已经找到特征码了,怎么免杀呢?

其实前面已经说到了,找到特征码之后,只要改变这个特征码值得话就免杀成功。如果不需要软件正常运行,直接填零得了...开玩笑,这怎么可能。所以修改特征码还得保证软件正常功能。所以也是有讲究的。

常用的修改工具有,OD,C32ASM,UE,010Editor等等。

手工修改

非源码

1). 数据

如果特征码定位到数据(通过IDA/OD等确认),其实不好修改,稍微不慎就会导致程序不能运行,或者影响程序运行流程或结果。

字符串,如果不影响程序逻辑,可以替换大小写;如果无关紧要的数据,随意替换;等等,看情况而定。

整数,如果不影响结果,替换值,清零等等操作。

地址,基本应该不能修改,具体看情况。

PE头数据,根据PE结构具体来看,无用数据清零或修改,有用数据看情况修改。

最后,终极修改方法,找到访问数据的代码,直接修改代码访问数据的地址,数据也可以放到其他地址了,其实就如同修改源码一样修改,肯定没有修改源码那么容易(见后)。

反正特征码定位到数据位置不容易修改(可以再试试后面的盲免杀)。

2). 代码

如果特征码定位到代码(也通过IDA/OD等确认),在不改变程序功能基础上,应用各种方法修改。

等价替换汇编代码,如mov eax,0可以换成xor eax,eax,直接结果相同,二进制代码不同。

交换代码顺序,在不影响逻辑的情况下。

代码块移位,将代码块移动不用的内存位置,通过加入jmp addr跳过去执行,addr是新的代码块地址。

源码:

在有源码的情况下,修改的方式就更灵活了,更简单了。

如果特征码是数据,那么修改数据位置,访问数据的代码位置等(思想类比非源码方式)。

加花指令,这是最有效也是最常用的方式,要点在于如何加话指令。

加数据计算代码,加减乘除各类组合。

加字符串操作代码,增加、删除、查找、替换等。

加多层跳转,跳转间加无效指令(不会执行的)。

加貌似有效的API调用,如LoadLibrary+GetProcAddr+API等。

等等。

(二)工具免杀(盲免杀)

在没找到有效的特征码,或者不好修改的时候,可以试试这种方式。

资源操作:

1). 加资源

使用ResHacker对文件进行资源操作,找来多个正常软件,将它们的资源加入到自己软件,如图片,版本信息,对话框等。

2). 替换资源

使用ResHacker替换无用的资源(Version等)。

3). 加签名

使用签名伪造工具,将正常软件的签名信息加入到自己软件中。

几种方式可以交替重复多次进行组合使用。

PE操作:

1). PE优化

使用PE优化工具对文件进行优化,删除0,PE头优化,附加数据等。

2). 增加节

增加节数据,随意加入无效数据。

加壳:

可以将加壳简单理解为:解密器/解压器+加密器/压缩器(原始代码)。

通过加密器/压缩器将原始代码进行加密压缩,让其特征码变化隐藏,然后组装上解密器/解压器到文件中,运行是先运行解密/解压器,将加密压缩内容解密解压,然后继续运行原始代码。

1). 加冷门壳

壳也有特征,知名壳都已经被分析的非常多了,杀软基本都能查这类壳,或者自动脱壳,然后进行查杀。

所以加冷门壳,壳特征未被分析,不能自动脱壳,可以更好隐藏原始代码,得到免杀效果。

2). 加壳改壳

将常用壳进行修改,让壳特征变化,也可以是杀软失效。

比如修改入口,区段信息修改,入口代码移位。

可以类比为免杀壳,上面介绍的方法都可以使用。

*3.2 其次,行为动态免杀*

杀毒软件现在都会有主防的功能,对恶意行为进行拦截提示。

比如这些行为:

注册表操作,添加启动项,添加服务,文件写入、读系统文件、删除文件,移动文件

杀进程,创建进程,注入、劫持等

*3.2.1行为拦截原理*

说白了,恶意行为都是通过API调用来完成的,可能是一个API,可能是多个APi组合。

杀软通过技术手段拦截这些API调用,通过策略来判断是否属于恶意行为。

关键点:

API

策略(顺序,调用源,参数等等)

所以后面的方法就是针对这两点做的工作。

*3.2.2如何进行行为免杀呢?*

下面介绍的方式对非源码、源码都有效,但是非源码修改起来非常非常麻烦...

1). 替换api

使用相同功能的API进行替换,杀软不可能拦截了所有API,所以这种方式还是有效的。比如MoveFileEx替换MoveFile。

2). 未导出api

寻找相同功能的未导出API进行替换,杀软拦截一般是导出API,或者底层调用,寻找未导出API有一定效果。

寻找方法,通过分析目标API内部调用,找到内部一个或多个未导出API,来完成相同功能。

3). 重写api

完全重写系统API功能(通过逆向),实现自己的对应功能API,对于ring3的行为拦截非常有效。比如实现MoveFile等。

4). api+5

ring3的API拦截通过是挂钩API头几个字节内容,然后进入杀软自己函数进行参数检查之类的。

那么如果调用API时,跳过头部几字节,就可以避开这种拦截方式。

__API:

1 push ebp;

2 mov ebp, esp;

3 mov edi, edi;

4 ...

调用时,不适用1地址,而使用4地址,然后自己函数内部还原跳过几字节的调用。

__API_MY:

push ebp;

mov ebp, esp;

mov edi, edi;

call 4

5). 底层api

该方法类似于2和3,杀软拦截API可能更加高层(语义更清楚),那就可以找更底层API进行调用,绕过拦截,比如使用NT函数。

或者通过DeviceIoControl调用驱动功能来完成API功能。

模拟系统调用。

6). 合理替换调用顺序

有时拦截行为是通过多个API组合来完成的,所以合理替换顺序,绕过杀软拦截策略,也可以绕过改行为拦截。

比如,先创建服务,再将服务对应文件拷贝过去。

7). 绕过调用源

通过调用其它进行功能来完成API的功能。比较经典的如,通过rundll32.exe来完成dll加载,通过COM来操作文件等等。

小结:

方法大概就总结到这,要更好的完成免杀,需要各种方式进行合理灵活组合变化,或者挖掘更多的方法

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值