当前位置:编程学习 > 网站相关 >>

AutoRun.INF类型病毒的主动防御工具编写

文/ 黑黑的菜
现在U盘病毒遍地都是,经常在陌生地点上插一下U盘就将病毒也给带来了,很是苦恼,而且病毒的隐蔽性也是越做越好了,有些甚至会将病毒体隐藏到的回收站里。不过,这类病毒再狡猾也有个特点,就是一定会有autorun.inf文件。不管它是加了什么系统属性、隐藏属性也好,该文件是一定存在的!打个比喻,它就好似通向病毒的桥梁,如果我们把它桥梁拆了,就算病毒还在U盘内也会因为无法触发而不具杀伤力。所以,我们就可以根据这个通性来制作一款简单的主动防御工具。
为了令文件小巧并且运行快速,还是用汇编语言制作比较适合。
下面直接切入正题,首先从C盘累加1循环到Z盘,检测盘符类型,如果是可移动磁盘就将变量值存起来。实现代码如下。
 
.data
szVol       db C,0
.const
szM db :,0
szXie      db ,0
szBD       db autorun.inf,0
;szBT      db 警告!,0
;szNR      db 可移动磁盘内发现Autorun.inf,0

_GetDiskType proc
local szDisk[10]:byte
.while szVol<=Y   ;当盘符小于Y
invoke RtlZeroMemory,addr szDisk,sizeof szDisk       ;清空缓冲区szDisk
invoke lstrcat,addr szDisk,addr szVol;盘符赋值给szDisk
invoke lstrcat,addr szDisk,addr szM;盘符后加上:
invoke lstrcat,addr szDisk,addr szXie;盘符后加上
invoke GetDriveType,addr szDisk ;获取盘符类型
.if eax==DRIVE_REMOVABLE   ;判断是否属于可移动磁盘
invoke _FindFile,addr szDisk;执行查找的子程序
.endif
inc szVol ;盘符值+1
.endw
ret
_GetDiskType endp

这个子程序的返回值就是类似于“X:”的形式了。然后我们再为它加上autorun.inf的文件名后进行查找,如果发现存在就将它删除掉(如果愿意还可以加上弹框提醒功能,因为或许有些是正常的)。实现代码如下。
 
FindFile proc szPath
LOCAL @hFindFile;句柄
LOCAL @stFindFile:WIN32_FIND_DATA;WIN32_FIND_DATA结构
LOCAL @szSearch[MAX_PATH]:BYTE;存放要查找的“盘符:”找到的文件名
invoke RtlZeroMemory,addr @szSearch,sizeof @szSearch;清空缓冲区
pushad
invoke lstrcpy,addr @szSearch,szPath;由参数传入要查找的“盘符:”
invoke lstrcat,addr @szSearch,addr szBD;将要查找的“盘符:”加上Autorun.inf
invoke FindFirstFile,addr @szSearch,addr @stFindFile;参数1:查找的文件字符串;参数2:指向WIN32_FIND_DATA结构缓冲区
.if eax!=INVALID_HANDLE_VALUE
mov @hFindFile,eax
.repeat
;invoke MessageBox,NULL,addr szNR,addr szBT,MB_YESNO
invoke SetFileAttributes,addr @szSearch,FILE_ATTRIBUTE_SYSTEM;先设置去除系统属性,防止该文件被加了系统属性无法删除
invoke DeleteFile,addr @szSearch;删除autorun.inf文件
invoke FindNextFile,@hFindFile,addr @stFindFile;参数1:第一次查找返回的句柄;参数2:指向WIN32_FIND_DATA结构缓冲区
.until eax==FALSE
invoke FindClose,@hFindFile
.endif
popad
ret
_FindFile endp

两个子程序写完后就可以写入口点,调用子程序了,然后再延时3秒后为盘符复位到C,以便再次循环检测。
 
start:
Get:
call _GetDiskType
invoke Sleep,3000
mov szVol,C ;盘符值复位为C后继续循环检测
jmp Get
ret
invoke ExitProcess,NULL
end start

编译后试一下,文件大小只有2.5K,实在是小的无敌了,而且占用内存只要524K就够了,哈哈,汇编做的程序就是有这个优势!另外,本程序没有制作界面,因为我觉得没有什么必要,如果要结束程序就直接杀死进程好了

补充:综合编程 , 安全编程 ,
CopyRight © 2022 站长资源库 编程知识问答 zzzyk.com All Rights Reserved
部分文章来自网络,