使用脚本来监控新建进程及其父进程以及他们的命令行
如今,流氓软件越来越多,其中也包含很多的知名软件厂商也赫然在列,肆意弹框,广告,篡改首页及系统设置,这些操作都是在后台静默完成,操作的流氓技术手段层出不穷,在运维过程中出现的反复问题,通过肉眼或者一定的技术手段可能都无法捕获到最终是哪个进程发起的流氓行为。为此,通过一定的脚本编程手段来加以辅助可谓事半功倍。举一简单例子,某用户计算机卸载了各种流氓软件后,没一会儿又安装上了,那么是如何安装上的,下面的脚本会告诉你答案。
该功能一共有2个脚本,第一个是vbs主程序,用以实现监控,第二个是批处理,用以调用这个vbs,将vbs捕获的信息显示到窗口上。
下面是VBS脚本代码:
strComputer = "." Set objWMIService = GetObject("winmgmts:" & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colMonitoredProcesses = objWMIService. _ ExecNotificationQuery("select * from __instancecreationevent " & " within 1 where TargetInstance isa 'Win32_Process'") Wscript.echo "进程监控已开启,任何新建进程将会被捕获!" Do While 1 Set objLatestProcess = colMonitoredProcesses.NextEvent sppid = objLatestProcess.TargetInstance.ParentProcessID Wscript.Echo time & " 发现新建进程-->" & "发起父进程Process ID:" & sppid Wscript.Echo "父进程命令行:" & GetParentProcessName(sppid) Wscript.Echo "创建新进程:" & objLatestProcess.TargetInstance.CommandLine Wscript.Echo "----------------------------------------------------------------" Loop Function GetParentProcessName(pid) On error resume next Dim sComputerName,WMI_Obj,WMI_ObjProps,ObjClsItem sComputerName="." Set WMI_Obj = GetObject("winmgmts:\\" & sComputerName & "\root\cimv2") Set WMI_ObjProps = WMI_Obj.ExecQuery("Select * from Win32_Process where ProcessId='" & pid & "'", , 48) For Each ObjClsItem in WMI_ObjProps GetParentProcessName = ObjClsItem.CommandLine Next End Function
下面是bat批处理脚本代码:
@echo off >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system" if '%errorlevel%' NEQ '0' ( echo 请求管理员权限... goto UACPrompt ) else ( goto gotAdmin ) :UACPrompt echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs" echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs" "%temp%\getadmin.vbs" exit /B :gotAdmin if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" ) pushd "%CD%" CD /D "%~dp0" cscript.exe //Nologo "%~dp0"procsm.vbs pause>nul
将上面的2个脚本放在同一个目录中,然后运行批处理脚本,此时,批处理会调用UAC以管理员身份运行,随后载入执行vbs脚本,运行后,我们可以看到以下监控的效果: