首页
社区
课程
招聘
[分享]内核遍历r3进程模块,获取信息(32,64,WoW64)
发表于: 2016-10-23 00:36 8915

[分享]内核遍历r3进程模块,获取信息(32,64,WoW64)

2016-10-23 00:36
8915
没什么技术含量,只是突然用到了,然后写出来,又突然想到看雪了,然后又发上来,
一想到长期潜水,看帖不回就羞愧的不要不要的;

//通过进程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;

[课程]FART 脱壳王!加量不加价!FART作者讲授!

收藏
免费 0
支持
分享
最新回复 (9)
雪    币: 12848
活跃值: (9108)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
2
PsGetProcessPeb 这个可以声明一下直接用。。因为是内核必定导出的
2016-10-23 09:35
0
雪    币: 39
活跃值: (158)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
_PEB 等结构体在不同的系统下一样的吗?
2016-10-23 09:53
0
雪    币: 12848
活跃值: (9108)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
4
目前看来是一样的。。以后估计微软也不会改这个结构体,否则要死一大片程序
2016-10-23 09:57
0
雪    币: 2305
活跃值: (4554)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
我想说能给出完整 源码吗 ··函数 结构定义都找死人·
2016-10-23 13:49
0
雪    币: 95
活跃值: (134)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
6
受教了;;
2016-10-23 22:49
0
雪    币: 95
活跃值: (134)
能力值: ( LV2,RANK:15 )
在线值:
发帖
回帖
粉丝
7
  关键的几个结构上面给出了,难道还有没给出的嘛...这个倒是没注意,就算是有,也是很容易可以找到的那种了
2016-10-23 22:50
0
雪    币: 39
活跃值: (52)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
8
像有TP这样的遍历不出来模块是怎么回事?
2016-11-16 22:49
0
雪    币: 248
活跃值: (3789)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
9
关键字_PEB_LDR_DATA链表
2016-11-16 23:15
0
雪    币: 12848
活跃值: (9108)
能力值: ( LV9,RANK:280 )
在线值:
发帖
回帖
粉丝
10
如果进程抹了三条LDR链表呢
2016-11-16 23:49
0
游客
登录 | 注册 方可回帖
返回
//