原文出处:
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的大力帮助和技术指点!以及您的阅读评论。
[注意]传递专业知识、拓宽行业人脉——看雪讲师团队等你加入!