WinXP SP2对病毒和加密技术的影响研究

今年上半年,微软与AMD曾联合宣布,WindowsXP SP2补丁将开启AMD64处理器中的Enhanced Virus Protection(增强病毒防护)技术。并称:“AMD的Enhanced Virus Protection安全技术将与微软SP2中的Data Execution Prevention技术相结合,可以监测出已知的病毒,尤其对那些缓冲区溢出病毒以及传播速度快的病毒有很好的抑制效果。”而AMD Enhanced Virus Protection技术是通过在转换物理地址和逻辑地址的“page translation table”中增加新的比特位(NX bit)来实现,Intel也表示未来Itanium和Itanium 2也会集成该技术。
下面我们就几种非正常的代码执行方式加以简述:

1、代码段改写:
以往的病毒、加壳软件多数利用代码段的可写特性进行一些反跟踪、代码加密操作。加壳软件在给目标加壳后,会有加壳软件对目标文件的代码段进行改写,达到的replace code功能,造成壳与目标文件一体的效果。
2、数据段执行:
以往的病毒、加壳软件多数利用数据段执行的办法来进行一些特殊操作。
3、堆栈段执行:
使用了缓冲区溢出的shellcode都是在利用这一特性。
以上的示例程序Masm32源代码及编译后程序在本文后面提供。经测试,在DEP打开的SP2正式版中,运行堆栈段执行演示代码时,系统弹出DEP提示,如图1所示。
(图1) 堆栈段执行演示代码在SP2 上无法正常运行的错误提示
而微软的DEP技术将使得大多数自解密、采用加密壳的病毒蠕虫将无法在WinXP SP2 上运行和发作。许多采用商业加密手段的工具也将无法正常执行使用,图1 就是著名的商业Sniffer 工具IRIS 4.0版本在SP2 上无法正常运行的报错提示,经过检查得知它是通过一款商业保护工具PCGUARD 4.x 进行的加密保护,我们在脱掉这个加密壳后软件得以正常执行。
(图2) IRIS 4.0版本在SP2 上无法正常运行的报错提示
WinXP SP2在初期DEP保护力度很大,兼容性也不另人满意,其多数保护开关都是默认打开,这使得众多应用程序难以执行。后来微软进行了改进,正式版中的DEP默认为关闭,而且兼容性有了很大的改进。用户可以在系统属性中手工确认是否开启DEP及针对何种程序进行DEP,如图3所示。
(图2) WinXP SP2数据执行保护设置界面

 现将本人手中目前可在WinXP SP2正常使用的常用加壳工具整理如表1所示,以方便大家使用。
加壳工具    版本
upx    0.81+
aspack    1.83+
fsg    1.33+
telock    0.92+
pe pack    1.0+
ezip    1.x+
dxpack     0.86+
asprotect    1.23rc1+
(表1)可在WinXP SP2正常使用的常用加壳工具
  
代码示例:
1、    代码段可写:

; #########################################################################
      .386                              ; create 32 bit code
      .model flat, stdcall           ; 32 bit memory model
      option casemap :none           ; case sensitive
; 编译方式:MASM32BINLink.exe /SECTION:.text,RWE /SUBSYSTEM:WINDOWS Test.obj
; #########################################################################
;     include files
;     ~~~~~~~~~~~~~
      include masm32includewindows.inc
      include masm32includekernel32.inc
      include masm32includeuser32.inc
;     libraries
;     ~~~~~~~~~
      includelib masm32libkernel32.lib
      includelib masm32libuser32.lib
.code
; ########################################################################
start:
        jmp @F
    TestWrite db 0
    @@:
mov TestWrite, 1 ; 未使用指定编译方式,此处将抛出访问异常
        .if (TestWrite == 1)
          jmp @F
        szMsg db '代码段已被改写!', 0
        @@:
    invoke MessageBox, NULL, ADDR szMsg ,NULL, MB_OK
    ret
end start
; ########################################################################
2、    数据段可执行:

; #########################################################################
      .386                         ; create 32 bit code
      .model flat, stdcall      ; 32 bit memory model
      option casemap :none      ; case sensitive
; 由于MASM32不支持在数据段使用call、jmp、lea等指令,这里完全使用push、ret实现。
; #########################################################################
;     include files
;     ~~~~~~~~~~~~~
    include masm32includewindows.inc
    include masm32includekernel32.inc
;     libraries
;     ~~~~~~~~~
includelib masm32libkernel32.lib
; ########################################################################
.data
    TestExecute dd $ + 4
    push MB_OK
    push NULL
    push lblMSG
    push @F
    ret
    lblMSG dd szMSG
    szMSG  db '数据段已被执行!', 0
    @@:
    push NULL
    push @F
    push MessageBox
@@:
    ret
.code
; ########################################################################
start:
    push @F
    jmp TestExecute
@@:
    ret
end start
; ########################################################################
3、    堆栈段可执行:

; #########################################################################
      .386                              ; create 32 bit code
      .model flat, stdcall           ; 32 bit memory model
      option casemap :none           ; case sensitive
; #########################################################################
;     include files
;     ~~~~~~~~~~~~~
      include masm32includewindows.inc
      include masm32includekernel32.inc
      include masm32includeuser32.inc
;     libraries
;     ~~~~~~~~~
      includelib masm32libkernel32.lib
      includelib masm32libuser32.lib
.data
    TestExecute dd $ + 4
    push MB_OK
    push NULL
    push lblMSG
    push @F
    ret
    lblMSG dd szMSG
    szMSG  db '堆栈段已被执行', 0
    @@:
    push NULL
    push @F
    push MessageBox
@@:
    ret
    ExecuteSize equ $ - TestExecute
.code
start:
    push esp
    mov ebp, esp
    sub esp, ExecuteSize
    mov esi , TestExecute
    mov ecx , ExecuteSize
    mov edi , esp
    rep movsb
    call esp
    mov esp, ebp
    pop ebp
    ret
end start


特别感谢Swordlea的大力帮助和技术指点!以及您的阅读评论。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值