拡張カーネルの DLL参照数 / LoadCount のバグ
Microsoft Safety Scanner がクラッシュするという報告があったので調べてみたところ…。
ADVAPI32.DLL のVista以降の関数をロードして失敗したときに処理される FreeLibrary で、
ADVAPI32.DLL が解放されることが判明。n
あれ、そもそも、 静的ロードされたDLLってアンロードできないんじゃ?
というわけで、スペシャルねこまんまで確認してみたところ…。

あれ…ADVAPI32.DLL の参照カウントが途中から 2になってる!?
もしかして、GetModuleHandleEx のバグ?!
c++ – DLL LoadCount on Windows 8 – Stack Overflow
| int GetModuleLoadCount() { DWORD dwBytesRead = 0; PROCESS_BASIC_INFORMATION PBI; HANDLE ProcessHandle = GetCurrentProcess(); if (MyZwQueryInformationProcess(ProcessHandle, 0, &PBI, sizeof(PROCESS_BASIC_INFORMATION), &dwBytesRead) >= 0) { PEB_LDR_DATA LdrData; LDR_MODULE LdrModule; PPEB_LDR_DATA pLdrData = NULL; PLDR_MODULE pLdrModule = NULL; char* LdrDataOffset = reinterpret_cast<char*>(PBI.PebBaseAddress) + offsetof(PEB, Ldr); LIST_ENTRY* Head = LdrData.InMemoryOrderModuleList.Flink; do if (ReadProcessMemory(ProcessHandle, Base, &LdrEntry, sizeof(LdrEntry), &dwBytesRead)) if (LdrEntry.DllBase && LdrModule.BaseAddress) Head = LdrEntry.InMemoryOrderLinks.Flink; |
これは良いプログラム・ω・
GetModuleHandleEx
でGET_MODULE_HANDLE_EX_FLAG_UNCHANGED_REFCOUNT フラグを指定した場合は問題ないものの…。
指定しなかった場合、 参照カウンタが FFFF からインクリメントされて0になってしまうことが判明ww
あー、これはだめだw
| >loadcount2.exe
Name: ntdll.dll(D:\WINNT\system32\ntdll.dll) Name: KERNEL32.dll(D:\WINNT\system32\KERNEL32.dll) Name: ADVAPI32.dll(D:\WINNT\system32\ADVAPI32.dll) Name: RPCRT4.dll(D:\WINNT\system32\RPCRT4.dll) |
という訳で続きます・ω・;


Comments