使用windbg,通过
!dlls
命令获取带有加载计数的dll列表。观察到许多加载的 dll 的加载计数为0x0000ffff
。
这是默认值吗? 0x00262fa8: C:\WINDOWS\system32\ole32.dll
Base 0x774e0000 EntryPoint 0x774fd0b9 Size 0x0013d000
Flags 0x80084006` LoadCount 0x0000ffff TlsIndex 0x00000000
LDRP_STATIC_LINK
LDRP_IMAGE_DLL
LDR**strong text**P_ENTRY_PROCESSED
LDRP_PROCESS_ATTACH_CALLED
DLL 的加载计数是一个 16 位值。如果该值(被视为有符号短整型)为 -1 (0xfffff),则表示 DLL 是静态链接的,否则是动态加载的。
所选答案的附加信息:
如果 DLL 不是静态链接的(不存在 LDRP_STATIC_LINK 标志),也可能意味着 DLL 可能使用 GetModuleHandleExA 加载了 GET_MODULE_HANDLE_EX_FLAG_PIN 标志,导致引用计数为 0xffff。无论 FreeLibrary 被调用多少次,这都可以防止卸载 DLL。