免杀技术原理与实现过程:杀毒与免杀的矛与盾
1. 防病毒软件如何检测恶意代码?
1. 检测特征
人有人的特征,代码也有人的特征,杀毒软件有一套特征库,通过查找程序代码是否与库中的特征代码匹配来判断一段代码是否是病毒。
2. 启发式恶意软件检测
如果程序的特征、行为与病毒程序相似,且匹配度达到一定值,则可以认为该程序为病毒程序。
3.基于行为的检测
与启发式检测类似,它只是依靠监视程序行为作为判断准则,通过监视恶意代码的运行过程,比如利用系统监视工具观察恶意代码运行时系统环境的变化,或者通过跟踪恶意代码执行过程中所使用的系统函数和指令特征来分析恶意代码功能,若出现恶意行为则为恶意代码。
2. 免于杀戮是什么?
顾名思义,反查杀就是恶意软件无法被杀毒软件发现和查杀,两者可以共存。
大致有两类情况:
1.二进制防病毒(无源代码)只能通过修改asm代码/二进制数据/其他数据来避免。
2、对于源代码杀毒软件,可以通过修改源代码来实现杀毒软件逃避技术,也可以与二进制杀毒软件逃避技术相结合。
免杀也可以分为两种情况:
1、静态文件对杀毒软件免疫,被杀毒软件病毒库/云查杀,也就是文件特征码在病毒库里。杀毒方式可能是以上两种方式,视情况而定。
2、动态行为防毒:运行过程中执行的一些行为会被防毒软件拦截并上报,如果没有源代码,行为防毒并不容易实现。
3.3.1静态防查杀技术实现方法及流程:
静态防查杀针对的是杀毒软件的静态文件扫描和云查杀(病毒库)查杀。
3.1.1 如何找到签名代码
1)工具搜索
常见的特征码定位工具有CCL、MYCCL等,工具的大致原理是对文件进行分割,将分割出的部分用数据(0)填充,如果扫描到该部分没有报警,则特征码就在该部分。重复这个过程,直到找到一小段内容。不同的工具采用不同的分割算法,找到特征码的结果也不同。
目前比较流行的特征定位器有CCL和MYCCL,均采用文件块定位的方式,定位效果比较运气,每次定位的位置可能都不一样,给反查杀带来困难。
后来又有新的签名定位软件出来了,下面是笔者自己的介绍:
我们可以这样假设报毒过程:如果检测的文件是 PE,那么如果在 CODE 位置有标志 A,在 DATA 位置有标志 B,在资源位置有标志 C,并且这三个条件同时满足,那么杀毒软件就会报毒。工作原理就是找到最后一个导致报毒的标志,也就是假设的标志 C。
因此我们采用两点淘汰法来测试标记 C 所在的文件位置。由于被干掉的文件可能存在多个类似 ABC 的链式条件,因此我们必须采用淘汰机制,先找到最靠近文件前端的链式条件,排除文件末尾的数据。当找到第一个链式条件时,擦除标记 C,然后恢复尾部数据。
然后继续测试其他链式条件,直到找到最后一个链式条件。擦除后,整个文件是免疫删除的,也就是说特征码已经确定是完整的,所以所有复合特征都可以准确定位。这比文件块定位方法先进和科学得多。
该工具搜索肯定是针对二进制文件的(编译后也会检查源代码)。
我用过MYCCL(你可以自己找找使用方法),确实比手动文件分割定位方便,也能找到某些文件的特征码,不过有时候可能会出现很多...文件分割,然后...就崩溃了。
后来用了一下,感觉作者说的有道理,应该很有用。然后就试了一下,确实感觉比MYCCL先进很多,还能定位特征码,但是为什么tmd改了之后还是会报错?反正可能要折腾好久……
2)手动搜索
我在这里谈论的是针对源代码(甚至不要考虑针对二进制手动执行此操作...),方法非常简单。
屏蔽mian所有代码,编译,扫描,若无报告,则继续2,若仍有病毒报告,则转5。
释放一层(多层或者二进制划分也可以)函数exe脱壳,编译,扫描,若无报告则重复2,直到找到某个或者多个函数,转3。
阻止函数内部的某些代码(二进制除法),编译,扫描。如果没有报告,则重复步骤 2。
直到找到某一段代码(没有自定义内部调用),特性代码就在这里。
是否有其他数据或资源存储文件?如果有,请从方法 1 开始单独检查文件或数据。如果没有,则查找 PE 头。
总体流程:
1. sub1 //未报告
2. sub1 sub2 //未报告
3. sub1 sub2 sub3 //报告
4. sub1 sub2 sub3(sub31) // 未报告
5. sub1 sub2 sub3(sub31 sub32) //报告
6. sub1 sub2 sub3(sub31 sub32()) //报告
...
直到找到 API 调用或逻辑代码(无自定义函数调用)
这种方法虽然比较笨拙,但是定位特征码的速度并不慢,而且比较准确。
3.1.2. 如何避免被杀?
签名代码之前已经发现过,如何避免?
其实之前也说过了,找到签名码之后,只要改一下签名码,反杀就成功了。如果软件不需要正常运行,直接用零填充就好了……开玩笑吧?这怎么可能?所以修改签名码必须保证软件正常运行。所以也是很有讲究的。
常用的修改工具有OD、UE等。
1.手动修改
非源代码
1). 数据
如果签名代码定位到了数据(通过IDA/OD等方式确认),其实是很难修改的,稍有不慎就可能导致程序无法运行,或者影响程序的运行过程或结果。
对于字符串,如果不影响程序逻辑,可以替换大小写;如果是无关紧要的数据,可以随意替换;等等,看情况而定。
整数,如果不影响结果,则替换该值、清除为零等。
地址基本不用修改,看具体情况。
PE头数据,根据具体的PE结构,无用的数据被清除或者修改,有用的数据被适当修改。
最后,终极的修改方法就是找到访问数据的代码,直接修改代码访问数据的地址,也可以把数据放在其他地址,其实就跟修改源代码一样,但绝对没有修改源代码那么简单(见下文)。
反正签名代码位于数据位置,不容易修改(待会儿可以试试盲杀)。
2). 代码
如果通过签名定位到了代码(也通过IDA/OD等确认),那么就可以采用各种方法在不改变程序功能的情况下对其进行修改。
汇编代码等效替换,比如mov eax,0可以用xor eax,eax代替,直接结果是一样的,但是二进制代码不一样。
交换代码顺序而不影响逻辑。
移位代码块,将代码块移动到一个未使用的内存位置,并通过添加jmp addr跳转到该位置,其中addr是新的代码块地址。
源代码:
附有源代码,修改方法更灵活,更简单。
如果签名是数据,则修改数据位置、访问数据的代码位置等(类似于非源代码方法的思考)。
添加花指令是最有效也是最常用的方法,关键在于如何添加花指令。
添加数据计算代码,加、减、乘、除的各种组合。
添加字符串操作代码,添加,删除,查找,替换等。
添加多层跳转,并在跳转之间添加无效指令(不会被执行)。
添加看似有效的 API 调用,例如 ++API 等。
ETC。
2.免工具查杀(免盲查杀)
如果你找不到有效的签名代码或者修改起来比较困难,可以尝试此方法。
资源操作:
1). 添加资源
对文件进行资源操作,找到多个正常的软件,并把他们的资源添加到自己的软件中,比如图片,版本信息,对话框等。
2). 替换资源
用于替换未使用的资源(等等)。
3). 添加签名
使用签名伪造工具将普通软件的签名信息添加到自己的软件中。
几种方法可以交替重复、联合使用。
PE操作:
1).PE优化
使用PE优化工具对文件进行优化,删除0,优化PE头,附加数据等。
2). 添加部分
增加区段数据,随意添加无效数据。
包装者:
加壳可以简单理解为:解密器/解压器+加密器/压缩器(原始代码)。
通过加密器/压缩器对原始代码进行加密压缩,隐藏其特征性代码变化,再由解密器/解压器组装到文件中,运行时先运行解密器/解压器对加密压缩的内容进行解密解压,然后原始代码继续运行。
1). 增加冷门壳
壳也是有特点的,知名的壳都已经被分析了很多,杀毒软件基本都能检测出这一类壳,或者自动脱壳然后检测杀毒。
因此在添加小众壳的时候,不分析壳特征,不能自动脱壳,可以更好的隐藏原始代码,达到反查杀的效果。
2). 添加或修改shell
修改常用的shell,改变shell特性,也会使防病毒软件失效。
比如修改词条、修改部分信息、移位词条代码等。
可以类比于一个无shell的程序,上面介绍的方法都可以使用。
3.2 其次,避免被发现的行为动态
现在的杀毒软件主要有拦截、提示恶意行为的防御功能。
例如,这些行为:
注册表操作、添加启动项、添加服务、写入文件、读取系统文件、删除文件、移动文件
终止进程,创建进程,注入,劫持等。
3.2.1 行为拦截原理
说白了,恶意行为就是通过API调用来完成的,这些API可能是单个API,也可能是多个API的组合。
杀毒软件通过技术手段拦截这些API调用,并通过策略来判断是否是恶意行为。
关键点:
API
策略(订单、调用来源、参数等)
所以下面的方法就是针对这两点来下功夫。
3.2.2 如何避免通过行为杀生?
下面介绍的方法对于非源代码和源代码都是有效的,但是修改非源代码非常麻烦......
1). 替换API
使用相同的API来替换它。杀毒软件无法阻止所有API,所以这种方法仍然有效。
2). API 未导出
找到具有相同功能的未导出API并替换。杀毒软件通常会拦截导出的API或低级调用。找到未导出的API有一定的效果。
通过分析目标API的内部调用,找到一个或多个内部未导出的API,找到实现相同功能的方法。
3). 重写API
完全重写系统API函数(通过逆向工程),实现自己对应的功能API,对于ring3行为拦截非常有效。例如实现等。
4).api+5
Ring3的API拦截是通过hook API的前几个字节,然后进入杀毒软件自身的函数进行参数检查等操作。
然后,如果你在调用API时跳过标头中的几个字节,就可以避免这种拦截方法。
__API:
1 推送ebp;
2.移动ebp, esp;
3 mov edi,edi;
4 ...
调用的时候并没有使用地址1,而是使用了地址4,然后在函数本身内部恢复跳过几个字节的调用。
:
推送ebp;
mov ebp, esp;
mov edi,edi;
呼叫 4
5). 低级API
这种方法和2、3类似,防病毒拦截API可能级别更高(语义更清晰),因此可以找到级别较低的API来调用,绕过拦截,比如使用NT函数。
或者通过调用驱动函数完成API功能。
模拟系统调用。
6).合理替换调用顺序
有时候拦截行为是通过多个API组合完成的,因此可以合理地换掉顺序,既可以绕过杀毒软件的拦截策略,也可以绕过行为拦截。
比如先创建服务,然后复制服务相应的文件。
7). 绕过呼叫源
API函数是通过调用其他函数来完成的。例如通过.exe加载dll,通过COM操作文件等。
概括:
方法就大致总结到这里,要想更好的实现反杀,还需要各种方法合理灵活地组合,或者还需要探索更多的方法。
4. 反杀示例
实验主机:虚拟机
操作系统:XP sp3
实验工具:MyCCL 2.1、病毒样本(.exe)、百度杀毒、360杀毒
实战开始:
第一步,关闭杀毒软件的实时保护功能,避免其自动查杀我们实验中的样本,然后点击设置:
第二步,使用杀毒软件检查病毒样本:
肯定没问题。
步骤3:打开MyCCL,按照上一篇文章提到的方法,在“文件”中选择病毒样本,在“目录”中选择存放拦截文件的目录,设置拦截个数(我设置成20),设置如下图:
步骤4:点击,在弹出的双击框中选择‘是’,生成完成。然后打开块文件目录:
确认块文件生成成功。
然后第五步:使用配置好的360杀毒查杀所有拦截文件:
步骤6:手动删除病毒报告文件,然后点击“不立即处理”,而不是“立即处理”。因为只有删除它,MyCCL 才能找到签名代码。
接下来就可以点击“二次加工”按钮了,二次加工完成后再检查一下:
如果没毒就不用继续查杀,如果有毒就会出现“查杀->二次处理->查杀...”的反复循环现在点击特征区间看看:
这里的格式是:第一部分是十六进制的文件偏移量,第二部分是特征码的十进制长度。我们第一次定位到的特征码有4041字节!这么大的范围,肯定是不能直接修改的,所以需要进行“复合定位”!
第七步:在特征间隔行中,右键 -> Here。然后情况和开始类似,但是范围缩小了:
我们重复刚才的步骤:“生成 -> 检测删除 -> 二次处理 -> 检测删除 -> 二次处理……”,就能得到一个范围更小的特征码,一般重复四次以内就能得到一个2字节的特征码,就可以对特征码进行修改了。
经过反复定位,我们最终得到了特征码的间隔,再次点击“二次处理”,就可以生成定位图了:
签名代码的物理地址/物理长度如下:
[特征]
特征码分布示意图:
[-------------------------------------------------]
[-------------------------------------------------]
[-------------------------------------------------]
[-------------------------------------------------]
[--------------------------------夫人-----------------]
这时候我们就可以查看签名代码是什么样的了,我们用的是这个工具,百度一搜就有安全的下载地址,通过这个工具我们可以很方便的查看和修改文件内容,它有“静态反汇编”的功能,所以修改签名代码还是很方便的。
第八步:我们打开它,并将病毒样本(不是拦截文件)拖进去:
第九步:我们点击“十六进制模式”,这个模式比较灵活,所以推荐使用。打开之后,你会看到一堆十六进制的代码。别慌,我们先跳转到特征代码的位置吧!右键->跳转到:
第十步:填入刚刚定位到的特征码的位置,点击“确定”:
看完这一段,熟悉病毒特征的朋友应该可以看出,这是病毒本身的一部分,而这些函数正是病毒会用到的功能。
“E9 7A”被标识为特征代码。其实熟悉的人应该已经知道如何更改它了,因为“E9”是jmp跳转的典型机器码。
第十一步:右键->相应汇编模式下的编辑,就可以看到相应的汇编代码:
很显然,这段代码的意思是跳转到某个地址。这里我们先介绍一种方法——等效替换法,也就是用功能相同的代码替换掉。对于jmp,根据经验,可以改为call,也就是把“E9”改成“E8”。
步骤12:在这里我们右键单击->组装:
这里我们需要把JMP改成CALL,点击“”,就完成了:
最后:我们点击“文件”—>“保存”,然后退出,然后用360杀毒进行扫描:
我们成功避杀了!现在360本地引擎已经检测不到该病毒了,我们可以用同样的原理完成对BD引擎和Avira引擎的查杀。
注:以上文章仅建议大家了解一下这项技术,切勿利用这项技术去做任何违背道德和法律的事情!!!
阴阳师4月22日更新内容:帝释天上线技能调整,红莲华冕活动来袭[多图],阴阳师4月22日更新的内容有哪些?版本更新
2024-06-05四川电视台经济频道如何培养孩子的学习习惯与方法直播在哪看?直播视频回放地址[多图],2021四川电视台经济频
2024-06-05湖北电视台生活频道如何培养孩子的学习兴趣直播回放在哪看?直播视频回放地址入口[多图],湖北电视台生活频道
2024-06-05