- 注册时间
 - 2021-4-16
 
- 最后登录
 - 2023-8-13
 
- 在线时间
 - 4 小时
 
 
 
 
 
编程入门 
  
	- 龙马币
 - 48 
 
 
 
 
 | 
 
 
没什么技术含量,只是突然用到了,然后写出来,又突然想到看流星了,然后又发上来, 
 
一想到长期潜水,看帖不回就羞愧的不要不要的; 
 
 
- //通过进程PID来获取目标模块路径;
 
 - NTSTATUS GetModulesPathByProcessID (IN HANDLE ProcessId, IN WCHAR* ModuleName, OUT WCHAR* ModulesPath) {
 
 -     typedef PPEB (__stdcall * pfn_PsGetProcessPeb) (PEPROCESS pEProcess);
 
 -     typedef PPEB32 (__stdcall * pfn_PsGetProcessWow64Process) (PEPROCESS Process);
 
 -     NTSTATUS nStatus;
 
 -     KAPC_STATE KAPC = { 0 };
 
 -     PEPROCESS  pEProcess = NULL; //EPROCESS结构指针;
 
 -     PPEB pPEB = NULL; //PEB结构指针;
 
 -     UNICODE_STRING uniFunctionName; //查找的函数名称;
 
 -     PLDR_DATA_TABLE_ENTRY pLdrDataEntry = NULL; //LDR链表入口;
 
 -     PLIST_ENTRY pListEntryStart = NULL; //链表头节点、尾节点;
 
 -     PLIST_ENTRY pListEntryEnd = NULL;
 
 -     //函数指针;
 
 -     pfn_PsGetProcessPeb  PsGetProcessPeb = NULL;
 
 -     //获取进程的EPROCESS结构指针;
 
 -     nStatus = PsLookupProcessByProcessId (ProcessId, &pEProcess);
 
 -     if (!NT_SUCCESS (nStatus)) {
 
 -         return STATUS_UNSUCCESSFUL;
 
 -     }
 
 -     //查找函数地址;
 
 -     RtlInitUnicodeString (&uniFunctionName, L"PsGetProcessPeb");
 
 -     PsGetProcessPeb = (pfn_PsGetProcessPeb) (SIZE_T)MmGetSystemRoutineAddress (&uniFunctionName);
 
 -     pPEB = PsGetProcessPeb (pEProcess);
 
 -     KeStackAttachProcess (pEProcess, &KAPC);
 
 -     pListEntryStart = pPEB->Ldr->InMemoryOrderModuleList.Flink;
 
 -     pListEntryEnd = pPEB->Ldr->InMemoryOrderModuleList.Flink;
 
 -     do {//输出DLL全路径;
 
 -         pLdrDataEntry = (PLDR_DATA_TABLE_ENTRY)CONTAINING_RECORD (pListEntryStart, LDR_DATA_TABLE_ENTRY, InMemoryOrderLinks);
 
 -         //KdPrint (("module:%wZ\n", &pLdrDataEntry->BaseDllName));
 
 -         if (_wcsicmp (pLdrDataEntry->BaseDllName.Buffer, ModuleName) == 0) {
 
 -             wcscpy (ModulesPath, pLdrDataEntry->FullDllName.Buffer);
 
 -             goto end;
 
 -         }
 
 -         pListEntryStart = pListEntryStart->Flink;
 
 -     } while (pListEntryStart != pListEntryEnd);
 
 - #ifdef _AMD64_// 或wow64进程;
 
 -     PPEB32 pPEB32 = NULL; //PEB结构指针;
 
 -     PLDR_DATA_TABLE_ENTRY32 pLdrDataEntry32 = NULL; //LDR链表入口;
 
 -     PLIST_ENTRY32 pListEntryStart32 = NULL; //链表头节点、尾节点;
 
 -     PLIST_ENTRY32 pListEntryEnd32 = NULL;
 
 -     //函数指针;
 
 -     pfn_PsGetProcessWow64Process PsGetProcessWow64Process = NULL;
 
 -     RtlInitUnicodeString (&uniFunctionName, L"PsGetProcessWow64Process");
 
 -     PsGetProcessWow64Process = (pfn_PsGetProcessWow64Process) (SIZE_T)MmGetSystemRoutineAddress (&uniFunctionName);
 
 -     //获取PEB指针
 
 -     pPEB32 = PsGetProcessWow64Process (pEProcess);
 
 -     pListEntryStart32 = (PLIST_ENTRY32) (((PEB_LDR_DATA32*)pPEB32->Ldr)->InMemoryOrderModuleList.Flink);
 
 -     pListEntryEnd32 = (PLIST_ENTRY32) (((PEB_LDR_DATA32*)pPEB32->Ldr)->InMemoryOrderModuleList.Flink);
 
 -     do {//输出DLL全路径;
 
 -         pLdrDataEntry32 = (PLDR_DATA_TABLE_ENTRY32)CONTAINING_RECORD (pListEntryStart32, LDR_DATA_TABLE_ENTRY32, InMemoryOrderLinks);
 
 -         //KdPrint (("wow64:%ws\n", pLdrDataEntry32->BaseDllName.Buffer));
 
 -         if (_wcsicmp ((WCHAR*)pLdrDataEntry32->BaseDllName.Buffer, ModuleName) == 0) {
 
 -             wcscpy (ModulesPath, (WCHAR*)pLdrDataEntry32->FullDllName.Buffer);
 
 -             goto end;
 
 -         }
 
 -         pListEntryStart32 = (PLIST_ENTRY32)pListEntryStart32->Flink;
 
 -     } while (pListEntryStart32 != pListEntryEnd32);
 
 - #endif
 
 - end:
 
 -     KeUnstackDetachProcess (&KAPC);
 
 -     ObDereferenceObject (pEProcess);
 
 -     return STATUS_SUCCESS;
 
 - }
 
 
  复制代码 
 
