首页
社区
课程
招聘
WinXP SP2对病毒和加密技术的影响研究(zz)
发表于: 2004-10-22 17:11 4070

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

2004-10-22 17:11
4070
WinXP SP2对病毒和加密技术的影响研究

转贴自 https://www.xfocus.net/bbs/index.php?act=ST&f=2&t=42056

Killer   (killer_暧特_uid0.net)

Windows XP SP2的出现,使得一些软件已经无法在XP2 上运行了。早在早些时候微软就提醒软件开发商,Windows XP SP2不同于以往的补丁程序或普通升级。在SP2 中,微软更多地关注如何增强系统的安全性。微软当时还警告说,这次升级将放弃某些具有安全缺陷且无法修正的应用。尽管WinXP SP2 微软说如何如何,在我们看来,微软还有一个目的就是防止盗版。抛开这些不说,拨开WinXP SP2 的层层迷雾,我们还是看到了一些新东西,这就是可执行文件的数据段防执行(DEP, Data Execution Prevention)机制。今年上半年,微软与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
; 编译方式:\MASM32\BIN\Link.exe /SECTION:.text,RWE /SUBSYSTEM:WINDOWS Test.obj
; #########################################################################
;     include files
;     ~~~~~~~~~~~~~
      include \masm32\include\windows.inc
      include \masm32\include\kernel32.inc
      include \masm32\include\user32.inc
;     libraries
;     ~~~~~~~~~
      includelib \masm32\lib\kernel32.lib
      includelib \masm32\lib\user32.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 \masm32\include\windows.inc
    include \masm32\include\kernel32.inc
;     libraries
;     ~~~~~~~~~
includelib \masm32\lib\kernel32.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 \masm32\include\windows.inc
      include \masm32\include\kernel32.inc
      include \masm32\include\user32.inc
;     libraries
;     ~~~~~~~~~
      includelib \masm32\lib\kernel32.lib
      includelib \masm32\lib\user32.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的大力帮助和技术指点!以及您的阅读评论。

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

收藏
免费 1
支持
分享
最新回复 (2)
雪    币: 204
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
附件:killer.rar

附件中包括完整文档、图片已经编译后的测试程序

转自
https://www.xfocus.net/bbs/index.php?act=ST&f=2&t=42056
2004-10-22 17:14
0
雪    币: 339
活跃值: (1510)
能力值: ( LV13,RANK:970 )
在线值:
发帖
回帖
粉丝
3
非常不错的代码。

但是这些变化并不能阻止病毒技术和加壳技术的发展,反而可以促进。当初M$发布win95的时候,号称可以完全防治病毒,原因只不过是为每个进程设定单独的空间,但是不久后出来的ring 0技术让微软到现在也不敢提当初的豪言。

象那些所谓的代码段不可写之类的也类似,不是不可写,只不过利用传统的技术不容易写罢了。代码段是否可写首先取决于OS的判断,加壳软件或者病毒代码完全可以采用方法让.code看起来象.data,当执行到必须状态时候,再恢复成.code。就算这样还不行,总有办法进入ring 0的,毕竟cpu不是微软的。

这些东西的出现,对攻防都是一种挑战,也是一种促进,但是最终收害的还是用户,因为用户机器上多了那么多没有实际意义的“防毒措施”。

个人之见而已。
2004-10-22 19:47
0
游客
登录 | 注册 方可回帖
返回
//