加入收藏 | 设为首页 | 会员中心 | 我要投稿 威海站长网 (https://www.0631zz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 运营中心 > 建站资源 > 策划 > 正文

“黑客”深度学习之“免杀技术原理与实现”

发布时间:2019-03-12 22:43:21 所属栏目:策划 来源:信息安全我来讲你来听
导读:杀毒和免杀矛与盾的两者,对于黑客来说两者都应该学习,做到知己知彼才能达到真正的王者,今天就以本篇文章给大家分享一下免杀的技术原理与实现过程。 一、 杀软是如何检测出恶意代码的? 1. 检测特征码 人有自己的特征,代码也有自己的特征。杀毒软件都有
副标题[/!--empirenews.page--]

"杀毒"和"免杀"矛与盾的两者,对于黑客来说两者都应该学习,做到知己知彼才能达到真正的"王者",今天就以本篇文章给大家分享一下"免杀的技术原理与实现过程"。

一、 杀软是如何检测出恶意代码的?

“黑客”深度学习之“免杀技术原理与实现”

1. 检测特征码

人有自己的特征,代码也有自己的特征。杀毒软件都有着一套特征库,依靠检索程序代码是否和库中特征码是否吻合来判断某段代码是否属于病毒。

2. 启发式恶意软件检测

如果该程序的特征和行为与病毒程序类似,其匹配程度达到一定值就可以认为该程序是病毒程序。

3. 基于行为检测

与启发式检测类似,只是单纯依靠监测程序行为来作为标准。通过监视恶意代码运行过程,如利用系统监视工具观察恶意代码运行过程时系统环境的变化,或通过跟踪恶意代码执行过程使用的系统函数和指令特征分析恶意代码功能,如出现恶意行为,则属于恶意代码。

二、 免杀是什么?

顾名思义,免杀就是使得恶意软件不被杀毒软件查杀,二者能够共存。

免杀大概可以分为两种情况:

  • 二进制的免杀(无源码),只能通过通过修改asm代码/二进制数据/其他数据来完成免杀。
  • 有源码的免杀,可以通过修改源代码来完成免杀,也可以结合二进制免杀的技术。

免杀也可以分为这两种情况:

  • 静态文件免杀,被杀毒软件病毒库/云查杀了,也就是文件特征码在病毒库了。免杀方式可能是上面的两种方式,看情况。
  • 动态行为免杀,运行中执行的某些行为被杀毒软件拦截报读。行为免杀如果没有源码就不是很好搞了。

三、免杀的技术实现方法与流程

(一) 首先静态免杀技术流程:

对于静态免杀,针对的是杀毒软件的静态文件扫描,云查(病毒库)杀。

1. 怎么找特征码

(1) 工具查找

常见的特征码定位工具有CCL、MYCCL。工具大致原理就是分割文件,某些分割部分填入数据(0),如果扫描该部分不报警,则特征码在这个部分。如此反复,直到找到很短的某一段内容。不同工具之前局别是使用的分割算法不同,查找特征码的效果不同。

目前比较常有名气的特征码定位器主要有CCL与MYCCL,他们都采用文件分块定位的办法,定位效果带有运气成份,且可能每次定位出的位置都不尽相同,这个免杀带来了困难。

后来出来了一款新的特征码定位软件VirTest。下面是作者自己的介绍:

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

因此VIRTEST采用2分排除法,测试标志C所在文件中的位置,由于被杀的文件可能存在多个 类似于ABC这样的连锁条件,所以我们必须要通过一种排除机制,先要找最靠近文件前部的连锁条件,排除掉文件尾部数据,当找到第一个连锁条件后,抹掉引标志C,再恢复尾部数据,

然后继续测试另外的连锁条件,直到找到最后一个连锁条件,抹掉后,整个文件免杀了,则说明特征代码被定为完毕了,所以VIRTEST绝对可以精确的定位出所有的复合特征。这比文件分块定位法先进得多,更为科学。

工具查找肯定是针对二进制文件(有源码的也编译后在检查)。

具体用过MYCCL(使用方法自行查找),确实比手工分割文件定位方便,也可以找到某些文件的特征码,但是有些时候可能会出现非常多非常多...的被杀文件分割,然后...崩溃了。

后来也用了virtest,感觉作者说的挺有道理,应该挺好用吧。然后试了试,确实感觉比MYCCL高大上多了,也可以定位到特征码,但是tmd改了之后怎么还是报呢,反正你可能会折腾很久...

(2) 手工查找

这里说的是针对有源码的(二进制就别想手工了...),方法非常简单。

mian中屏蔽所有代码,编译,扫描。不报的话继续2,如果依然报毒,去5。

放开一层(可以多层、二分也可以)函数,编译,扫描。不报的话,重复2。直到定位到某个函数或者多个函数,进入3。

在函数内部屏蔽部分代码(二分),编译,扫描。不报,重复2。

直到定位某段代码(无自定义内部调用),特征码在此。

是不是有附加数据,或者资源存储的文件。有,单独检查该文件或者数据,方法从1开始。如果没有,那去找找PE头吧。

大致流程:

  • sub1 //未报
  • sub1 sub2 //未报
  • sub1 sub2 sub3 //报
  • sub1 sub2 sub3(sub31) //未报
  • sub1 sub2 sub3(sub31 sub32) //报
  • sub1 sub2 sub3(sub31 sub32(sub321)) //报
  • ...

直到找到某API调用,或者逻辑代码(没有自定义函数调用)

此方法,虽然笨,但是定位特征码不会很慢,挺准确。

2. 怎么免杀?

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

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

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

(1) 手工修改

非源码:

  • 数据

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

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

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

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

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

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

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

  • 代码

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

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

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

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

源码:

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

(编辑:威海站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读