附上用到的几个结构 
- typedef struct _PEB {
 
 -     UCHAR InheritedAddressSpace;
 
 -     UCHAR ReadImageFileExecOptions;
 
 -     UCHAR BeingDebugged;
 
 -     UCHAR Spare;
 
 -     PVOID Mutant;
 
 -     PVOID ImageBaseAddress;
 
 -     PPEB_LDR_DATA Ldr;
 
 -     PRTL_USER_PROCESS_PARAMETERS  ProcessParameters;
 
 -     PVOID SubSystemData;
 
 - } PEB, *PPEB;
 
 - //专为WoW64准备;
 
 - typedef struct _PEB32 {
 
 -     UCHAR InheritedAddressSpace;
 
 -     UCHAR ReadImageFileExecOptions;
 
 -     UCHAR BeingDebugged;
 
 -     UCHAR Spare;
 
 -     ULONG Mutant;
 
 -     ULONG ImageBaseAddress;
 
 -     ULONG/*PPEB_LDR_DATA32*/ Ldr;
 
 - } PEB32, *PPEB32;
 
  
- typedef struct _PEB_LDR_DATA {
 
 -     ULONG Length;
 
 -     UCHAR Initialized;
 
 -     PVOID SsHandle;
 
 -     LIST_ENTRY InLoadOrderModuleList;
 
 -     LIST_ENTRY InMemoryOrderModuleList;
 
 -     LIST_ENTRY InInitializationOrderModuleList;
 
 -     PVOID EntryInProgress;
 
 - } PEB_LDR_DATA, *PPEB_LDR_DATA;
 
 - //专为WoW64准备;
 
 - typedef struct _PEB_LDR_DATA32 {
 
 -     ULONG Length;
 
 -     UCHAR 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_ENTRY {
 
 -     LIST_ENTRY InLoadOrderLinks;
 
 -     LIST_ENTRY InMemoryOrderLinks;
 
 -     LIST_ENTRY InInitializationOrderLinks;
 
 -     PVOID DllBase;
 
 -     PVOID EntryPoint;
 
 -     ULONG SizeOfImage;
 
 -     UNICODE_STRING FullDllName;
 
 -     UNICODE_STRING BaseDllName;
 
 -     ULONG Flags;
 
 -     USHORT LoadCount;
 
 -     USHORT TlsIndex;
 
 -     LIST_ENTRY HashLinks;
 
 -     PVOID SectionPointer;
 
 -     ULONG CheckSum;
 
 -     ULONG TimeDateStamp;
 
 -     PVOID LoadedImports;
 
 -     PVOID EntryPointActivationContext;
 
 -     PVOID PatchInformation;
 
 -     LIST_ENTRY ForwarderLinks;
 
 -     LIST_ENTRY ServiceTagLinks;
 
 -     LIST_ENTRY StaticLinks;
 
 -     PVOID ContextInformation;
 
 -     PVOID OriginalBase;
 
 -     LARGE_INTEGER LoadTime;
 
 - } LDR_DATA_TABLE_ENTRY, *PLDR_DATA_TABLE_ENTRY;
 
 - //专为WoW64准备;
 
 - typedef struct _LDR_DATA_TABLE_ENTRY32 {
 
 -     LIST_ENTRY32 InLoadOrderLinks;
 
 -     LIST_ENTRY32 InMemoryOrderLinks;
 
 -     LIST_ENTRY32 InInitializationOrderLinks;
 
 -     ULONG DllBase;
 
 -     ULONG EntryPoint;
 
 -     ULONG SizeOfImage;
 
 -     UNICODE_STRING32 FullDllName;
 
 -     UNICODE_STRING32 BaseDllName;
 
 -     ULONG Flags;
 
 -     USHORT LoadCount;
 
 -     USHORT TlsIndex;
 
 -     LIST_ENTRY32 HashLinks;
 
 -     ULONG SectionPointer;
 
 -     ULONG CheckSum;
 
 -     ULONG TimeDateStamp;
 
 -     ULONG LoadedImports;
 
 -     ULONG EntryPointActivationContext;
 
 -     ULONG PatchInformation;
 
 -     LIST_ENTRY32 ForwarderLinks;
 
 -     LIST_ENTRY32 ServiceTagLinks;
 
 -     LIST_ENTRY32 StaticLinks;
 
 -     ULONG ContextInformation;
 
 -     ULONG OriginalBase;
 
 -     LARGE_INTEGER LoadTime;
 
 - } LDR_DATA_TABLE_ENTRY32, *PLDR_DATA_TABLE_ENTRY32; 
 
 
  复制代码 
 |   
 
 
 
 |