- 注册时间
- 2021-4-16
- 最后登录
- 2023-6-21
- 在线时间
- 2 小时
编程入门
- 龙马币
- 38
|
- #pragma pack(4)
- typedef struct _UNICODE_STRING32
- {
- USHORT Length;
- USHORT MaximumLength;
- ULONG Buffer;
- } UNICODE_STRING32, *PUNICODE_STRING32;
- typedef struct _PEB32
- {
- UCHAR InheritedAddressSpace;
- UCHAR ReadImageFileExecOptions;
- UCHAR BeingDebugged;
- UCHAR BitField;
- ULONG Mutant;
- ULONG ImageBaseAddress;
- ULONG Ldr;
- ULONG ProcessParameters;
- ULONG SubSystemData;
- ULONG ProcessHeap;
- ULONG FastPebLock;
- ULONG AtlThunkSListPtr;
- ULONG IFEOKey;
- ULONG CrossProcessFlags;
- ULONG UserSharedInfoPtr;
- ULONG SystemReserved;
- ULONG AtlThunkSListPtr32;
- ULONG ApiSetMap;
- } PEB32, *PPEB32;
- typedef struct _PEB_LDR_DATA32
- {
- ULONG Length;
- BOOLEAN Initialized;
- ULONG SsHandle;
- LIST_ENTRY32 InLoadOrderModuleList;
- LIST_ENTRY32 InMemoryOrderModuleList;
- LIST_ENTRY32 InInitializationOrderModuleList;
- ULONG EntryInProgress;
- } PEB_LDR_DATA32, *PPEB_LDR_DATA32;
- typedef struct _LDR_DATA_TABLE_ENTRY32
- {
- LIST_ENTRY32 InLoadOrderLinks;
- LIST_ENTRY32 InMemoryOrderModuleList;
- LIST_ENTRY32 InInitializationOrderModuleList;
- ULONG DllBase;
- ULONG EntryPoint;
- ULONG SizeOfImage;
- UNICODE_STRING32 FullDllName;
- UNICODE_STRING32 BaseDllName;
- ULONG Flags;
- USHORT LoadCount;
- USHORT TlsIndex;
- union
- {
- LIST_ENTRY32 HashLinks;
- ULONG SectionPointer;
- };
- ULONG CheckSum;
- union
- {
- ULONG TimeDateStamp;
- ULONG LoadedImports;
- };
- ULONG EntryPointActivationContext;
- ULONG PatchInformation;
- } LDR_DATA_TABLE_ENTRY32, *PLDR_DATA_TABLE_ENTRY32;
- #pragma pack()
- #pragma pack(8)
- typedef struct _PROCESS_BASIC_INFORMATION64 {
- ULONG64 ExitStatus;
- ULONG64 PebBaseAddress;
- ULONG64 AffinityMask;
- ULONG64 BasePriority;
- ULONG64 UniqueProcessId;
- ULONG64 InheritedFromUniqueProcessId;
- } PROCESS_BASIC_INFORMATION64, *PPROCESS_BASIC_INFORMATION64;
- typedef struct _PEB64
- {
- UCHAR InheritedAddressSpace;
- UCHAR ReadImageFileExecOptions;
- UCHAR BeingDebugged;
- UCHAR BitField;
- ULONG64 Mutant;
- ULONG64 ImageBaseAddress;
- ULONG64 Ldr;
- ULONG64 ProcessParameters;
- ULONG64 SubSystemData;
- ULONG64 ProcessHeap;
- ULONG64 FastPebLock;
- ULONG64 AtlThunkSListPtr;
- ULONG64 IFEOKey;
- ULONG64 CrossProcessFlags;
- ULONG64 UserSharedInfoPtr;
- ULONG SystemReserved;
- ULONG AtlThunkSListPtr32;
- ULONG64 ApiSetMap;
- } PEB64, *PPEB64;
- typedef struct _PEB_LDR_DATA64
- {
- ULONG Length;
- BOOLEAN Initialized;
- ULONG64 SsHandle;
- LIST_ENTRY64 InLoadOrderModuleList;
- LIST_ENTRY64 InMemoryOrderModuleList;
- LIST_ENTRY64 InInitializationOrderModuleList;
- ULONG64 EntryInProgress;
- } PEB_LDR_DATA64, *PPEB_LDR_DATA64;
- typedef struct _UNICODE_STRING64
- {
- USHORT Length;
- USHORT MaximumLength;
- ULONG64 Buffer;
- } UNICODE_STRING64, *PUNICODE_STRING64;
- typedef struct _LDR_DATA_TABLE_ENTRY64
- {
- LIST_ENTRY64 InLoadOrderLinks;
- LIST_ENTRY64 InMemoryOrderModuleList;
- LIST_ENTRY64 InInitializationOrderModuleList;
- ULONG64 DllBase;
- ULONG64 EntryPoint;
- ULONG SizeOfImage;
- UNICODE_STRING64 FullDllName;
- UNICODE_STRING64 BaseDllName;
- ULONG Flags;
- USHORT LoadCount;
- USHORT TlsIndex;
- union
- {
- LIST_ENTRY64 HashLinks;
- ULONG64 SectionPointer;
- };
- ULONG CheckSum;
- union
- {
- ULONG TimeDateStamp;
- ULONG64 LoadedImports;
- };
- ULONG64 EntryPointActivationContext;
- ULONG64 PatchInformation;
- } LDR_DATA_TABLE_ENTRY64, *PLDR_DATA_TABLE_ENTRY64;
- #pragma pack()
- ULONG NewEnumProcsssModules(ULONG ProcessId, fnEnumProcessModuleProc fnEnumProc)
- {
- std::wstring ImagePath;
- ULONG nCount = 0;
- HANDLE hProcess = OpenProcess(PROCESS_QUERY_INFORMATION | PROCESS_VM_READ, FALSE, ProcessId);
- if (hProcess)
- {
- if (IsAMD64())
- {
- if (IsWow64())//wow64 read 64bit or 32 bit
- {
- PROCESS_BASIC_INFORMATION64 pbi64 = {0};
- if (NT_SUCCESS(NtWow64QueryInformationProcess64(hProcess, ProcessBasicInformation, &pbi64, sizeof(pbi64), NULL)))
- {
- ULONG64 LdrAddress = 0;
- if (InternalReadVirtualMemory(hProcess, (ULONG64)(pbi64.PebBaseAddress + offsetof(PEB64, Ldr)), sizeof(LdrAddress), &LdrAddress, NULL))
- {
- LIST_ENTRY64 ListEntry = { 0 };
- if (InternalReadVirtualMemory(hProcess, (ULONG64)(LdrAddress + offsetof(PEB_LDR_DATA64, InLoadOrderModuleList)), sizeof(LIST_ENTRY64), &ListEntry, NULL))
- {
- LDR_DATA_TABLE_ENTRY64 CurrentModule = { 0 };
- if (InternalReadVirtualMemory(hProcess, (ULONG64)ListEntry.Flink, sizeof(CurrentModule), &CurrentModule, NULL))
- {
- ULONG64 hFristModule = (ULONG64)CurrentModule.DllBase;
- while (1)
- {
- if (CurrentModule.DllBase)
- {
- ImagePath.resize(CurrentModule.FullDllName.Length / sizeof(WCHAR));
- if (InternalReadVirtualMemory(hProcess, (ULONG64)CurrentModule.FullDllName.Buffer, CurrentModule.FullDllName.Length, (void *)ImagePath.c_str(), NULL))
- {
- nCount += fnEnumProc(ProcessId, (ULONG64)CurrentModule.DllBase, CurrentModule.SizeOfImage, ImagePath.c_str());
- }
- }
- if (!InternalReadVirtualMemory(hProcess, (ULONG64)CurrentModule.InLoadOrderLinks.Flink, sizeof(CurrentModule), &CurrentModule, NULL))
- break;
- if (hFristModule == (ULONG64)CurrentModule.DllBase)
- break;
- }
- }
- }
- }
- }
- }
- else if(!Is64BitProcess(hProcess))//64bit read wow64
- {
- ULONG Peb32 = 0;
- if (NT_SUCCESS(NtQueryInformationProcess(hProcess, ProcessWow64Information, &Peb32, sizeof(Peb32), NULL)))
- {
- ULONG64 LdrAddress = 0;
- if (InternalReadVirtualMemory(hProcess, (ULONG64)Peb32 + offsetof(PEB32, Ldr), sizeof(ULONG), &LdrAddress, NULL))
- {
- LIST_ENTRY32 ListEntry = { 0 };
- if (InternalReadVirtualMemory(hProcess, (ULONG64)(LdrAddress + offsetof(PEB_LDR_DATA32, InLoadOrderModuleList)), sizeof(LIST_ENTRY64), &ListEntry, NULL))
- {
- LDR_DATA_TABLE_ENTRY32 CurrentModule = { 0 };
- if (InternalReadVirtualMemory(hProcess, (ULONG64)ListEntry.Flink, sizeof(CurrentModule), &CurrentModule, NULL))
- {
- PVOID hFirstModule = (PVOID)CurrentModule.DllBase;
- while (1)
- {
- if (CurrentModule.DllBase)
- {
- ImagePath.resize(CurrentModule.FullDllName.Length / sizeof(WCHAR));
- if (InternalReadVirtualMemory(hProcess, (ULONG64)CurrentModule.FullDllName.Buffer, CurrentModule.FullDllName.Length, (void *)ImagePath.c_str(), NULL))
- {
- nCount += fnEnumProc(ProcessId, (ULONG64)CurrentModule.DllBase, CurrentModule.SizeOfImage, ImagePath.c_str());
- }
- }
- if (!InternalReadVirtualMemory(hProcess, (ULONG64)CurrentModule.InLoadOrderLinks.Flink, sizeof(CurrentModule), &CurrentModule, NULL))
- break;
- if (hFirstModule == (PVOID)CurrentModule.DllBase)
- break;
- }
- }
- }
- }
- }
- }
- }//IsAMD64
-
- //Native PEB
- PROCESS_BASIC_INFORMATION pbi = { 0 };
- if (NT_SUCCESS(NtQueryInformationProcess(hProcess, ProcessBasicInformation, &pbi, sizeof(pbi), NULL)))
- {
- ULONG64 LdrAddress = 0;
- if (InternalReadVirtualMemory(hProcess, (ULONG64)pbi.PebBaseAddress + offsetof(PEB, Ldr), sizeof(PVOID), &LdrAddress, NULL))
- {
- LIST_ENTRY ListEntry = { 0 };
- if (InternalReadVirtualMemory(hProcess, (ULONG64)(LdrAddress + offsetof(PEB_LDR_DATA, InLoadOrderModuleList)), sizeof(LIST_ENTRY64), &ListEntry, NULL))
- {
- LDR_DATA_TABLE_ENTRY CurrentModule = { 0 };
- if (InternalReadVirtualMemory(hProcess, (ULONG64)ListEntry.Flink, sizeof(CurrentModule), &CurrentModule, NULL))
- {
- PVOID hFirstModule = CurrentModule.DllBase;
- while (1)
- {
- if (CurrentModule.DllBase)
- {
- ImagePath.resize(CurrentModule.FullDllName.Length / sizeof(WCHAR));
- if (InternalReadVirtualMemory(hProcess, (ULONG64)CurrentModule.FullDllName.Buffer, CurrentModule.FullDllName.Length, (void *)ImagePath.c_str(), NULL))
- {
- nCount += fnEnumProc(ProcessId, (ULONG64)CurrentModule.DllBase, CurrentModule.SizeOfImage, ImagePath.c_str());
- }
- }
- if (!InternalReadVirtualMemory(hProcess, (ULONG64)CurrentModule.InLoadOrderLinks.Flink, sizeof(CurrentModule), &CurrentModule, NULL))
- break;
- if (hFirstModule == CurrentModule.DllBase)
- break;
- }
- }
- }
- }
- }
-
- CloseHandle(hProcess);
- }
- return nCount;
- }
复制代码 |
|