LDR_MODULE.LoadCount が Windows 8 のどこにあるか知っている人はいますか?
次のコードでは、参照カウントとして常に 6 が出力されます。RemoteDLLTool とベースアドレスで確認したところ、他のすべての情報は正しいものでした。ただし、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で同じことをする方法についてのアイデアはありますか?