FORCEINLINE
NTSTATUS
PhGetProcessBasicInformation(
_In_ HANDLE ProcessHandle,
_Out_ PPROCESS_BASIC_INFORMATION BasicInformation
)
{
return NtQueryInformationProcess(
ProcessHandle,
ProcessBasicInformation,
BasicInformation,
sizeof(PROCESS_BASIC_INFORMATION),
NULL
);
}
#define FIELD_OFFSET(type, field) ((LONG)(LONG_PTR)&(((type *)0)->field))
#define UFIELD_OFFSET(type, field) ((DWORD)(LONG_PTR)&(((type *)0)->field))
#define PTR_ADD_OFFSET(Pointer, Offset) ((PVOID)((ULONG_PTR)(Pointer) + (ULONG_PTR)(Offset)))
NTSTATUS PhpEnumProcessModules(
_In_ HANDLE ProcessHandle,
// _In_ PPHP_ENUM_PROCESS_MODULES_CALLBACK Callback,
_In_opt_ PVOID Context1,
_In_opt_ PVOID Context2
)
{
NTSTATUS status;
PROCESS_BASIC_INFORMATION basicInfo;
PPEB_LDR_DATA ldr;
PEB_LDR_DATA pebLdrData;
PLIST_ENTRY startLink;
PLIST_ENTRY currentLink;
ULONG dataTableEntrySize;
LDR_DATA_TABLE_ENTRY currentEntry;
ULONG i;
// Get the PEB address.
status = PhGetProcessBasicInformation(ProcessHandle, &basicInfo);
if (!NT_SUCCESS(status))
return status;
// Read the address of the loader data.
status = NtReadVirtualMemory(
ProcessHandle,
PTR_ADD_OFFSET(basicInfo.PebBaseAddress, FIELD_OFFSET(PEB, Ldr)),
&ldr,
sizeof(PVOID),
NULL
);
if (!NT_SUCCESS(status))
return status;
// Read the loader data.
status = NtReadVirtualMemory(
ProcessHandle,
ldr,
&pebLdrData,
sizeof(PEB_LDR_DATA),
NULL
);
if (!NT_SUCCESS(status))
return status;
if (!pebLdrData.Initialized)
return STATUS_UNSUCCESSFUL;
// if (WindowsVersion >= WINDOWS_8)
dataTableEntrySize = LDR_DATA_TABLE_ENTRY_SIZE_WIN8;
//else
// dataTableEntrySize = LDR_DATA_TABLE_ENTRY_SIZE_WIN7;
// Traverse the linked list (in load order).
i = 0;
startLink = (PLIST_ENTRY)PTR_ADD_OFFSET(ldr, FIELD_OFFSET(PEB_LDR_DATA, InLoadOrderModuleList));
currentLink = pebLdrData.InLoadOrderModuleList.Flink;
#define PH_ENUM_PROCESS_MODULES_LIMIT 0x800
while (
currentLink != startLink &&
i <= PH_ENUM_PROCESS_MODULES_LIMIT
)
{
PVOID addressOfEntry;
addressOfEntry = CONTAINING_RECORD(currentLink, LDR_DATA_TABLE_ENTRY, InLoadOrderLinks);
status = NtReadVirtualMemory(
ProcessHandle,
addressOfEntry,
¤tEntry,
dataTableEntrySize,
NULL
);
if (!NT_SUCCESS(status))
return status;
printf("name : %S \n", currentEntry.FullDllName.Buffer);
// Make sure the entry is valid.
if (currentEntry.DllBase)
{
// Execute the callback.
//if (!Callback(
// ProcessHandle,
// ¤tEntry,
// addressOfEntry,
// Context1,
// Context2
//))
// break;
}
currentLink = currentEntry.InLoadOrderLinks.Flink;
i++;
}
return status;
}
ProcessHaceker 进程模块枚举
最新推荐文章于 2024-06-07 12:27:53 发布