本文只是介绍如何对程序进行静态免杀,以下方法仅供学习交流使用。虽然市面上杀软的病毒查杀功能越来越完善,静态免杀仍然是比较经典的免杀思路通过一次完整的免杀流程我们也可以简单地了解杀软查杀的原理

杀毒软件工作原理

市面上的杀毒软件基本由扫描器、病毒特征库和虚拟机组成,它会把文件放在虚拟机内运行,扫描该文件的特征,包括静态特征、内存特征、行为特征等,通过和病毒特征库对比来判断一个文件是否为恶意文件。安全厂商一直在收集市面上出现的恶意文件添加进他们病毒库中,所以病毒文件要做到免杀的话就必须清除它本身的特征,杀软特征库匹配不上,就会把它当作正常文件,自然也就免杀了。

杀毒软件查杀原理

杀软查杀包括以下几个方面:

  • 静态查杀:查杀静态的文件,一个病毒文件在编译生成之后,该文件本身就会有特征,比如文件的某个部分是由特定字符组成,杀软匹配到特定字符则判断该文件为恶意文件。
  • 内存查杀:病毒文件在运行后会将自身释放到内存中,释放后的文件在内存中也会存在特定字符,根据这些特定字符也可查杀。
  • 行为查杀:程序的一些特定行为也会被杀软判定为恶意程序,如自删除、加入启动项、释放文件到特定目录、调用敏感的dll或程序、获取主机杀软运行状态等。
  • 云查杀:相当于所有用户的机器为Agent,然后有一个服务端,杀软会把文件自动传到云沙想使用各种杀毒引擎查杀并同步病毒特征到所有Agent。

静态查杀

这篇文件主要详细讲静态免杀,会通过对比源码来更好展现静态免杀的原理。静态免杀的原理便是查杀特征码,杀软会把文件分片,然后根据模糊hash获取所有分片的hash值,然后把这些hash值和病毒特征库做对比,以此来判断文件是否为恶意文件。

mimikatz介绍

本次我们尝试对mimikatz做免杀处理。首先从github下载最新版的mimikatz程序和源码,mimikatz是一款知名的内网渗透中常用的工具,功能有密码读取、hash传递等。

该工具已经被市面上杀软加入病毒特征库,我们的目标就是修改该程序特征码并且不能影响其正常使用。

先输入以下代码测试mimikatz的功能,发现可以正常使用。

privilege::debug
sekurlsa::logonpasswords

同时也发现会被某杀软查杀,本文均以该杀软为例。

VirTest介绍

VirTest是一款shellcode定位工具,可以在杀软查杀文件是定位文件特征码。

1、定位原理:

我们可以这样假设报毒过程,如果检测文件是PE,如果在CODE位置存在 标志A,在DATA位置存在标志B,在资源位置存在标志C,同时满足这个3个条件,那么杀软就会报毒,VIRTEST工作原理就是要找到引起报毒最后一个标志,也就是假设中的标志C。

因此VIRTEST采用2分排除法,测试标志C所在文件中的位置,由于被杀的文件可能存在多个 类似于ABC这样的连锁条件,所以我们必须要通过一种排除机制,先要找最靠近文件前部的连锁条件,排除掉文件尾部数据,当找到第一个连锁条件后,抹掉引标志C,再恢复尾部数据, 然后继续测试另外的连锁条件,直到找到最后一个连锁条件,抹掉后,整个文件免杀了,则说明特征代码被定为完毕了,所以VIRTEST绝对可以精确的定位出所有的复合特征。这比文件分块定位法先进得多,更为科学。

2、使用方法:

1、在无毒环境制作测试文件

2、在有杀软的环境载入测试文件

3、定位特征代码,选6秒,定位出来的就是静态查杀的特征了

定位mimikatz的特征码

根据上述方法把mimikatz.exe制作成测试文件并加载,接下来等待定位完成就OK了,发现定位到12个特征。

