누구든지 LDR_MODULE.LoadCount가 Windows 8에있는 위치를 알고 있습니까?Windows 8의 DLL LoadCount
다음 코드는 참조 수에 대해 항상 6을 인쇄합니다. S RemoteDLLTool을 사용하여 검사했으며 baseaddress 및 기타 모든 정보가 올바른지 확인합니다. 그러나 LoadCount는 항상 6이므로 잘못되었습니다. 6이면 DLL이 동적으로로드되고 -1이면 정적이라는 것을 알았습니다.
끊임없이 ReadProcessMemory를 사용하지 않고도 링크 된 목록을 반복 할 수있는 방법이 있습니까?
어떻게 든 참조 카운트를 알아 내야합니다. 기본적으로 Windows 7의 아래 코드는 DLL이로드 된 횟수 (일명 DLL 참조 횟수)를 알려줍니다.
#include <winternl.h>
typedef struct _LDR_MODULE
{
LIST_ENTRY InLoadOrderModuleList;
LIST_ENTRY InMemoryOrderModuleList;
LIST_ENTRY InInitializationOrderModuleList;
PVOID BaseAddress;
PVOID EntryPoint;
ULONG SizeOfImage;
UNICODE_STRING FullDllName;
UNICODE_STRING BaseDllName;
ULONG Flags;
SHORT LoadCount;
SHORT TlsIndex;
LIST_ENTRY HashTableEntry;
ULONG TimeDateStamp;
} LDR_MODULE, *PLDR_MODULE;
int GetModuleLoadCount()
{
DWORD dwBytesRead = 0;
PROCESS_BASIC_INFORMATION PBI = {0};
HANDLE ProcessHandle = GetCurrentProcess();
if (NT_SUCCESS(NtQueryInformationProcess(ProcessHandle, ProcessBasicInformation, &PBI, sizeof(PBI), &dwBytesRead)))
{
PEB_LDR_DATA LdrData;
LDR_MODULE LdrModule;
PPEB_LDR_DATA pLdrData = nullptr;
PLDR_MODULE pLdrModule = nullptr;
char* LdrDataOffset = reinterpret_cast<char*>(PBI.PebBaseAddress) + offsetof(PEB, Ldr);
ReadProcessMemory(ProcessHandle, LdrDataOffset, &pLdrData, sizeof(pLdrData), &dwBytesRead);
ReadProcessMemory(ProcessHandle, pLdrData, &LdrData, sizeof(LdrData), &dwBytesRead);
LIST_ENTRY* Head = LdrData.InMemoryOrderModuleList.Flink;
LIST_ENTRY* Next = Head;
do
{
LDR_DATA_TABLE_ENTRY LdrEntry;
LDR_DATA_TABLE_ENTRY* Base = CONTAINING_RECORD(Head, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks);
if (ReadProcessMemory(ProcessHandle, Base, &LdrEntry, sizeof(LdrEntry), &dwBytesRead))
{
char* pLdrModuleOffset = reinterpret_cast<char*>(Head) - sizeof(LIST_ENTRY);
ReadProcessMemory(ProcessHandle, pLdrModuleOffset, &pLdrModule, sizeof(pLdrModule), &dwBytesRead);
ReadProcessMemory(ProcessHandle, pLdrModule, &LdrModule, sizeof(LdrModule), &dwBytesRead);
if (LdrEntry.DllBase)
{
std::cout<<"BaseAddress: "<< LdrModule.BaseAddress<<std::endl;
std::cout<<"Reference Count: "<< LdrModule.LoadCount<<std::endl;
}
Head = LdrEntry.InMemoryOrderLinks.Flink;
}
}
while (Head != Next);
}
CloseHandle(ProcessHandle);
return 0;
}
Windows 8에서 동일한 작업을 수행하는 방법에 대한 아이디어가 있으십니까?
DLL로드 횟수를 읽는 것이 해결책이라고 생각하는 문제는 무엇입니까? –
아 .. 그냥 DLL이 프로세스에서로드 된 횟수를 확인하고 싶습니다. 저는 주입을하고 있었고 LdrUnloadDll을 호출하여 DLL 수가 많은 것으로 언로드 할 수 있기를 원했습니다. – Brandon
음,로드하지 않은 DLL을 비우는 것이 최고의 엔지니어링 디자인이 아닙니다. –