如何查看进程中所有曾加载(含已卸载)的DLL?
查看进程中所有曾加载(含已卸载)的DLL的方法
由于无法实时挂钩,只能通过事后分析内存、系统日志或专用工具来追踪已卸载的DLL,以下是几种可行方案:
分析进程完整内存转储
- 生成目标进程的完整内存dump:打开任务管理器,找到目标进程→右键→「创建转储文件」,转储完成后会给出文件路径。
- 用WinDbg加载该dump文件,执行以下命令:
!unloadedmodules:如果系统提前开启了卸载模块跟踪(需在注册表HKLM\SYSTEM\CurrentControlSet\Control\Session Manager\Memory Management添加TrackUnloadedModulesDWORD值为1,重启生效),该命令会直接列出进程中已卸载的模块记录。!vad:遍历进程的虚拟地址描述符,查找包含PE头特征的内存区域——即使DLL已卸载,部分未被回收的内存块可能仍残留DLL的标识信息。!peb:查看进程环境块(PEB)的加载模块链表,部分已卸载但未完全清理的DLL可能还会留在链表的残留节点中。
使用Process Hacker查看已卸载模块
打开Process Hacker,找到目标进程→右键→「属性」→切换到「模块」标签页,勾选界面底部的「显示已卸载模块」选项,即可看到进程曾经加载过的所有DLL(包括已卸载的)。系统内存取证工具Volatility分析
若能获取系统的完整内存dump,可使用Volatility工具扫描内存中的模块残留:- 执行
volatility -f [系统dump路径] --profile=[对应系统版本] modscan:扫描内存中所有包含PE头的模块,即使已被卸载,只要内存未被覆盖就能被检测到。 - 执行
volatility -f [系统dump路径] --profile=[对应系统版本] dlllist:列出所有进程的当前加载模块,结合其他扫描结果交叉验证已卸载的DLL。
- 执行
检查系统事件日志
部分场景下Windows会记录模块加载/卸载事件,可通过事件查看器或命令行查询:- 打开事件查看器→导航到「Windows日志」→「应用程序和服务日志」→「Microsoft」→「Windows」→「Diagnostics-Performance」→「Operational」,查找Event ID为100或与模块加载相关的事件。
- 命令行查询:
wevtutil qe Microsoft-Windows-Diagnostics-Performance/Operational /q:"*[System[EventID=100]]" /f:text,筛选出相关模块记录。
注意:所有方法都无法保证100%恢复所有已卸载的DLL,若DLL卸载后对应的内存区域被完全覆盖或回收,就无法追踪到相关信息。
内容的提问来源于stack exchange,提问作者qxseb
相关产品推荐
相关产品推荐

