无忧启动论坛

 找回密码
 注册
搜索
系统gho:最纯净好用系统下载站投放广告、加入VIP会员,请联系 微信:wuyouceo
查看: 5666|回复: 11
打印 上一主题 下一主题

批处理删除autorun.inf自动运行病毒

[复制链接]
跳转到指定楼层
1#
发表于 2010-5-10 10:19:52 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
AutoRun.inf 命令与功能详解


这是我从网络间DOWN到的一篇文章,而后经过了一定整理,为的是便于阅读和查找。此文非我原创,但的确是个很需要收藏的资料,希望对大家也有用。
----------------------------------------------------------------------------
autorun.inf是什么呢?
 
autorun.inf文件是从Windows95开始的,最初用在其安装盘里,实现自动安装,以后的各版本都保留了该文件并且部分内容也可用于其他存储设备。


其结构有三个部分:[AutoRun]、[AutoRun.Alpha]、[DeviceInstall]
[AutoRun]适用于Windows95以上系统与32位以上CD-ROM,必选。
[AutoRun.alpha]适用于基于RISC的计算机光驱,适用系统为Windows NT 4.0,可选。
[DeviceInstall]适用于Windows XP以上系统,可选。

[AutoRun]部分的命令及其详解

1、DefaultIcon
含义:指定应用程序的默认图标。
格式:DefalutIcon=图标路径名[,序号]
参数:
(1)图标文件名:应用程序的默认图标路径名,格式可以为.ico、.bmp、.exe、.dll。当文件格式为.exe和.dll时,有时需要使用序号来指定图标。
(2)序号:当文件格式为.exe和.dll时,文件可能包括多余一个图标,此时需要使用序号来指定图标,需要注意的是,序号是从0开始的。
备注:
(1)应用程序的默认图标将在windows explorer核心的驱动显示窗口中替代设备的默认图标来显示。
(2)图标路径名的默认目录是设备根目录。

2、Icon
含义:指定设备显示图标。
格式:Icon=图标路径名[,序号]
参数:
(1)图标文件名:应用程序的默认图标路径名,格式可以为.ico、.bmp、.exe、.dll。当文件格式为.exe和.dll时,有时需要使用序号来指定图标。
(2)序号:当文件格式为.exe和.dll时,文件可能包括多余一个图标,此时需要使用序号来指定图标,需要注意的是,序号是从0开始的。
备注:
(1)设备显示图标将在windows explorer核心的驱动显示窗口中替代设备的默认图标来显示。
(2)图标路径名的默认目录是设备根目录。
(3)当存在应用程序默认图标(DefaultIcon)时,本命令无效。
  
3、Label
含义:指定设备描述
格式:Label=描述
参数:
(1)描述:任意文字,可以包括空格。
备注:
(1)设备描述将在windows explorer核心的驱动显示窗口中替代设备的默认描述卷标来显示。
(2)在非windows explorer核心的驱动显示窗口中(例如右击设备选择属性)显示的仍然是设备的卷标。
4、Open
含义:指定设备启用时运行之命令行。
格式:Open=命令行 (命令行:程序路径名[参数])
参数:
(1)命令行:自动运行的命令行,必须是.exe、.com、.bat文件,其他格式文件可以使用start.exe打开或使用ShellExecute命令。
备注:
(1)命令行的起始目录是设备根目录和系统的$Path环境变量。
5、ShellExecute
含义:指定设备启用时执行文件。(操作系统支持未知)
格式:ShellExecute=执行文件路径名 [参数]
参数:
(1)执行文件路径名:设备启用时执行文件路径名。可以是任意格式文件。系统会调用设置的程序执行此文件。
(2)参数:参数,根据执行文件作调整
备注:
(1)命令行的起始目录是设备根目录和系统的$Path环境变量。
  
6、Shell/关键字/Command
含义:定义设备右键菜单执行命令行。
格式:Shell/关键字/Command=命令行 (命令行:程序路径名[参数])
参数:
(1)命令行:自动运行的命令行,必须是.exe、.com、.bat文件,其他格式文件可以使用start.exe打开。
备注:
(1)命令行的起始目录是设备根目录和系统的$Path环境变量。
  
7、Shell/关键字
含义:定义设备右键菜单文本。
格式:Shell/关键字=文本
参数:
(1)关键字:用以标记菜单,可以使用任何字符表示,包括空格。
(2)文本:在右键菜单中显示的文本。可以使用任何字符,不能存在空格。
备注:
(1)在同一Autorun.inf文件中,不同右键菜单关键字不同,相同右键菜单关键字相同。
(2)右键菜单文本中可以使用&设定加速键,&&输出一个&。
(3)Shell关键字Command命令Shell关键字两者缺一不可,顺序无所谓。
(4)当不存在Open、ShellExecute与Shell命令时,设备启用时运行第一个设备右键菜单指定命令。
  
8、Shell
含义:定义设备启用时运行之设备右键命令。
格式:Shell=关键字
参数:
(1)关键字:标记过的菜单关键字
备注:
(1)Shell指定的关键字可以在AutoRun.inf文件的任意部分。
(2)OpenShellExecuteShell命令后定义的优先级高。
  
[AutoRun.alpha]部分的命令简介
[AutoRun.alpha]部分的命令与[AutoRun]部分的命令相同,只不过在基于RISC的计算机光驱中,[AutoRun.alpha]优先级高于[AutoRun]
  
[DeviceInstall]部分命令及其详解

DriverPath
含义:定义搜索驱动程序目录。
格式:DriverPath=驱动程序路径
参数:
(1)驱动程序路径:驱动程序所在路径,包括其子路径。
备注:
(1)Windows XP以上支持。
(2)仅CD-ROM支持
(3)当系统监测到一个新的设备时,会提示用户寻找设备的驱动程序。当用户点选此CD-ROM时,当[DeviceInstall]部分存在时,系统会按照DriverPath所标记的路径出寻找驱动程序。未标记的路径系统将忽略查找。当[DeviceInstall]部分不存在时,系统将进行完全查找。如果不希望系统在此CD-ROM中搜索驱动程序,只加一行[DeviceInstall]不加DriverPath命令即可。
  
系统识别该文件过程如下:
系统在插入U盘的时候会根据这个AUTORUN.INF文件在注册表[HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2]下建立一个u盘的关联项,使双击打开指定的程序(如病毒程序)。





这个问题解决了,特别感谢 namejm 的帮助,还有楼下的各位。


[ 本帖最后由 freesoft00 于 2010-5-20 01:28 编辑 ]
2#
 楼主| 发表于 2010-5-10 10:21:41 | 只看该作者
简单说,就是在启用驱动器时会加载Autorun.inf下规定的程序
而以往我们所做的,是根据一份收集来的Autorun病毒列表,遍历所有驱动器,如果有哪个文件和此列表中的文件名相同,则删除。现在我们大多数人似乎都在用这种方法进行Autorun病毒的清理
但Autorun病毒的原理在于“运行Autorun.inf规定的程序”,这个“规定的程序”只要病毒开发者愿意,可以为任意名字。所以说如果只靠收集Autorun病毒的病毒名,那几乎是永无止境的。
经过本文初的链接对Autorun.inf分析后,发现大概有如下键值与Autorun病毒的启动有关:
[AutoRun]
open=
ShellExecute=
shell\open\command=
shell\explore\command=
shell\Auto\command=
Open,执行可执行程序,如exe、bat、cmd等
ShellExecute,关联与它相关的程序并执行,例如doc,则启用写字板或Word
Shell\关键字\Command,右键菜单出现“关键字”选项,单击这个选项则执行“Command”
被调用的程序可能位于当前驱动器下,也可能位于其规定的绝对目录下,也可能位于系统变量$Path规定的目录下
那么,这样一个想法就产生了:
1、遍历所有驱动器(避开光盘、未就需的驱动器等)
2、找到驱动器下的Autorun.inf
3、读取Autorun.inf中Auto段下:Open键、ShellExecute段、所有包含Shell并包含Command的段
4、段读取后检测当前驱动器下、绝对目录下或系统变量$Path规定的目录下是否存在病毒文件,存在则写进一个列表中
5、将列表中的病毒文件都删除
6、清理所有驱动器下的Autorun.inf
回复

使用道具 举报

3#
 楼主| 发表于 2010-5-10 10:22:42 | 只看该作者
自动删除的au3代码:


  1. #include <Array.au3>



  2. _KillAutorun()



  3. Func _KillAutorun()

  4. ;定义两个数组,$FileList用于存放病毒列表,$AutoInfList用于存放Autorun.inf列表

  5. Local $FileList[1001]

  6. Local $AutoInfList[1001]

  7. ;读取系统变量$Path,赋值给$SysPath

  8. $SysPath = EnvGet("Path")

  9. ;以“;”为间隔读取$SysPath中的每一个变量并一一赋值到数组$SysPathArray中

  10. $SysPathArray = StringSplit($SysPath, ";")

  11. ;对$SysPathArray数组中的数据统一化

  12. If IsArray($SysPathArray) Then

  13.   For $i = 1 To $SysPathArray[0]

  14.    $SysPathArray[$i] = StringStripWS($SysPathArray[$i], 1 + 2)

  15.    If StringRight($SysPathArray[$i], 1) = "" Then

  16.     $SysPathArray[$i] = StringTrimRight($SysPathArray[$i], 1)

  17.    EndIf

  18.   Next

  19. EndIf

  20. ;_ArrayDisplay($SysPathArray)

  21. $k = 1

  22. $p = 1

  23. ;遍历驱动器,从C~Z盘

  24. For $i = 65 To 90

  25.   ;将Ascii码转化为字符,65~90为C~Z

  26.   $Drive = Chr($i) & ":"

  27.   ;如果这个驱动器是就需的、是硬盘或U盘、且其根目录下是有Autorun.inf的,则执行操作

  28.   If DriveStatus($Drive) = "READY" And _

  29.     (DriveGetType($Drive) = "Removable" Or DriveGetType($Drive) = "Fixed") And _

  30.     FileExists($Drive & "\Autorun.inf") Then

  31.    ;将Autorun.inf所在位置写入$AutoInfList数组,方便以后使用

  32.    $AutoInfList[$p] = $Drive & "\Autorun.inf"

  33.    $p = $p + 1

  34.    ;读取Autorun.inf中的AutoRun段,获取其中的每一个键和键值

  35.    $AutoSecArray = IniReadSection($Drive & "\Autorun.inf", "AutoRun")

  36.    ;获取正确,做以下操作

  37.    If IsArray($AutoSecArray) Then

  38.     ;遍历AutoRun段中的每一个键,如果这个键是Open或ShellExecute或既包含Shell又包含Command则读取其键值,即获得Autorun病毒文件名

  39.     For $j = 1 To $AutoSecArray[0][0]

  40.      If $AutoSecArray[$j][0] = "Open" Or _

  41.        $AutoSecArray[$j][0] = "ShellExecute" Or _

  42.        (StringInStr($AutoSecArray[$j][0], "Shell") And StringInStr($AutoSecArray[$j][0], "Command")) Then

  43.       ;判定绝对目录下是否有这个病毒,有则将其写入$FileList数组

  44.       If FileExists($AutoSecArray[$j][1]) Then

  45.        $FileList[$k] = $AutoSecArray[$j][1]

  46.        $k = $k + 1

  47.       EndIf

  48.       ;判定相对目录(即与Autorun.inf同目录)下是否有这个病毒,有则将其写入$FileList数组

  49.       If FileExists($Drive & "" & $AutoSecArray[$j][1]) Then

  50.        $FileList[$k] = $Drive & "" & $AutoSecArray[$j][1]

  51.        $k = $k + 1

  52.       EndIf

  53.       ;判定系统$Path的各目录下是否有这个病毒,有则将其写入$FileList数组

  54.       If IsArray($SysPathArray) Then

  55.        For $m = 1 To $SysPathArray[0]

  56.         If FileExists($SysPathArray[$m] & "" & $AutoSecArray[$j][1]) Then

  57.          $FileList[$k] = $SysPathArray[$m] & "" & $AutoSecArray[$j][1]

  58.          $k = $k + 1

  59.         EndIf

  60.        Next

  61.       EndIf

  62.      EndIf

  63.     Next

  64.    EndIf

  65.   EndIf

  66. Next



  67. ;重定义$FileList数组

  68. $FileList[0] = $k - 1

  69. ReDim $FileList[$k]

  70. ;_ArrayDisplay($FileList)



  71. ;重定义$AutoInfList数组

  72. $AutoInfList[0] = $p - 1

  73. ReDim $AutoInfList[$p]

  74. ;_ArrayDisplay($AutoInfList)

  75. ;将$FileList数组(也就是病毒所在位置列表)中的每个数据执行删除

  76. For $i = 1 To $FileList[0]

  77.   FileSetAttrib($FileList[$i], "-RSH")

  78.   FileDelete($FileList[$i])

  79. Next

  80. ;将$AutoInfList数组(也就是Autorun.inf所在位置列表)中的每个数据执行删除

  81. For $i = 1 To $AutoInfList[0]

  82.   FileSetAttrib($AutoInfList[$i], "-RSH")

  83.   FileDelete($AutoInfList[$i])

  84. Next



  85. ;Autorun病毒清理完毕

  86. EndFunc   ;==>_KillAutorun
复制代码

[ 本帖最后由 freesoft00 于 2010-5-10 10:23 编辑 ]
回复

使用道具 举报