和源码对比可知其中大部分特征是源码里的注释,毕竟每个项目注释独特性比较高;还有部分特征是源码里的自定义字符串和调用敏感文件。

源码编译注意事项

此项目是用C语言写的,使用Visual Studio 2019直接编译时比较麻烦,需要注意以下几点。

1、生成-->配置管理器 这里需要设置成release x64

2、项目-->属性-->常规-->平台工作集 需要设置为v142

3、项目-->属性-->C/C++常规-->将错误视为警告 这里需要设置为否(WX-),否则编译会失败

4、工具-->获取工具和功能 需要安装最新的MFC库,否则报错MSB8041,编译失败

通过修改源码达到免杀效果

通过观察特征码,可以发现特征码有以下几个类别组成,注释、自定义字符串、调用敏感的程序,有的还会有方法名,项目名称等,下面将对比源码来分析。

1、注释

这里很明显就是注释。特征码是注释里的benjamin@gentilkiwi.com,这是作者邮箱肯定可以当作特征码

解决办法:很简单,直接CTRL Shift H,将注释替换或者删除。

替换完成之后编译,重新测试免杀发现特征码已经少了很多了。

2、自定义字符串

另外两处特征码是without DisableRegistryTools和DisableRegistryTools,DisableRegistryTools是和注册表相关的代码。

在项目中通过搜索DisableRegistryTools,找到代码位置,这里估计是使用regedit.exe执行了注册表相关操作。感觉注册表相关操作并不一定需要,这里我们尝试直接修改为任意字符,如果有问题我们再通过构造代码来修改这个值。修改完编译成功的话就说明修改该字符是不影响功能的。

还有其他类似的自定义变量也是特征码的话,也直接修改就好了,修改完免杀效果如下。

其他自定义字符串特征码如下图,为Domain %wZ,但是直接找发现找不到,我们结合上下文代码,使用上面的代码Username :来查找才能找到,查看源码发现Domain %wZ中间空格有好几个。

在定位源码中的特征码的时候经常会有这种情况。

发现特征码Domain %wZ都在printf里,打印出来的字符当然可以随便修改了,修改完效果如下,只剩下一个了。

3、调用敏感的程序

最后一个特征如下图为lsass.exe,还是使用全局搜索,发现一共四处使用了lsass.exe。

lsass.exe这个文件在熟悉不过了,是和windows存储密码相关的进程,mimikatz读取windows是一定要使用lsass.exe的,从任务管理器也可以看到这个进程。

那这里肯定是不能直接修改名字,需要构造代码在不影响功能的情况下修改。

这里我们使用以下代码把lsass.exe拼接后使用,代码如下。

需要留意这里是宽字节,要使用MAX_PATH,否则会影响功能。

wchar_t str[MAX_PATH] = L"lsass";
lstrcatW(str, L".exe");
if (kull_m_process_getProcessIdForName(str, &processId))

修改后代码如图所示,注意一共四处都要修改。

修改完成发现特征码都已经没了,已经可以绕过某杀软了,其他杀软方法类似。

最后测试mimikatz功能也是正常的,至此免杀完成。

总结

静态免杀其实很多年前就有了,但是现在部分杀软还能使用修改特征码来绕过,本篇文章只是讲了免杀最简单的一部分,像内存查杀,行为查杀,云查杀其实都要复杂很多。

有部分杀软已经做到了特征码反定位,这种只能重构整个项目源码比如修改方法类名、去除注释图标、重写方法内容避开杀软黑名单。或者自己开发工具,毕竟公网上公开的工具已经被加了太多特征了。

源码

链接:https://github.com/q1ya/mimikatz-byPass-Huorong

后续

1、修改版本信息

去微步测了下,发现居然连版本信息都没改,特征太明显了

修改项目的mimikatz.rc文件,rc文件是一个资源文件,里面包括了引入的位图文件,窗口,图标,光标等等。