剑走偏锋-使用WMI获取远程计算机进程程序

集中查毒病毒打造内网安全环境

作者:高玉涵

时间:2019.04.1815:45

博客:blog.csdn.net/cg_i

作者背景环境参见:

《由永恒之蓝病毒引发的运维安全思考——网络边界防御篇 》

《非常运维 一体化终端安全管理系统自动安装脚本详解》

TMOTWTDI -- Perl名言

真正见功夫的地方不在于代码本身,而在于对平台的理解和驾驭能力,可能这就是俗称的“内功”。--高玉涵

我希望不曾写过这个程序。--高玉涵

引言

信息安全是运维的根本,直接关系到企业的安危,稍有不慎会造成灾难性后果。比如近段时间,世界范围内爆发的“勒索病毒”事件,另外,国内知名门户网站因系统安全漏洞、病毒引发的数据外泄事件等。因此,信息安全体系建设已经被提到了前所未有的高度。如何提升企业的安全防范水准是目前普遍面临的问题。

很高兴在我写这篇文章时,公司内网环境,正全省统一部署“一体化”终端安全管理系统(简称:管理系统)。这套系统是一整套的内网安全管理解决方案,部署后将彻底解决,我一直苦恼的内网安全问题,提高内网抵御各种风险的能力,我想同样管理着上百台“裸奔”系统机器,并深受其害的同行,应该倍感鼓舞吧!

迫于硬件配置太低,我所在单位内网终端设备(硬件配置:Atom D2560 CPU2.0GHz、DDR2 2G内存、STAT2160G硬盘、Windows XP Embedded (XPe) 32位)安装管理系统后,业务办理过程中,卡顿感明显(欣慰的是,总部已经意识到这些问题,正差手解决中),身为系统管理人员,在系统安全可控的前提下(《由永恒之蓝病毒引发的运维安全思考——网络边界防御篇 》文中简单介绍了,笔者在系统“祼奔”状态下,做的一些系统控制,防范系统安全的一些尝试,方法还是较为原始),确保各项业务正常办理是首要职责,无奈之下只好“壮士断腕”将防病毒模块卸载(防病毒模块资源占用较大、策略较为严格,会拦截业务系统调用的一些插件,导致某些业务无法理)

显而易见“自己感冒了都会害怕,传染给电脑呢?”没有防病毒模块的保护,系统安全根本无从谈起。在等待总部给出最终解决方案之前,现有系统控制措施依然有效,安全依然可控。能否在这段过度期间,提高内网系统抵御病毒能力,做到全网范围内,某台终端设备中毒,早发现、早查杀,将风险与损失降到最低?

本文主要讲述,通过Windows管理规范(Windows Management Instrumentation,WMI)技术,实现集中式的病毒扫描机制的方法。显然,WMI是一个庞大的话题,用几本书的篇幅也讲不完,因此,我只能在本文中给出最简短的概览、设计思路、示例代码,同时与大家分享。希望,对你的工作有所帮助,起到举一反三的效果。

集中查毒设计思路图

(图 1 客户端程序与计算机的WMI服务通信)

1一个WMI客户端程序,定期轮询内网所有计算机,获取远程计算机当前系统运行的进程信息,并将进程程序文件,上转至集中查毒服务器。服务器还提供FTP文件服务功能,用于存放待“抽检”的文件,以远程计算机IP地址命名的文件夹内,标识各自所属内网的那台计算机,一但杀毒程序发现病毒,通过文件夹名称,即可定位内网已中毒的计算机,及时了解内网健康情况,达到早发现、早查杀,将风险与损失降到最低的目的。

你可能会问的一些问题

1.SpotCheck.vbs是什么?

我称之为“抽样检查”程序。抽样检查,是从一批产品中随机抽取少量产品(样本) 进行检验,据以判断该批产品是否合格的统计方法和理论。就像我们人需要定期做体验一样,通过设置“抽检”程序定期执行,可及时了解内网健康情况,做出相对应的诊察手段。

2.为什么是进程程序文件?

远程计算机动辄数十GB至数百GB字节的数据,都传到服务器进行查毒是不现实的(也太傻了)。病毒或恶意程序,要保持传染、窃取、破坏等能力,就必须保持“活性”(驻留在系统进程中)。我们只需“抽检”这部份数据即可达到目地。

Windows Script Host进行脚本编程

在我不长的从业生涯中,学习过数十种计算机语言,学习它们的背景都是因为系统间某些限制或更善长完成特定任务(有些纯粹是因为好奇)。这带来一个好处,让我避免了系统间的限制和兼容问题,根据要执行任务的平台,以它最自然的语言来完成任务。当然这也会带来一些困扰,如,编写代码时各种“方言”会混淆的写在一起。

显然我这个程序主要应用在Windows平台上,程序生命周期定位在“过渡”期内。所以,程序即要充分利用Windows平台提供的强大功能、编写过程也不能太复杂。

用VBScript脚本语言来完成此类任务,可以说是再合适不过了。VBScriptMicrosoft自已的脚本语言很容易上手,其实编写之初,我几乎已经忘记这门语言,我从网上下了一份简明教程,通过几个小时的学习,就可以上手编写程序了。

另一方面,它直接可以同Windows对话,例如DLL对象、COM对象、Windows API类库等等,掌握后可以用它完成Windows下所有的工作,而不必通过复杂的编程环境。

Windows管理规范(WMI

如果你有一台Windows计算机,维护可能是一项令人沮丧的、耗费时间的工作。将这放大数百倍或数千倍。想象一下公司IT经理每天所要面对的事情(我就是这个苦逼的IT经理)。仅仅是记录计算机库存就是很大的一项任务,然后,有频繁的网络设置更改、网络打印机的添加删除、更新应用程序和移动目标共享文件夹,更别提系统崩溃、硬件失效和用户导致的灾难了,将组织的计算机聚集在一起,就像是试图在水中用手握住50个乒乓球。IT工作是进入隔离病房接受一些正式药物治疗的章程票。

摆脱这种错乱的一种方法是,尽可能地避免从一台计算机走到另一台计算机去做更改。在较大的网络中需求更加迫切。WMI则可以帮助减轻维护负担。WMI提供了一种方式来深入查看Windows的内部工作,监视设置并做出修改。WMI伸手触及到Windows操作系统的每个方面,包括设备驱动、系统服务和应用程序。WMI通过网络来工作,因此,运行一个WMI监视程序(或脚本)的计算机可以进入到组织的网上的任何计算机。

别急“压轴好戏”就要上场了

我知道你们急着想看代码,前面的内容如让你感到无趣或啰嗦,先在此表示歉意。为了保证程序能够正常运行,在这之前,我们还是先看看程序运行后的样子和一些注意事项。

1.程序文件

SpotCheck.vbs主程序文件,log.txt是程序运行后生成的日志文件,内容如下面的样子:

......

GetCurrentProcess():C:\WINDOWS\System32\smss.exe,C:\WINDOWS\system32\csrss.exe,C:\WINDOWS\system32\winlogon.exe,C:\WINDOWS\system32\services.exe,C:\WINDOWS\system32\lsass.exe,C:\WINDOWS\system32\cmd.exe,C:\WINDOWS\system32\ftp.exe,

2019/4/8 15:20:22 remote_assembly_upload_file:Method returned result = 0 Id of new process is 3628

2019/4/8 15:20:23 package_team:Method returned result = 0 Id of new process is 1860

2019/4/8 15:20:23 package_team:Method returned result = 0 Id of new process is 6568

2019/4/8 15:20:24 package_team:Method returned result = 0 Id of new process is 6232

......

可以看出日志中记录了GetCurrentProcess()函数,获取的当前进程运行的所有程序,并给出它们的绝对路径,文件间以逗号分隔,这些就是送去“抽检”的文件。

日志文件中还有一些其它信息,它们是程序运行过程中,函数运行状态,有性趣的同学,可通过研究源来代码来了解它们。

1.远程计算机需要做的一些工作

如果远程计算机启用了防火墙,使用netsh firewall set service RemoteAdmin命令,使防火墙允许远程登录。

在工作组网络上WindowsXP系统,要禁用“简单共享”操作如下:1.单击“开始->运行”,输入“gpedit.msc”回车,打开“组策略编辑器”,计算机配置→Windows设置→安全设置→本地策略→安全选项”;2.右边双击“网络访问:本地帐户的共享和安全模式”打开其属性对话框,更改成“经典_本地用户以自己的身份验证”选项。

SpotCheck程序示例源码

'***********************************************************************************
'*
'* File:        SpotCheck.vbs
'* Author:      高玉涵
'* Blog:        blog.csdn.net/cg_i
'* Created:     2019/4/6
'* Last Modified:2019/4/9
'* Version:     0.1
'* Declaration:
'*              抽样检查程序,通过WMI技术获取远程计算机进程文件,传至指定集中杀毒服务器
'*              根据查杀结果了解内网计算机健康情况,做出相对应的诊察手段。
'***********************************************************************************
Option Explicit'BUG = 1,显示错误信息;
public const BUG = 1
public const output_log_file = "log.txt"
public const ForReading = 1, ForWriting = 2, ForAppending = 8
public locator,svcs
dim computer
dim username
dim passwordcomputer = "192.168.0.x"
username = "你的用户名"
password = "你的密码"'----------------------------------------------------------------------
' Author:   高玉涵
' Created:  2016/8/16
' Version:  0.1
' Name:     output_log
' Declare:  写日志
' parameter:
'           strFileName  文件名
'           strMsg       信息
'           mode:
'           ForReading = 1, ForWriting = 2, ForAppending = 8
'----------------------------------------------------------------------
Sub output_log(strFileName,mode,strMsg)Dim fso,file,streamSet fso = CreateObject("Scripting.FileSystemObject")Set stream = fso.OpenTextFile(strFileName,mode,True)stream.WriteLine(Now & vbTab & strMsg & vbcrlf)stream.close
End Sub
'----------------------------------------------------------------------
' Author:   高玉涵
' Created:  2019/4/6
' Version:  0.1
' Name:     manage
' Declare:  管理计算机
' parameter:
'           computername 计算机名或IP
'           username     用户名
'           password     密码
' return:   True,False
'----------------------------------------------------------------------
function manage(computername, username, password)set locator = CreateObject("WbemScripting.SWbemLocator")on error resume nextset svcs = locator.ConnectServer(computername, "root\CIMV2", username, password)if err <> 0 thenif BUG then WScript.Echo "manage():" & Err.Description, "0x" & Hex(Err.Number)output_log output_log_file, ForAppending, "manage():" & Err.Description, "0x" & Hex(Err.Number)manage = Falseexit functionend ifmanage = True
end function
'----------------------------------------------------------------------
' Author:   高玉涵
' Created:  2019/4/6
' Version:  0.1
' Name:     GetCurrentProcess
' Declare:  获取当前系统进程
' parameter:
'           svcs         计算机SWbemServices对象
' return:   成功,返回每个进程执行路径字符串,以逗号分隔。失败,为空
'----------------------------------------------------------------------
function GetCurrentProcess(svcs)Const wbemFlagReturnImmediately = &h10Const wbemFlagForwardOnly = &h20dim processes,process,strTmpon error resume nextset processes = svcs.ExecQuery("SELECT * FROM Win32_Process", "WQL", _wbemFlagReturnImmediately + wbemFlagForwardOnly)for each process in processesif process.ExecutablePath <> vbEmpty and process.ExecutablePath <> "" then strTmp = strTmp & process.ExecutablePath & ","nextif err <> 0 thenif BUG then WScript.Echo "GetCurrentProcess():" & Err.Description, "0x" & Hex(Err.Number)output_log output_log_file, ForAppending, "GetCurrentProcess():" & Err.Description, "0x" & Hex(Err.Number)GetCurrentProcess = Nothingexit functionend ifGetCurrentProcess = strTmp
end function
'----------------------------------------------------------------------
' Author:   高玉涵
' Created:  2019/4/7
' Version:  0.1
' Name:     remote_assembly_upload_file
' Declare:  远程组装上转文件
' parameter:
'           svcs                    计算机SWbemServices对象
'           ftp_command_template    FTP命令模板
'           ftp_command_file        组装到的远程目标文件(全路径)
' return:   成功,TRUE 失败,FALSE
'----------------------------------------------------------------------
function remote_assembly_upload_file(svcs,ftp_command_template,ftp_command_file)dim result,process,processid,packages,packon error resume nextset process = svcs.Get("Win32_Process")result = process.Create("cmd /c echo.>" & ftp_command_file, null, null, processid)output_log output_log_file, ForAppending, "remote_assembly_upload_file:Method returned result = " & result & " " & "Id of new process is " & processidpackages = split(ftp_command_template, vbcrlf)for each pack in packagesif not package_team(svcs, pack, ftp_command_file) thenexit forend ifnextif err <> 0 thenif BUG then WScript.Echo "remote_assembly_upload_file():" & Err.Description, "0x" & Hex(Err.Number)output_log output_log_file, ForAppending, "remote_assembly_upload_file():" & Err.Description, "0x" & Hex(Err.Number)remote_assembly_upload_file = Falseexit functionend ifremote_assembly_upload_file = True
end function
'----------------------------------------------------------------------
' Author:   高玉涵
' Created:  2019/4/7
' Version:  0.1
' Name:     package_team
' Declare:  包装小队 -           remote_assembly_upload_file函数的调用
' parameter:
'           svcs                计算机SWbemServices对象
'           ftp_command_file    组装到的远程目标文件(全路径)
' return:   成功,True 失败,False
'----------------------------------------------------------------------
function package_team(svcs,pack,ftp_command_file)dim result,process,processidon error resume nextset process = svcs.Get("Win32_Process")result = process.Create("cmd /c echo " & pack & ">>" & ftp_command_file,null,null,processid)output_log output_log_file, ForAppending, "package_team:Method returned result = " & result & " " & "Id of new process is " & processidif err <> 0 thenif BUG then WScript.Echo "package_team():" & Err.Description, "0x" & Hex(Err.Number)output_log output_log_file, ForAppending, "package_team():" & Err.Description, "0x" & Hex(Err.Number)package_team = Falseexit functionend ifpackage_team = True
end function
'----------------------------------------------------------------------
' Author:   高玉涵
' Created:  2019/4/8
' Version:  0.1
' Name:     ftp_upload
' Declare:  FTP上转
' parameter:
'           svcs                计算机SWbemServices对象
'           ftp_command_file    FTP配置文件(全路径)
' return:   成功,True 失败,False
'----------------------------------------------------------------------
function ftp_upload(svcs,ftp_command_file)dim result,process,processidon error resume nextset process = svcs.Get("Win32_Process")result = process.Create("cmd /c ftp -i -s:" & ftp_command_file,null,null,processid)output_log output_log_file, ForAppending, "ftp_upload:Method returned result = " & result & " " & "Id of new process is " & processidif err <> 0 thenif BUG then WScript.Echo "ftp_upload():" & Err.Description, "0x" & Hex(Err.Number)output_log output_log_file, ForAppending, "ftp_upload():" & Err.Description, "0x" & Hex(Err.Number)ftp_upload = Falseexit functionend ifftp_upload = True
end function
'----------------------------------------------------------------------
' Author:   高玉涵
' Created:  2019/4/6
' Version:  0.1
' Name:     IPAddress
' Declare:  获取IP地址
' parameter:
'           svcs        计算机SWbemServices对象
'           ip_prefix   IP前缀
' return:   成功,返回指定前缀的IP。失败,返回NULL
'----------------------------------------------------------------------
function IPAddress(svcs, ip_prefix)dim interface,inter,ip,ion error resume nextset interface = svcs.InstancesOf("Win32_NetworkAdapterConfiguration")for each inter in interfaceif not isnull(inter.IPAddress) thenfor each ip in inter.IPAddressif instr(ip, ip_prefix) then IPAddress = ipexit functionend ifnextend ifnextif err <> 0 thenif BUG then WScript.Echo "IPAddress():" & Err.Description, "0x" & Hex(Err.Number)output_log output_log_file, ForAppending, "IPAddress():" & Err.Description, "0x" & Hex(Err.Number)end ifIPAddress = Nothingend function
'----------------------------------------------------------------------
' Author:   高玉涵
' Created:  2019/4/6
' Version:  0.1
' Name:     generate_Upload_Template
' Declare:  生成FTP上转模板
' parameter:
'           LocalIPAddress   本地IP
'           arrayProcess     本地进程数组
'           ftp_host         FTP服务器
'           ftp_user         FTP用户名
'           ftp_password     FTP密码
' return:   成功,返回组装后的模板。失败,未知
'----------------------------------------------------------------------
function generate_upload_template(LocalIPAddress,arrayProcess,ftp_host,ftp_user,ftp_password)dim template,processtemplate = template & "open " & ftp_host & vbcrlftemplate = template & ftp_user & vbcrlftemplate = template & ftp_password & vbcrlf template = template & "mkdir " & LocalIPAddress & vbcrlftemplate = template & "cd " & LocalIPAddress & vbcrlftemplate = template & "BINARY" & vbcrlffor each process in arrayProcessif not process = " " thentemplate = template & "put " & process & vbcrlfend ifnextgenerate_Upload_Template = template
end functiondim arrayProcess,LocalIPAddress,template,ftp_command_file,result
ftp_command_file = "c:\\upload.txt"if manage(computer, username, password) thenresult = GetCurrentProcess(svcs)if not result = vbEmpty thenoutput_log output_log_file, ForAppending, "GetCurrentProcess():" & resultarrayProcess = split(result, ",")LocalIPAddress = IPAddress(svcs, "192")template = generate_Upload_Template(LocalIPAddress,arrayProcess,"192.168.0.x","ftp01","ftp01")remote_assembly_upload_file svcs,template,ftp_command_fileftp_upload svcs,ftp_command_fileend if
end if
wscript.echo "exit"

写在最后

 

最后,向和我一样为确保全省IT系统安全,奋斗在基层一线的全体同仁致敬!

不抱怨的世界。

只是别让时间,

消磨了我们心中的火焰......

2019/4/9

剑走偏锋--使用WMI获取远程计算机进程程序集中查毒病毒打造内网安全环境相关推荐

  1. Visual C#中用WMI获取远程计算机信息

    如果不使用WMI,想要获取远程计算机的系统数据,最常用的方法就是在远程计算机上运行一个客户端程序,本地机通过和这个客户端程序来获取远程计算机的系 统数据.这种实现方法无论是程序设计还是后面的程序分发都 ...

  2. 用WMI获取远程机器操作系统的详细信息

    使用WMI获取远程机器操作系统的详细信息 大杂烩-.NET 代码主题部分的OperatingSystem类,是使用工具(Management (WMI) Extensions for Visual S ...

  3. Visual C#中用WMI控制远程计算机

    WMI不仅可以获取想要的计算机数据,而且还可以用以远程控制.远程控制计算机不仅是黑客们的梦想,也是大多数网络管理者所渴望得到的,尤其在现代的网络中,每一个网络管理者所面对的局域网,都是由一个庞大的计算 ...

  4. C#中用WMI获取远程计算

    6. 按照表05中的数据调整各组件属性对应的数值: 组件类型 组件名称 属性 设置结果 Form Form1 Text 获取远程计算机硬盘信息 Form1 FormBorderStyle FixedS ...

  5. 【Android 逆向】Android 进程注入工具开发 ( 注入代码分析 | 获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 )

    文章目录 一.获取 远程 目标进程 中的 /system/lib/libc.so 动态库中的 mmap 函数地址 二.从 /proc/pid/maps 文件中获取 指定 进程 中的 /system/l ...

  6. SSH远程连接访问树莓派【无公网IP做内网穿透】

     系列文章 树莓派搭建网站,并免费内网穿透发布上线到公网 树莓派搭建WordPress网站,并内网穿透发布上线无需公网IP服务器 为树莓派上的WordPress网站配置自己的域名,并内网穿透发布上线公 ...

  7. 在远程桌面服务中配置RD网关直接访问内网

    远程桌面网关(RD 网关)是一项角色服务,使授权远程用户可以从任何连接到 Internet 并且可以运行远程桌面连接 (RDC) 客户端的设备连接到内部企业网络或专用网络上的资源.网络资源可以是远程桌 ...

  8. 树莓派远程4G遥控车教程(四)-实时监控内网穿透及集成舵机控制功能

    树莓派远程4G遥控车教程(四)- 内网穿透及监控页面集成舵机控制功能 树莓派远程4G遥控车教程(一)-准备工作 树莓派远程4G遥控车教程(二)-相机云台舵机初步调试 树莓派远程4G遥控车教程(三)-摄 ...

  9. java获取客户端硬件信息_java如何获取远程计算机的系统信息,cpu使用情况,磁盘使用情况等等...

    展开全部 1.在远程server里搭建一个http服务e69da5e6ba903231313335323631343130323136353331333337396165,并支持某种服务端语言(如.n ...

最新文章

  1. GitHub遭攻击滥用以代管网钓套件
  2. Spring IOC容器-注解的方式
  3. 用Express搭建 blog (一)
  4. 15寸计算机显示器,苹果确认15寸RMBP支持全球首款5K显示器
  5. 数据的格式化和处理(复习)
  6. 之前跳槽面试时整理的一些知识点
  7. java如何避免死锁_java并发编程如何预防死锁
  8. 使用折半查找法查找数组中的元素
  9. restclient发送json_如何使用restclient来发送post请求参数
  10. 485通讯测试软件,485串口测试 RS485口测试方法
  11. 结果导向的前提是过程控制
  12. opencv笔记(三十二)——将模糊集合用于灰度变换和边缘检测
  13. 虚拟服务器vdi重删,VDI桌面虚拟化简介
  14. 蔡康永:我要的三国就是威力无双。0氪玩家玩了两个礼拜后
  15. AcWing 1083 Windy数
  16. 2023.3.5英语单词学习笔记
  17. 数位板使用技巧_保护您的眼睛技巧,以帮助防止数位眼疲劳
  18. 2008年国家公务员面试2月27号真题
  19. 如何让学习变得有效率
  20. (CNS复现)CLAM——Chapter_00

热门文章

  1. SSD为什么需要Trim?
  2. 计算机毕业设计ssm基于Java的城市公交查询系统ac5p2系统+程序+源码+lw+远程部署
  3. IDEA连接mysql数据库
  4. KNIME服务器安装配置
  5. day-01 one-day projects
  6. 怎样把手机搜索的计算机放到桌面上,手机便签记事本内容怎么发送到电脑桌面上?...
  7. Windows Shellcode开发[3]
  8. 南航计算机科学与技术学院老师,关于南航计算机科学与技术学院第七期科创基金项目教师课题征集的通知...
  9. 超25亿全球月活,字节依然没有流量
  10. 将文件传递到Web服务