4#
 楼主| 发表于 2010-5-10 10:29:01 | 只看该作者
上面的不我的,是我从自由天空转载的,我想用批处理实现上面的功能,但是自己能力所限,只删除了aurorun.inf这个文件,而靠aurorun.inf文件来运行的病毒文件没有删除。

代码如下:
  1. for %%a in (C D E F G H I J K L M N O P Q R S T U V W X Y Z) do (
  2. fsutil fsinfo drivetype %%a: |find /i "固定" && (
  3.   for /f "tokens=2 delims==" %%b in (%%a:\autorun.inf) do del /a /f /q "%%a:\%%b" >nul 2>nul
  4.   del /a /f /q %%a:\autorun.inf >nul 2>nul
  5.   ) >nul 2>nul
  6. fsutil fsinfo drivetype %%a: |find /i "移动" && (
  7.   for /f "tokens=2 delims==" %%b in (%%a:\autorun.inf) do del /a /f /q "%%a:\%%b" >nul 2>nul
  8.   del /a /f /q %%a:\autorun.inf >nul 2>nul
  9.   ) >nul 2>nul
复制代码
上面的只删除固定磁盘和移动磁盘的,避开光驱。

请问如何达到上面的效果批处理分析Autorun.inf分析后,删除如下与Autorun病毒的启动键值相对于的文件:
[AutoRun]
open=
ShellExecute=
shell\open\command=
shell\explore\command=
shell\Auto\command=


[ 本帖最后由 freesoft00 于 2010-5-10 10:30 编辑 ]
回复

使用道具 举报

5#
发表于 2010-5-10 10:31:30 | 只看该作者
好东西,不错,试试看,我顶你.
回复

使用道具 举报

6#
发表于 2010-5-10 11:30:36 | 只看该作者
原帖由 freesoft00 于 2010-5-10 10:29 发表
上面的不我的,是我从自由天空转载的,我想用批处理实现上面的功能,但是自己能力所限,只删除了aurorun.inf这个文件,而靠aurorun.inf文件来运行的病毒文件没有删除。

代码如下:for %%a in (C D E F G H I ...


分析文件不难,

用这样的方法

setlocal enableextensions
setlocal enabledelayedexpansion
......

for /f "delims==" %%a in (路径\autorun.sif) do (
set v=
if /i "%%a"=="open" set v=y
if /i "%%a"=="ShellExecute" set v=y
...
if "!v!"=="y" for /f "delims=(分隔符,我不知道具体的格式,后面的可执行文件之后的字段用什么隔开)" %%i in ("%%~b") do ....

)

具体可能要花点时间,因为有很多种情况,但写法其实很简单

问题是,这样判断貌似有问题

如果是

open=%systemroot%\explorer.exe



[ 本帖最后由 NicTense 于 2010-5-10 11:43 编辑 ]
回复

使用道具 举报

7#
发表于 2010-5-10 12:35:11 | 只看该作者

回复 #1 freesoft00 的帖子

好文章 收藏了!谢谢!
回复

使用道具 举报

8#
 楼主| 发表于 2010-5-10 12:55:19 | 只看该作者
问题是,这样判断貌似有问题

如果是

open=%systemroot%\explorer.exe


默认,固定磁盘或者U盘是没有这个autorun.inf文件的,就不错在这个open=%systemroot%\explorer.exe
问题了吧,有的话也是恶意的估计,应该删除没有问题的。
回复

使用道具 举报

9#
发表于 2010-5-10 13:14:08 | 只看该作者
学习了,不错的构思啊。
回复

使用道具 举报

10#
发表于 2010-5-10 13:41:33 | 只看该作者
有些是正在运行的文件,你删除不掉的

再说删除类似 explorer.exe的文件也不可能的
回复

使用道具 举报

11#
 楼主| 发表于 2010-5-10 14:22:24 | 只看该作者
忘记了,上面加%systemroot%的这个变量,那这个explorer.exe确实不能删除。
只有运行的问题,我想没有问题,我是封装系统,部署后第一次启动桌面的时候自动运行的,那时候病毒还没有运行。
回复

使用道具 举报

12#
发表于 2010-5-10 18:52:19 | 只看该作者
cmd下直接运行:
for /f "delims== tokens=2" %c in ('find /i "open=" autorun.inf') do @echo %c
就可以显示 autorun.inf 中 "open=123.exe " 中的 "123.exe"

其他项目 同样道理获得。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|捐助支持|无忧启动 ( 闽ICP备05002490号-1 )

闽公网安备 35020302032614号

GMT+8, 2024-11-17 19:50

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表