首页 > Windows > 澄清现在流传的对自动播放的误解

澄清现在流传的对自动播放的误解

2007年12月21日 Galaxy 发表评论 阅读评论

2007/6/8

澄清现在流传的对自动播放的误解

现在U盘病毒非常猖狂~几乎随便拿一个U盘来扫描都可以发现病毒。
有人就建议在组策略中关闭自动播放(计算机配置→管理模板→系统,关闭自动播放)以防止双击打开U盘的时候病毒被激活。
这个方法实际上是错误的,如此设置对避免双击激活病毒没有任何帮助。
从Windows XP开始,自动运行被分成自动播放和自动运行两部分,两者有点关系但不是一回事。
没有查到自动播放和自动运行的M$官方定义,简单说一下:

比如说,默认情况下插入一张光盘,Windows XP会弹出一个窗口显示正在搜索光盘上的内容,然后出现一个对话框,根据光盘中的内容会让你选择是浏览光盘、播放音乐还是干什么等等。这是自动播放。这种情况在U盘上也会出现。

如果这张光盘上有Autorun.inf,那么搜索窗口将不会出现,Windows XP将读取Autorun.inf然后根据该文件的内容决定采取什么行为,通常将是运行Autorun.inf指定的程序。这就是自动运行。U盘支持不完全的自动运行,插上时不会执行Autorun.inf脚本但双击时会。

如果关闭了自动播放,Autorun.inf的脚本将不会被自动运行,插入光盘后也不会出现什么程序。当然那个搜索对话框更不会出现~这大概是自动播放和自动运行唯一的关系。

但是,如果你插入一张有Autorun.inf的文件,然后打开右键菜单,你可以发现“自动播放”那几个字是粗体,表明如果你双击光驱图标Autorun.inf脚本仍然会被执行。这个情况对U盘同样适用。

所以即使你关闭了自动播放,接上一个带了毒的U盘,双击,病毒仍然会被激活,唯一的区别就是原来可能出现的让你选择操作的窗口不会再出现。

想预防U盘病毒,最简单的方法是永远不要双击打开U盘,用右键菜单进,而且右键菜单要看清楚!现在已经有病毒伪造右键菜单中的“打开”项了。据说有个更恶劣的U盘毒把“打开”和“资源管理器”都伪造出来(右键菜单中两个“打开”两个“资源管理器,毫无疑问前两个是假的)。
最好记得打开U盘前扫描一遍病毒。

这一点Linux做的很好,可以设置插入可移动媒体时自动运行的程序,Windows MS还没有这个功能。

一个修改注册表权限免疫U盘病毒的方法:

打开注册表项
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2
在键MountPoints2上点右键,选择权限,将Administrators组和SYSTEM组的完全控制都设为阻止即可。
简单说下原理:
Windows读取Autorun.inf后,会修改MountPoints2下的子键以添加新的右键菜单项。
将这个键的权限设为阻止,指向病毒的菜单项无法出现,病毒自然也就不能被激活。
附M$知识库中提供的关闭自动运行的方法~未验证对U盘自动运行是否有效果:如果您的计算机连接了 CD-ROM 自动换片器,则可能需要禁用自动运行 CD-ROM(自动运行光盘 [CD] 或自动播放音频 CD-ROM)。如果对 CD-ROM 自动换片器启用了自动运行 CD-ROM,则每次在其中一个托盘中插入新 CD-ROM 时,Windows 都会循环通过自动换片器中的每个托盘。在用户界面中,没有用于启用或禁用自动运行 CD-ROM 的选项。要启用或禁用自动运行 CD-ROM,必须编辑注册表: 1. 依次单击开始和运行,在打开框中键入 regedit,然后按 Enter 键。
2. 找到并单击以下注册表项:
HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\CDRom
3. 要禁用自动运行 CD-ROM,请将 Autorun 的值更改为 0(零)。要启用自动运行 CD-ROM,请将 Autorun 的值更改为 1。
4. 重新启动计算机。
注意:此方法可禁用自动运行 CD-ROM。如果要根据在 CD-ROM 驱动器中插入的 CD-ROM 来禁用自动运行 CD-ROM,可以在插入 CD-ROM 的同时按住其中一个 Shift 键不放。

