1 杀毒软件辨认病毒的原理是什么?
每一家安全公司的检测和匹配方式都不相同,常见的有传统的特征码匹配、静态动态启发等技术,关于火绒的反病毒引擎更详细的内容可以参考以下文档:
火绒反病毒扫描引擎:技术白皮书 http://bbs.huorong.cn/thread-18372-1-1.html 火绒反病毒扫描引擎:虚拟沙盘技术简介 http://bbs.huorong.cn/thread-18373-1-1.html 火绒反病毒扫描引擎:“脚本行为沙盒”简介 http://bbs.huorong.cn/thread-19546-1-1.html
2 为什么我写的.exe会被认为是病毒呢?
1.安全软件厂商的误报
如果程序本身没有包含恶意代码或有类似病毒的行为,安全软件报毒了那就是误报,原因是安全软件对病毒“特征”提取有误导致,这应该是极少发生的情况。
但是,近些年某些安全软件的误报非常常见,其主要原因还是因为安全公司在反病毒引擎等关键技术上缺少积累和研究,短时间内为了更高的检测率和更快响应速度,盲目依赖大数据和“人工智能“,牺牲了检测质量,导致的误报增多。
举例说明导致误报增多的可能原因:
1)盲目依赖大数据和“人工智能“,带来的误报
以加壳为例,在此之前,我们先了解一下“壳”与“病毒混淆器”:
早期的“壳”通常以压缩目标程序为目的,随着软件知识产权意识的萌发,以保护程序代码及数据为目的的“壳”应运而生。这些“压缩壳”、“加密壳”和“保护壳”由于加壳程序公开(免费或收费),所以安全工程师可以对”加壳“的过程和结果进行分析,从而通过代码识别程序是否被“加壳”、加了何种“壳”,进而“脱壳”,并可以将这种“脱壳”逻辑嵌入到反病毒引擎的扫描逻辑中,在一定程度上“解决”了“壳”的对抗。 近10年,很多病毒作者通过“壳”和感染型病毒常用的多态、变形等技术编写非公开的“私有壳”对病毒代码进行保护,这类“壳”往往不仅包括上述公开“保护壳”的功能,并且外层的“壳”代码还会通过各种手段干扰、误导、对抗反病毒引擎的识别,安全领域为此类“壳”起了个更为“高大上”的名字:“病毒混淆器”,其比较典型的混淆手段就包括代码变形、入口伪装……
如果没有有效的反病毒引擎作支撑,只是利用大数据和“人工智能“作判断。那么安全软件只能通过文件的外层特征,猜测其内容是否为病毒,直接导致了因为无法分辨正常加壳软件和病毒混淆器而导致误报率上升。
总结来说:在计算机学习鉴别病毒时,特征是否有价值十分重要。“有价值的特征” ”好的算法“才能发挥作用。但一些安全软件为了更快的响应速度、更高的检测率,只提取到了被“混淆”的“特征,则会牺牲检测质量,产生误报。
也正因为是上面的原因,才会在“坊间"流传有加壳误报这种说法。其实使用正常加密工具保护自己软件的知识产权,和病毒使用“混淆器”加密了免杀是不一样的。在火绒的这篇报告中对病毒混淆器有详细说明:
代码战争:伪装和狙杀——从“壳”到“病毒混淆器”-火绒安全软件4.0-专注、纯粹,才能更安全 http://www.huorong.cn/info/147210475737.html
而火绒自带的反病毒引擎可以通过“通用脱壳”技术,无视代码变形,戳穿外层“伪装”成正常编译器的病毒,直接对原始内容进行检测,从而极大的减少误报。
2)宽泛的病毒定义加白名单的“滥用”,带来的误报
有的时候为了高检测率,某些安全厂商会选择添加一些非常宽泛的病毒定义,再使用白名单作排除。在这种情况下,误报的原因不在开发者使用了什么加密工具和开发工具(比如易语言),而是安全厂商的检测机制存在问题,没有收录的软件都面临被误报的可能,即使现在没有误报,也不排除将来不会因为安全厂商为了提高检测率而被误报。
2.软件作者的开发环境存在病毒
1)程序员的开发环境存在感染型病毒,即使软件本身的代码没有问题,但是编译出来的程序如果被感染,也会携带病 毒代码。
2)程序员使用的开发库如果染毒,引入这个库的程序也会存在恶意代码。
举例:Virus/Induc,该病毒通过感染Delphi库文件中的SysConst.dcu文件,在使用被感染的Delphi库生成的文件都会携带病毒代码。
3)程序员使用的开发工具染毒或者引入包含恶意代码的第三方库,则编译的程序也会携带病毒。
举例:2015年的XcodeGhost,开发工具染毒导致开发出的APP带毒。
当然这种情况还是很少见的:)
3 自己的程序发给别人用,如何避免被杀毒软件杀了?
直接上报给安全软件公司,自己不用做任何测试,也不用去想怎么避免。误报了就直接找安全软件公司反馈问题,反馈的时候最好提供误报文件和报毒日志,如果安全公司确认是误报了,那就是他们的工作失误,不但会在第一时间解决并且还会感谢你。
关于“添加数字签名或放入白名单”,以及“修改后缀、加密压缩传输”
小编不同意Shotgun的答案中提到的“添加数字签名或放入白名单”,以及“修改后缀、加密压缩传输”两种方法。这两种方法都不能解决实际问题。
1.“添加数字签名或放入白名单”
是否是病毒和数字签名无关。添加数字签名无法解决题主的问题,病毒就是病毒,有数字签名也不能使安全软件不报毒。
其次是将报毒文件加入白名单。如果是加入安全软件的本地白名单,无法避免他人使用时继续报毒。如果是安全厂商因为误报了你的程序,要求你的软件加入它的白名单,这就是在用错误的方法掩饰他们的误报。误报就是误报,如果安全厂商不去积极修改自己的错误,反而要求开发者使用其他方式帮他们解决误报。也许有一天写一个“HelloWorld”程序,都会被检测为病毒。
2.“修改后缀、加密压缩传输”
是否是病毒和文件后缀名无关。加密压缩传输就算可以暂时不被安全软件报毒,但是解压之后依然会被检测为病毒。
上面这两种方法都是治标不治本,看似解决了问题,但事实上使用者还是存在安全软件报毒问题。这就导致了——很多安装包“提示”下载者安装时关闭或忽略安全软件。此时如果是上文所说的开发环境染毒情况,那这样的做就会使安全软件的防护失去意义,电脑面临中毒的风险。
火绒希望软件作者在遇到安全软件误报自己软件的时候,及时和安全厂商沟通,从根本上解决问题。
在这里,也呼吁大家,不要轻易的关闭、忽略甚至删除安全软件。只要是没有病毒行为,没有包含恶意代码,安全软件就不会报毒。如果是安全软件的误报,无论是上述提到的哪一种情况,最应该做的不是避开问题,而是上报给安全公司沟通解决。这样对于安全公司来说也是完善自身,更好的为用户服务的过程。