问题引入
不知道大家最近工作生活中有没有碰到这样的问题:
1、卸载程序,结果没卸载干净
程序的安装目录中还剩下一个dll文件。想删,结果系统提示说dll文件被某个进程占用了,不让删。
2、安装软件后需要破解或者修改一些配置,通常会有替换配置文件 dll 文件。但是有些情况当安装软件时
其服务默认是自动开启的,此时也就会用到对应的 dll 文件,这个时候在进行更改就会出现异常,
windows 会提示该文件已被某个进程占用。
我最近在安装一个服务组件的软件时,因为其内置了一个 sql 数据库程序,当时没留意。再替换配置文件 时才发现 dll 文件被某个进程占用了。重启程序、重启电脑都未能解决,问题就指向了一个原因,那就是该服务是自动开启的,即 windows 开机就自动开启,因而也就会一直占用该 dll 文件。
但是通过 windows 的服务列表界面有很多服务一眼也看不出是哪个服务占用。(当然对启动的服务都很了解的话,就会知道安装一个软件会有哪些服务被启动。)
被这个问题卡住了,搜索了半天资料找到了下面这个神器:tasklist。(好吧,承认是windows平台的底层操作不熟,但是解决问题过程中学习成长还是很有成就感的不是,相信你也有这体会。)
关于 dll 文件
DLL ( Dynamic Link Library ) 文件为动态链接库文件,又称“应用程序拓展”,是软件文件类型。
在 Windows 中,许多应用程序并不是一个完整的可执行文件,它们被分割成一些相对独立的动态链接库,即DLL文件,放置于系统中。当我们执行某一个程序时,相应的 DLL 文件就会被调用。一个应用程序可使用多个DLL文件,一个DLL文件也可能被不同的应用程序使用。
1、 作用
- 在 Windows操作系统中,每个程序都可以使用该 DLL中包含的功能来实现“打开”对话框。这有助于促进代码重用和内存的有效使用。
- 通过使用 DLL,程序可以实现模块化,由相对独立的组件组成。 因为模块是彼此独立的,所以程序的加载速度更快,而且模块只在相应的功能被请求时才加载。
- 此外,可以更为容易地将更新应用于各个模块,而不会影响该程序的其他部分。
2、 特点
- 使用较少的资源
- 推广模块式体系结构
三、 简化部署和安装
利器登场
一、用法明细
tasklist 这个命令还是很好使的,先看下用法手册:
- F:\>help tasklist
- TASKLIST [/S system [/U username [/P [password]]]]
- [/M [module] | /SVC | /V] [/FI filter] [/FO format] [/NH]
- 描述:
- 该工具显示在本地或远程机器上当前运行的进程列表。
- 参数列表:
- /S system 指定连接到的远程系统。
- /U [domain\]user 指定应该在哪个用户上下文执行这个命令。
- /P [password] 为提供的用户上下文指定密码。如果省略,则
- 提示输入。
- /M [module] 列出当前使用所给 exe/dll 名称的所有任务。
- 如果没有指定模块名称,显示所有加载的模块。
- /SVC 显示每个进程中主持的服务。
- /APPS 显示 Microsoft Store 应用及其关联的进程。
- /V 显示详细任务信息。
- /FI filter 显示一系列符合筛选器
- 指定条件的任务。
- /FO format 指定输出格式。
- 有效值: "TABLE"、"LIST"、"CSV"。
- /NH 指定列标题不应该
- 在输出中显示。
- 只对 "TABLE" 和 "CSV" 格式有效。
- /? 显示此帮助消息。
- 筛选器:
- 筛选器名称 有效运算符 有效值
- ----------- --------------- --------------------------
- STATUS eq, ne RUNNING | SUSPENDED
- NOT RESPONDING | UNKNOWN
- IMAGENAME eq, ne 映像名称
- PID eq, ne, gt, lt, ge, le PID 值
- SESSION eq, ne, gt, lt, ge, le 会话编号
- SESSIONNAME eq, ne 会话名称
- CPUTIME eq, ne, gt, lt, ge, le CPU 时间,格式为
- hh:mm:ss。
- hh - 小时,
- mm - 分钟,ss - 秒
- MEMUSAGE eq, ne, gt, lt, ge, le 内存使用(以 KB 为单位)
- USERNAME eq, ne 用户名,格式为
- [域\]用户
- SERVICES eq, ne 服务名称
- WINDOWTITLE eq, ne 窗口标题
- 模块 eq, ne DLL 名称
- 注意: 当查询远程计算机时,不支持 "WINDOWTITLE" 和 "STATUS"
- 筛选器。
- Examples:
- TASKLIST
- TASKLIST /M
- TASKLIST /V /FO CSV
- TASKLIST /SVC /FO LIST
- TASKLIST /APPS /FI "STATUS eq RUNNING"
- TASKLIST /M wbem*
- TASKLIST /S system /FO LIST
- TASKLIST /S system /U 域\用户名 /FO CSV /NH
- TASKLIST /S system /U username /P password /FO TABLE /NH
- TASKLIST /FI "USERNAME ne NT AUTHORITY\SYSTEM" /FI "STATUS eq running"
当然解决问题只用了 tasklist /m filename.dll 一个命令就解决了,示例如下:
- F:\>tasklist /m msctf.dll
- 映像名称 PID 模块
- ========================= ======== ============================================
- svchost.exe 5844 MSCTF.dll
- igfxEM.exe 16560 MSCTF.dll
- igfxHK.exe 11336 MSCTF.dll
- igfxTray.exe 1060 MSCTF.dll
- explorer.exe 9848 MSCTF.dll
- taskhostw.exe 10932 MSCTF.dll
- ShellExperienceHost.exe 1684 msctf.dll
- SearchUI.exe 16576 msctf.dll
- RuntimeBroker.exe 16440 MSCTF.dll
- ApplicationFrameHost.exe 11612 MSCTF.dll
- SynTPEnh.exe 10604 MSCTF.dll
- WindowsInternal.Composabl 14508 msctf.dll
- MSASCuiL.exe 5724 MSCTF.dll
- RAVCpl64.exe 7132 MSCTF.dll
- Video.UI.exe 12716 msctf.dll
- ... //后续较多,故省略。
二、常用用法
1、查看本机进程
在"命令提示符"中输入Tasklist命令即可显示本机的所有进程(见下图)。本机的显示结果由5部分组成:图像名(进程名)、PID、会话名、会话#和内存使用。
- F:\>tasklist
- 映像名称 PID 会话名 会话# 内存使用
- ========================= ======== ================ =========== ============
- System Idle Process 0 Services 0 8 K
- System 4 Services 0 24 K
- Registry 120 Services 0 15,936 K
- smss.exe 416 Services 0 520 K
- csrss.exe 664 Services 0 1,968 K
- wininit.exe 768 Services 0 2,536 K
- services.exe 844 Services 0 5,836 K
- lsass.exe 864 Services 0 12,052 K
- svchost.exe 384 Services 0 568 K
- svchost.exe 596 Services 0 23,896 K
- fontdrvhost.exe 628 Services 0 936 K
- svchost.exe 1048 Services 0 11,536 K
- svchost.exe 1088 Services 0 5,008 K
- svchost.exe 1304 Services 0 5,528 K
- svchost.exe 1312 Services 0 7,152 K
- svchost.exe 1368 Services 0 4,944 K
- ... //进程太多,省略后续
2.查看远程系统的进程
在命令提示符下输入 以下命令:
- F:\>Tasklist /s 220.25.122.21 /u admin /p admin123
- >命令说明
- 220.25.122.21 //远程系统的进程 ip 地址
- /u admin // admin 为Tasklist命令使用的用户账号,它必须是远程系统上的一个合法账号
- /p admin123 // Tasklist命令使用的用户账号对应的密码
注意:使用Tasklist命令查看远程系统的进程时,需要远程机器的RPC服务的支持,否则,该命令不能正常使用。
3.查看系统进程提供的服务
Tasklist命令不但可以查看系统进程,而且还可以查看每个进程提供的服务。如查看本机进程 SVCHOST.EXE 提供的服务,在命令提示符下输入如下命令。可以看到,有很多个SVCHOST.EXE 进程,对应很多项服务使用这个进程。
- F:\>Tasklist /svchost
- 映像名称 PID 服务
- ========================= ======== ============================================
- System Idle Process 0 暂缺
- System 4 暂缺
- Registry 120 暂缺
- smss.exe 416 暂缺
- csrss.exe 664 暂缺
- wininit.exe 768 暂缺
- services.exe 844 暂缺
- lsass.exe 864 KeyIso, SamSs, VaultSvc
- svchost.exe 384 PlugPlay
- svchost.exe 596 BrokerInfrastructure, DcomLaunch, Power, SystemEventsBroker
- fontdrvhost.exe 628 暂缺
- svchost.exe 1048 RpcEptMapper, RpcSs
- svchost.exe 1088 LSM
- svchost.exe 1304 bthserv
- svchost.exe 1312 BthAvctpSvc
- svchost.exe 1368 NcbService
- svchost.exe 1388 TimeBrokerSvc
- svchost.exe 1528 Schedule
- svchost.exe 1568 hidserv
- svchost.exe 1576 BFE, CoreMessagingRegistrar, mpssvc
- svchost.exe 1652 ProfSvc
- svchost.exe 1728 EventLog
- ...... //省略后续
对于远程系统来说,查看系统服务也很简单,使用 Tasklist /s 220.25.122.21 /u admin /p admin123 /svc 命令,就可以查看IP地址为 220.25.122.21 的远程系统进程所提供的服务。
4.查看调用DLL模块文件的进程列表
要查看本地系统中哪些进程调用了 shell32.dll 模块文件,只需在命令提示符下输入 Tasklist /m shell32.dll 即可显示这些进程的列表。
上文已经给过演示,参考下即可。
5.使用筛选器查找指定的进程
在命令提示符下输入 TASKLIST /FI USERNAME ne NT AUTHORITY\SYSTEM /FI STATUS eq running ,就可以列出系统中正在运行的非 SYSTEM 状态的所有进程。其中/FI为筛选器参数,ne 和 eq 为关系运算符 "不相等" 和 "相等" 。
6、结束进程
1) Tasklist
谈到Tasklist命令,我们就不得不提到它的孪生兄弟Taskkill命令,顾名思义,它是用来关掉进程的。
要关掉本机的notepad.exe进程,有两种方法
- 先使用Tasklist查找它的PID,假设系统显示本机 notepad.exe ( notepad.exe 是个病毒性程序,很难删除,一般在C:/windows/system32下)进程的 PID 值为 1132,然后运行Taskkill /pid 1132命令即可。其中 /pid 参数后面是要终止进程的PID值。
- 直接运行taskkill /IM notepad.exe 命令,其中/IM参数后面为进程的图像名。
详细用法如下:
- F:\>help taskkill
- TASKKILL [/S system [/U username [/P [password]]]]
- { [/FI filter] [/PID processid | /IM imagename] } [/T] [/F]
- 描述:
- 使用该工具按照进程 ID (PID) 或映像名称终止任务。
- 参数列表:
- /S system 指定要连接的远程系统。
- /U [domain\]user 指定应该在哪个用户上下文执行这个命令。
- /P [password] 为提供的用户上下文指定密码。如果忽略,提示
- 输入。
- /FI filter 应用筛选器以选择一组任务。
- 允许使用 "*"。例如,映像名称 eq acme*
- /PID processid 指定要终止的进程的 PID。
- 使用 TaskList 取得 PID。
- /IM imagename 指定要终止的进程的映像名称。通配符 '*'可用来
- 指定所有任务或映像名称。
- /T 终止指定的进程和由它启用的子进程。
- /F 指定强制终止进程。
- /? 显示帮助消息。
- 筛选器:
- 筛选器名 有效运算符 有效值
- ----------- --------------- -------------------------
- STATUS eq, ne RUNNING |
- NOT RESPONDING | UNKNOWN
- IMAGENAME eq, ne 映像名称
- PID eq, ne, gt, lt, ge, le PID 值
- SESSION eq, ne, gt, lt, ge, le 会话编号。
- CPUTIME eq, ne, gt, lt, ge, le CPU 时间,格式为
- hh:mm:ss。
- hh - 时,
- mm - 分,ss - 秒
- MEMUSAGE eq, ne, gt, lt, ge, le 内存使用量,单位为 KB
- USERNAME eq, ne 用户名,格式为 [domain\]user
- MODULES eq, ne DLL 名称
- SERVICES eq, ne 服务名称
- WINDOWTITLE eq, ne 窗口标题
- 说明
- ----
- 1) 只有在应用筛选器的情况下,/IM 切换才能使用通配符 '*'。
- 2) 远程进程总是要强行 (/F) 终止。
- 3) 当指定远程机器时,不支持 "WINDOWTITLE" 和 "STATUS" 筛选器。
- 例如:
- TASKKILL /IM notepad.exe
- TASKKILL /PID 1230 /PID 1241 /PID 1253 /T
- TASKKILL /F /IM cmd.exe /T
- TASKKILL /F /FI "PID ge 1000" /FI "WINDOWTITLE ne untitle*"
- TASKKILL /F /FI "USERNAME eq NT AUTHORITY\SYSTEM" /IM notepad.exe
- TASKKILL /S system /U 域\用户名 /FI "用户名 ne NT*" /IM *
- TASKKILL /S system /U username /P password /FI "IMAGENAME eq note*"
2)、NTSD
系统 debug 级的 ntsd,很多进程 Taskkill 是杀不了的,但是用ntsd就可以,基本上除了WINDOWS 系统自己的管理进程, ntsd 都可以杀掉,不过有些 rootkit 级别的超级木马就无能为力了,不过幸好这类木马还是很少的。
1、利用进程的PID结束进程
命令格式:ntsd -c q -p pid
命令范例: ntsd -c q -p 1332 (结束explorer.exe进程)
2、利用进程名结束进程
命令格式:ntsd -c q -pn ***.exe (***.exe 为进程名,exe不能省)
以上是对于 windows 平台进程相关的一些命令以及相关问题的整理回顾。
1、文章参考
https://www.cnblogs.com/leipei2352/archive/2013/02/05/2892482.html