存在于进程地址空间中的模块

逆向工程 视窗 记忆 数字取证
2021-06-12 10:51:14

使用易失性检查内存转储中的 services.exe 进程,我构建了一个加载到进程空间中的 dll 列表。(模块来自 InLoadOrder 模块列表)

这只是摘录(完整列表:http : //pastie.org/8560797):

0x5b860000 netapi32.dll
FileObject @8a3cb028, Name: \WINDOWS\system32\netapi32.dll

0x77f60000 shlwapi.dll
FileObject @8a3e0df0, Name: \WINDOWS\system32\shlwapi.dll

如您所见,进程中加载​​了 shlwapi.dll。感谢 DependencyWalker(查看 services.exe 的导入),我发现了 shlwapi.dll 是如何加载的。( -> 表示进口)

netapi.dll -> dnsapi.dll -> iphlpapi.dll -> mprapi.dll -> setupapi.dll -> shlapi.dll

但只加载了 netapi.dll。dnsapi.dll 没有加载,在 InLoadOrder 模块列表中没有它的条目,也没有加载来自上述“依赖链”的任何其他 dll。

这不仅适用于 shlapi.dll,也适用于许多其他加载的 dll。例如:shell32.dll、psapi.dll... 也不会只发生在services.exe进程中。

知道为什么将这些 dll 加载到进程中吗?

非常感谢任何帮助,问候!

1个回答

netapi.dll 可能已经加载了 dnsapi.dll 以进行一些网络检查,然后在完成时释放 DLL。但是,shlwapi.dll 可能会因为任何原因保存一些对象的句柄,或者由于循环加载而具有非零引用计数,因此即使在其他 DLL 卸载后仍保留在内存中。卸载请求并不能保证它会得到满足,也不会阻止请求者首先卸载。user32.dll 是另一个通常显示此行为的 DLL。