还有其他两个注册表项会影响此功能:
HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
NoDriveTypeAutoRun = 0×00000095
- 和 -
HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\Policies\Explorer
NoDriveTypeAutoRun = 0×00000095
每个注册表项的正确值均为 0×00000095。


2007/8/27

对《澄清现在流传的对自动播放的误解》的补充说明

      上次写了篇日志《澄清现在流传的对自动播放的误解》,顺便发到金山爱毒霸社区(帖子地址:http://bbs.duba.net/thread-21812231-1-2.html),想不到反响还不错,捞了个精华而且金山公司的铁军同志也参加了讨论。(PS:本人还是很支持金山的微笑

      既然有讨论就有争议,铁军的意见是根据实验,组策略中禁止自动播放完全可以避免感染Autorun.inf病毒。

      实际上发了这个帖子后我也有点奇怪,因为仅仅在组策略中关闭自动播放的情况下,往U盘中拷一个简单的Autorun.inf

            [autorun]

            open=NOTEPAD.exe

然后将Windows自带的记事本程序NOTEPAD.exe同样拷到U盘下,重新插入再看右键菜单,没有发现自动播放项,直接双击也正常打开了U盘。看起来似乎确实起作用了。

      但我记得以前在关闭了自动播放时,遇见的带毒U盘右键里面往往都多了一个“粗体”的Auto项,即双击盘符时将执行Auto的事件,这又是怎么回事?莫非我记错了?

      换一个恶劣点的Autorun.inf试试

            [autorun]
            OPEN=NOTEPAD.exe
            shell\open=打开(&O)
            shell\open\Command=NOTEPAD.exe
            shell\open\Default=1
            shell\explore=资源管理器(&X)
            shell\explore\Command=NOTEPAD.exe
            icon=game.ico

加入一个图标是为了检查Autorun.inf是否被读取,这个Autorun.inf会伪造右键菜单里的打开资源管理器,点击就运行NOTEPAD.exe。重新插入后图标变了,检查右键菜单,没有新的项创建,双击看看。哈哈,熟悉的记事本蹦出来了,证明打开资源管理器已被修改。如果把NOTEPAD.exe换成病毒文件,恭喜,你已经中毒了。破碎的心

      这个实验证明靠组策略中关闭自动播放来预防U盘毒是完全没有用的(上面这个Autorun.inf已经烂大街了),看来最可靠的预防方法还是锁住MountPoints2键,试了一下,锁住以后即使遇到这种恶劣的Autorun.inf也不会中招——因为它根本动不了右键菜单。帖子回复里面网友horseluke的意见是使用组策略还需要关闭Shell Hardware Detection服务,以前我关闭这个服务后遇到了奇怪的问题,Windows XP启动时间变长了?!所以不打算关闭,就锁键吧,反正暂时没有发现有什么异常。

      胡乱猜测了一下,可能U盘的自动运行/自动播放机制和光盘的不一样,光盘是读取到Autorun.inf时自动在右键菜单中创建一项“粗体”的自动播放(M$在Windows XP中想划清自动运行和自动播放的关系,但显然弄巧成拙了),是否存在这一步与是否开启自动播放无关,双击光盘盘符或点击自动播放通常都会读取Autorun.inf中open=后面的程序;对U盘则没有这些待遇,所以病毒必须通过Autorun.inf创建一个Auto或者直接修改原来菜单中的内容。这也解释了为什么即使关闭了自动播放,在光盘的右键菜单中仍然可以看到自动播放,U盘的却看不到(大概从来就看不到)。再次强调这些仅仅是胡乱猜测。计算机

Tags: , ,

Related posts

分类: Windows 标签: , , 261 views
1 Star2 Stars3 Stars4 Stars5 Stars (No Ratings Yet)
Loading ... Loading ...
  1. galaxy
    2008年4月26日22:00 | #1

    U盘防毒(好象还是不完善)
    https://dream4ever.org/showthread.php?t=187042
    这个方法是总结几个老大的方法出来的。

    在vista系统上,把U盘插入。
    格式化,选择ntfs格式。
    新建一个文件夹,名为 autorun.inf
    在autorun.inf上点一下右键,属性
    点一下“安全”
    再点一下“高级”
    点一下“所有者”
    点一下“编辑”
    点选“Administrator”
    然后点“确定”会出来一个对话框
    然后再点一下确定,然后把所有窗口都点确定,退出所有窗口。
    然后再次在autorun.inf文件夹上点右键,属性,安全
    点一下“编辑”
    取消“包括可从该对象的父项继承的权限(I)”前面的勾
    出来一个对话框
    点击“删除”
    再点击“添加”
    输入“everyone”后点“确定”
    把”拒绝”打上勾
    最后点一下“是”
    这样,这个autorun.inf目录是不可写,不可删,不可改名了。

    总结一,这样,U盘就算在A机上染上autorun病毒,到B机也不会自动运行了。

    总结二,点开始/运行/regedit
    定位到HKEY_CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2
    在MountPoints2上右键

    点击 “权限”

    添加 输入everyone

    点“确定”

    选择完全控制栏的拒绝,应用,对安全警告回答是;

    这个是一个老大的blog上的,http://www.iamcj.net/blog/2007/06/14/disable-the-autoruninf-forever/。也可以运行一下附件里的bat文件。

    setacl CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2 /registry /deny everyone /full
    rem iamcj制作
    rem http://www.iamcj.net/blog
    rem 屏蔽CURRENT_USER\Software\Microsoft\Windows\CurrentVersion\Explorer\MountPoints2下所有用户权限
    rem 用于双击盘符的自动执行和右键盘符调用菜单

    总结三,运行一下附件禁止自动运行.reg,把自动运行关掉。

    看来似乎是贴完了吧。。。我来打击楼主一下吧。。。

    如果中毒的机器上,用户登录的是administrator帐户或者本身病毒就挂在system账户下的话,病毒可以很容易的利用接口把自己进程的权限提升到可以删改这个文件的级别,因为Windows的逻辑是,管理员可以通过编辑权限获得这个文件的修改 权限,从而编辑这个文件,所以管理员发起的进程,拥有同样的权限。

    只有病毒被限制在管理员以下权限或者病毒内部没有提升权限级别代码的时候才有效,具体的例子可以看这个帖子:

    http://bbs.et8.net/bbs/showthread.php?t=898904
    程序在执行的时候提升了自身的权限,读了下源代码,fastcopy.cpp 25行开始:

    代码:
    BOOL SetPrivilege(LPTSTR pszPrivilege, BOOL bEnable)
    {
    HANDLE hToken;
    TOKEN_PRIVILEGES tp;

    if (!::OpenProcessToken(::GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES | TOKEN_QUERY, &hToken))
    return FALSE;

    if (!::LookupPrivilegeValue(NULL, pszPrivilege, &tp.Privileges[0].Luid))
    return FALSE;

    tp.PrivilegeCount = 1;
    //Begin
    if (bEnable)
    tp.Privileges[0].Attributes = SE_PRIVILEGE_ENABLED;
    else
    tp.Privileges[0].Attributes = 0;

    if (!::AdjustTokenPrivileges(hToken, FALSE, &tp, 0, (PTOKEN_PRIVILEGES)NULL, 0))
    return FALSE;
    //End
    if (!::CloseHandle(hToken))
    return FALSE;

    return TRUE;
    }
    不能这么说,至少目前病毒程序很少这么做,虽然理论上可以

    我自己这样用U盘,还没出过什么问题。

    除非机器上不用管理员身份登录,否则,这是没有用的,遇着完美点的,不能写入autorun.inf时,就会试改NTFS权限的。

    [回复]

  2. galaxy
    2008年4月26日22:02 | #2

    【原创】自建无法删除的 AutoRun.inf 文件防优盘病毒的两种思路——1楼传统文件夹方式无效,3楼更新有效方法
    https://dream4ever.org/showthread.php?t=200798
    (谢谢 2楼 BlueFang 兄弟提供反馈,证明一楼方法无效,才促使我去另找思路),不明白兄弟为什么要删帖,是我编辑帖子时疏忽了,没提到你的反馈,在这里像你道歉

    防优盘病毒已经讨论过很多了,系统自身可以通过注册表权限等等禁止自动播放来免疫。但优盘难免会拿到别的地方使用,自建一个 AutoRun.inf 文件夹是一个解决途径,但新型的病毒早已可以自己删除这个文件夹。

    改进的办法是在DOS 下,用 md 命令建一个后面带 . 的文件夹,这方法我没试过,不知道有没有新的病毒可以对付。

    这是搜到的一段话,所以也许这个办法能被病毒攻破: 引用
    病毒制造者可以做一个程序,扫描目录时发现某目录名最后一个字节为’.'则通过访问”dirfullname..”、或者通过利用Windows NT的Native API中的文件系统函数直接插手,删除该特殊目录。

    这里提到的是另一个方法,用到 Winhex 编辑磁盘的功能(或其他工具)(前段有两个WinHex 的帖子,发现这个工具很强大,现在正好用上了,呵呵)

    先在 U 盘建一个 AutoRun.inf 文件夹(我是先格式化之后再进行操作的,只是为了更干净点)

    进入 AutoRun.inf 文件夹,随便建一个文件,为了好修改,最好建英文名文件,我建了一个 can’t.del 文件。

    如下图,Winhex 下用 F9 或 tools 菜单下的 Opendisk,打开优盘,进入 AutoRun.inf 点到 can’t.del 文件上(图一)

    很容易就可以看到该文件的位置,CAN’T DEL,中间三个空格,对应十六进制是 20 20 20, 把中间的 20 改成 E5 (也可以改成别的乱字符),保存退出。(图二)

    这样,文件名就显示为 can’t ?del 了,这个文件是删不掉的,而 AutoRun.inf 文件夹也就删不掉了。

    很容易看出,这种方法比利用系统漏洞建立的普通情况下不能删除的文件夹具有更大的优势和防删性能。(虽然没有进行实际对比,但即使效果与 .. 文件夹一样,病毒制作者也不容易针对此来进行删除,每个人建的文件名和更改的乱字符都可以不一样的)

    文件安全性上,由于只是改了文件名部分,应该不会有问题,拷贝满文件之后,校验文件的 md5值,与硬盘上的文件一致。但由于使用时间尚短,不能保证一定没有问题,所以有重要数据的话,还是暂等测试时间稍长后再用。

    (注:在 Fat/Fat32格式优盘上测试成功)

    由于 AutoRun.inf 文件夹 还是能改名,上面的思路被证明无效了。(谢谢 2 楼 BlueFang 兄弟提供反馈,证明此法无效)

    是不是没有别的办法了呢?

    换一个思路,不建立 文件夹,而是建一个 AutoRun.inf 文件

    用 Winhex 打开优盘,定位到 AutoRun.inf 文件,可以看到文件后面是一个空格,中间也是一个空格,试了一下,改中间的空格不行,这样文件名就改了,把后面的空格(20)改为 (E5)——成功。
    文件名没改,但这个文件删不掉也没法改名!

    fat/fat32格式测试有效,NTFS好像略复杂些,没试

    闲来无事, 且对lz的办法做一分析,同时指出可行的删除办法。

    从根本上说,lz的方法是通过设置FAT文件系统中Directory Entry Structure的DIR_Attr字段的保留位来达到系统api不能读取该文件的目的(表现为access deined)。对于ntfs,手上没有大容量u盘来测试结果,但基于ntfs完全不同于FAT的复杂结构和对MFT扇区的内建checksum校验,个人推测不可行。

    至于修改第2个0×20为0xe5可以达到不能读取文件的效果,其原理可以查阅MS公开的FAT文件系统文档来了解清楚:

    代码 (双击代码复制到粘贴板)FAT 32 Byte Directory Entry Structure
    Name Offset(byte) Size(bytes) Description
    DIR_Name 0 11 Short name.
    DIR_Attr 11 1 File attributes:
    ATTR_READ_ONLY 0×01
    ATTR_HIDDEN 0×02
    ATTR_SYSTEM 0×04
    ATTR_VOLUME_ID 0×08
    ATTR_DIRECTORY 0×10
    ATTR_ARCHIVE 0×20
    ATTR_LONG_NAME ATTR_READ_ONLY |
    ATTR_HIDDEN |
    ATTR_SYSTEM |
    ATTR_VOLUME_ID
    The upper two bits of the attribute byte are reserved
    and should always be set to 0 when a file is created
    and never modified or looked at after that.

    从上可以看到前11个byte对应文件shortname,如果修改了第一个0×20就相当于改了文件名,自然不可行。第12个byte则对应DIR_Attr,用于指定该文件属性,初始的0×20即ATTR_ARCHIVE,表明是存档属性的文件,如果 改为0xe5即二进制11100101,相当于ATTR_READ_ONLY|ATTR_SYSTEM|ATTR_ARCHIVE 再加上最高两位置1,注意红字部分明确指出最高2位是保留的未定义位,应该永远设置为0。其实通过试验可以发现真正决定系统不能读取文件的只是第7位,所以只需设置成0×40即可,其它属性位随便加不加。推测操作系统有类似以下的伪代码来检测:
    if (DIR_Attri & 0×40 != 0)
    {
    return ERROR_ACCESS_DENIED;
    }

    此外在MSDN文档中我们也可以找到相对应的描述:

    代码
    FILE_ATTRIBUTE_DEVICE
    64
    0×40 Reserved; do not use.

    FILE_ATTRIBUTE_NORMAL
    128
    0×80 A file or directory that does not have other attributes set.
    This attribute is valid only when used alone.

    了解后对于如何删除此类文件有以下思路, 首先通过系统API看来不可行,测试显示会返回INVALID_FILE_ATTRIBUTES,那么只有和winhex一样直接读取磁盘数据,要么把DIR_Attr修改回为正常数值再删除,要么更简单点把首字节直接改为E5,这也就是FAT系统删除文 件的办法。

    测试程序就懒得写了,有其它问题欢迎继续讨论。

    [回复]

  3. galaxy
    2008年8月23日12:10 | #3

    在M$系统中,是不能创建包含\/:*?”<>|等符号的文件夹的。但是,在dos下(或
    者cmd中)用md命令就可以创建一个包含这些符号的文件夹,
    比如
    运行cmd
    md 123..\ //创建一个显示名称为123.的文件夹
    在windows下无法对1.这个文件夹进行删除和重命名,在dos(cmd)下也不能用rd
    123.来删除,要想删除只能在dos(cmd)下输入rd 123..\才可以.
    但是有时候在cmd下使用rd 123 时仍然无法删除(我遇到过一个隐藏属性的这种
    文件夹,可惜我不知道怎么创建),这个时候就需要使用dir /x这个命令。(显
    示为非 8.3 文件名产生的短名称,假设为123~1,这个名称在正常名称前面).然
    后rd 123~1即可删除。

    [回复]

  1. 本文目前尚无任何 trackbacks 和 pingbacks.

Locations of visitors to this page