移除SHELL32.DLL自动播放的功能,降低病毒威胁
exFAT文件系统是FAT32的升级版,解决了FAT32单文件4G的限制。与NTFS格式相比具有简单性,因为FAT系统不具备NTFS的安全性和权限管理而更适合被用于外部存储设备,如优盘、闪盘、超棒、记忆棒等闪存设备。在这些闪存设备中都存在着芯片颗粒的读写次数限制,这时FAT的简单性也就发挥了作用,简单性意味着没了的安全性和权限管理表,虽说每次读写都仅仅少了安全性和权限管理表的几次访问和记录,但是的的确确减少了读写的次数,因而提高了设备的使用寿命。如果把exFAT文件系统作为我们BT、电驴等分享式下载工具的下载分区,不也能达到减少磁头的读写次数,提高硬盘的使用寿命吗?
XP系统只要打KB955704补丁就可以支持exFAT格式了。作为一个系统爱好者,自然也得把自己的系统维护工具PE来个升级,通过解压补丁包、替换文件、增加注册表以达到增加exFAT文件系统的支持。大多情况下,我们很容易从网络资源中找到我们想要的一些东西,但有时却是不能的,虽然找到了经过资源精简的SHELL32.DLL,但是有一个问题困扰着我,那就是不能移除右键菜单的“自动播放(&P)”功能。在搜索未果的情况下,只能祭出反汇编动态调试工具OLLYDBG,把SHELL32.DLL载入反汇编分析,
1、通过搜素关键字“自动播放”找到
7D65F413 |. 50 |PUSH EAX ; |Buffer
7D65F414 |. 68 38210000 |PUSH 2138 ; |RsrcID = STRING "自动播放(&P)"
7D65F419 |. FF35 A4E5797D |PUSH DWORD PTR DS:[7D79E5A4] ; |hInst = NULL
7D65F41F |. FF15 541D597D |CALL DWORD PTR DS:[<&USER32.LoadStringW>; \LoadStringW
2、这个函数,接着往上分析条件跳转的地方
7D65F3DD |. FF90 94000000 |CALL DWORD PTR DS:[EAX+94]
7D65F3E3 |. 81BD 34F1FFFF>|CMP DWORD PTR SS:[EBP-ECC],1000
7D65F3ED |. 74 41 |JE SHORT SHELL32.7D65F430
7D65F3EF |. 83BD 34F1FFFF>|CMP DWORD PTR SS:[EBP-ECC],1
7D65F3F6 |. 74 38 |JE SHORT SHELL32.7D65F430
3、从这里看可知跳转到地方是7D65F430,转到7D65F430看下
7D65F430 |> 53 |PUSH EBX ; /Arg4
7D65F431 |. 68 ACF7657D |PUSH SHELL32.7D65F7AC ; |Arg3 = 7D65F7AC
7D65F436 |. 57 |PUSH EDI ; |Arg2
7D65F437 |. 68 44E9597D |PUSH SHELL32.7D59E944 ; |Arg1 = 7D59E944
7D65F43C |. 8BCE |MOV ECX,ESI ; |
7D65F43E |. E8 7D3DF9FF |CALL SHELL32.7D5F31C0 ; \SHELL32.7D5F31C0
7D65F443 |. 53 |PUSH EBX
7D65F444 |. 68 1451597D |PUSH SHELL32.7D595114
7D65F449 |. 68 E4E9597D |PUSH SHELL32.7D59E9E4 ; UNICODE "Extended"
7D65F44E |> 8BCE |MOV ECX,ESI ; |
7D65F450 |. 68 54365B7D |PUSH SHELL32.7D5B3654 ; |Arg1 = 7D5B3654
7D65F455 |. E8 663DF9FF |CALL SHELL32.7D5F31C0 ; \SHELL32.7D5F31C0
7D65F45A |. 68 04010000 |PUSH 104 ; /Arg2 = 00000104
7D65F45F |. 8D85 F4FDFFFF |LEA EAX,DWORD PTR SS:[EBP-20C] ; |
7D65F465 |. 50 |PUSH EAX ; |Arg1
7D65F466 |. 8BCE |MOV ECX,ESI ; |
7D65F468 |. E8 D4FBFFFF |CALL SHELL32.7D65F041 ; \SHELL32.7D65F041
7D65F46D |. 53 |PUSH EBX
7D65F46E |. 8D85 F4FDFFFF |LEA EAX,DWORD PTR SS:[EBP-20C]
7D65F474 |. 50 |PUSH EAX
7D65F475 |. 57 |PUSH EDI
7D65F476 |. 68 70365B7D |PUSH SHELL32.7D5B3670 ; UNICODE "shell\AutoRun\command"
7D65F47B |. E9 49020000 |JMP SHELL32.7D65F6C9
7D65F480 |> 68 50E4597D |PUSH SHELL32.7D59E450 ; /String2 = "ShellExecute"
7D65F485 |. FFB5 38F1FFFF |PUSH DWORD PTR SS:[EBP-EC8] ; |String1
7D65F48B |. FF15 E415597D |CALL DWORD PTR DS:[<&KERNEL32.lstrcmpiW>; \lstrcmpiW
4、很明显还是在执行自动播放的ShellExecute。返回步骤2,继续往上分析条件跳转语句,来到
7D65F3BB |. FF90 DC000000 |CALL DWORD PTR DS:[EAX+DC]
7D65F3C1 |. 85C0 |TEST EAX,EAX
7D65F3C3 |. 0F84 07030000 |JE SHELL32.7D65F6D0
5、这次是跳转到7D65F6D0,转到7D65F6D0看下
7D65F671 |. 85C0 |TEST EAX,EAX
7D65F673 |. 74 5B |JE SHORT SHELL32.7D65F6D0
7D65F675 |. 53 |PUSH EBX
7D65F676 |. 68 00365B7D |PUSH SHELL32.7D5B3600 ; UNICODE "Autorun"
7D65F67B |. EB 45 |JMP SHORT SHELL32.7D65F6C2
7D65F67D |> 8B06 |MOV EAX,DWORD PTR DS:[ESI]
7D65F67F |. 8BCE |MOV ECX,ESI
7D65F681 |. FF90 DC000000 |CALL DWORD PTR DS:[EAX+DC]
7D65F687 |. 85C0 |TEST EAX,EAX
7D65F689 |. 74 45 |JE SHORT SHELL32.7D65F6D0
7D65F68B |. 68 F0355B7D |PUSH SHELL32.7D5B35F0 ; /String2 = "command"
7D65F690 |. FFB5 38F1FFFF |PUSH DWORD PTR SS:[EBP-EC8] ; |/Path
7D65F696 |. FF15 601C597D |CALL DWORD PTR DS:[<&SHLWAPI.PathFindFi>; |\PathFindFileNameW
7D65F69C |. 50 |PUSH EAX ; |String1
7D65F69D |. FF15 E415597D |CALL DWORD PTR DS:[<&KERNEL32.lstrcmpiW>; \lstrcmpiW
7D65F6A3 |. 85C0 |TEST EAX,EAX
7D65F6A5 |. 75 13 |JNZ SHORT SHELL32.7D65F6BA
7D65F6A7 |. 68 04010000 |PUSH 104 ; /Arg2 = 00000104
7D65F6AC |. 8D85 F4FDFFFF |LEA EAX,DWORD PTR SS:[EBP-20C] ; |
7D65F6B2 |. 50 |PUSH EAX ; |Arg1
7D65F6B3 |. 8BCE |MOV ECX,ESI ; |
7D65F6B5 |. E8 87F9FFFF |CALL SHELL32.7D65F041 ; \SHELL32.7D65F041
7D65F6BA |> 53 |PUSH EBX
7D65F6BB |. 8D85 F4FDFFFF |LEA EAX,DWORD PTR SS:[EBP-20C]
7D65F6C1 |. 50 |PUSH EAX
7D65F6C2 |> 57 |PUSH EDI
7D65F6C3 |. FFB5 38F1FFFF |PUSH DWORD PTR SS:[EBP-EC8]
7D65F6C9 |> 8BCE |MOV ECX,ESI ; |
7D65F6CB |. E8 F03AF9FF |CALL SHELL32.7D5F31C0 ; \SHELL32.7D5F31C0
7D65F6D0 |> FFB5 38F1FFFF |PUSH DWORD PTR SS:[EBP-EC8] ; /String
7D65F6D6 |. FF15 3016597D |CALL DWORD PTR DS:[<&KERNEL32.lstrlenW>>; \lstrlenW
6、这下心里有底了,已经不在Autorun代码的语段里了,返回步骤4,把"JE 7D65F6D0"改成"jmp 7D65F6D0",完工,测试下,OK,搞定……