首页
社区
课程
招聘
[已解决] [求助]驱动通过PEB取32位程序模块名和地址问题 50.00雪花
发表于: 2018-6-17 18:13 6014

[已解决] [求助]驱动通过PEB取32位程序模块名和地址问题 50.00雪花

2018-6-17 18:13
6014
驱动通过PEB取32位程序模块名和地址问题
之前取64程序模块信息都正常,然后换了PsGetProcessWow64Process取32程序模块信息就会出错,结构体也换了的
然后干脆直接将别的博主源码,完全复制上去,还是蓝屏。也是服了。
#include <ntifs.h>
#include <ntddk.h>

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_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_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;

NTSTATUS GetModulesPathByProcessID(IN HANDLE ProcessId, IN WCHAR* ModuleName) 
{
	typedef PPEB(__stdcall * pfn_PsGetProcessPeb) (PEPROCESS pEProcess);
	typedef PPEB32(__stdcall * pfn_PsGetProcessWow64Process) (PEPROCESS Process);
	NTSTATUS nStatus;
	KAPC_STATE KAPC = { 0 };
	PEPROCESS  pEProcess = NULL; //EPROCESS结构指针;
	PPEB32 pPEB32 = NULL; //PEB结构指针;
	PLDR_DATA_TABLE_ENTRY32 pLdrDataEntry32 = NULL; //LDR链表入口;
	PLIST_ENTRY32 pListEntryStart32 = NULL; //链表头节点、尾节点;
	PLIST_ENTRY32 pListEntryEnd32 = NULL;
	UNICODE_STRING	SysFunctionName;
	//函数指针;
	pfn_PsGetProcessWow64Process PsGetProcessWow64Process = NULL;
	RtlInitUnicodeString(&SysFunctionName, L"PsGetProcessWow64Process");
	PsGetProcessWow64Process = (pfn_PsGetProcessWow64Process)(SIZE_T)MmGetSystemRoutineAddress(&SysFunctionName);
	//获取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) {
			KeUnstackDetachProcess(&KAPC);
			KdPrint((": Name: %wZ  Base: %d\n", &pLdrDataEntry32->BaseDllName, pLdrDataEntry32->DllBase));
			ObDereferenceObject(pEProcess);
			return STATUS_SUCCESS;
		}
		pListEntryStart32 = (PLIST_ENTRY32)pListEntryStart32->Flink;
	} while (pListEntryStart32 != pListEntryEnd32);
	KeUnstackDetachProcess(&KAPC);
	ObDereferenceObject(pEProcess);
	return STATUS_SUCCESS;
}

void MyDriverUnload(PDRIVER_OBJECT pDriverObj)
{
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pReg)
{
	NTSTATUS Status;

	pDriverObj->DriverUnload = MyDriverUnload;
	pDriverObj->Flags |= DO_BUFFERED_IO;

	GetModulesPathByProcessID((HANDLE)2828, L"ntdll.dll");

	return STATUS_SUCCESS;
}
以上代码 除DriverEntry和Unload函数 其他完全摘自博主博客源码 编译后依旧蓝屏,检查过PID和模块名都是正确的
求解答,或求分享一份不蓝屏且能正确取32模块信息的源码,谢谢看雪论坛的各位!!

[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)

最后于 2020-2-15 19:09 被雪碧丶编辑 ,原因:
收藏
免费 0
支持
分享
最新回复 (7)
雪    币: 5734
活跃值: (1737)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
2

#ifdef  _WIN64
ULONG
NTAPI
Wx86GetImageHandle(
        __in  PSTR  ImageName
)
{
        NTSTATUS  Status  =  STATUS_SUCCESS;
        PWOW64_PROCESS  Wow64Process  =  NULL;
        PPEB32  Peb  =  NULL;
        PPEB_LDR_DATA32  Ldr  =  NULL;
        PLDR_DATA_TABLE_ENTRY32  LdrDataTableEntry  =  NULL;
        PLDR_DATA_TABLE_ENTRY32  FoundDataTableEntry  =  NULL;
        ANSI_STRING  AnsiImageFileName  =  {  0  };
        UNICODE_STRING  ImageFileName  =  {  0  };
        UNICODE_STRING  Wx86ImageFileName  =  {  0  };
        ULONG  ImageBase  =  0;

        Wow64Process  =  PsGetCurrentProcessWow64Process();

        if  (NULL  !=  Wow64Process)  {
                Peb  =  (PPEB32)&Wow64Process->Wow64;

                Ldr  =  ULongToPtr(Peb->Ldr);

                if  (NULL  !=  Ldr)  {
                        LdrDataTableEntry  =  CONTAINING_RECORD(
                                &Ldr->InLoadOrderModuleList,
                                LDR_DATA_TABLE_ENTRY32,
                                InLoadOrderLinks);

                        FoundDataTableEntry  =  CONTAINING_RECORD(
                                ULongToPtr(LdrDataTableEntry->InLoadOrderLinks.Flink),
                                LDR_DATA_TABLE_ENTRY32,
                                InLoadOrderLinks);

                        if  (NULL  ==  ImageName)  {
                                FoundDataTableEntry  =  ULongToPtr(Ldr->EntryInProgress);
                                ImageBase  =  FoundDataTableEntry->DllBase;
                                Status  =  STATUS_SUCCESS;
                                goto  exit;
                        }
                        else  {
                                RtlInitAnsiString(
                                        &AnsiImageFileName,
                                        ImageName);

                                Status  =  RtlAnsiStringToUnicodeString(
                                        &ImageFileName,
                                        &AnsiImageFileName,
                                        TRUE);

                                if  (NT_SUCCESS(Status))  {
                                        while  (FoundDataTableEntry  !=  LdrDataTableEntry)  {
                                                Wx86ImageFileName.Buffer  =  ULongToPtr(FoundDataTableEntry->BaseDllName.Buffer);
                                                Wx86ImageFileName.Length  =  FoundDataTableEntry->BaseDllName.Length;
                                                Wx86ImageFileName.MaximumLength  =  FoundDataTableEntry->BaseDllName.MaximumLength;

                                                if  (FALSE  !=  RtlEqualUnicodeString(
                                                        &ImageFileName,
                                                        &Wx86ImageFileName,
                                                        TRUE))  {
                                                        ImageBase  =  FoundDataTableEntry->DllBase;
                                                        Status  =  STATUS_SUCCESS;
                                                        goto  exit;
                                                }

                                                FoundDataTableEntry  =  CONTAINING_RECORD(
                                                        ULongToPtr(FoundDataTableEntry->InLoadOrderLinks.Flink),
                                                        LDR_DATA_TABLE_ENTRY32,
                                                        InLoadOrderLinks);
                                        }

                                        RtlFreeUnicodeString(&ImageFileName);
                                }
                        }
                }
        }

exit:
        return  ImageBase;
}
#endif  //  _WIN64
2018-6-17 22:23
0
雪    币: 5734
活跃值: (1737)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
顺便说一句  结构体定义在WRK  wow64t.h
2018-6-17 22:28
0
雪    币: 30
活跃值: (17)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
4
小艾 顺便说一句 结构体定义在WRK wow64t.h
懂了 谢谢老哥我去试试
最后于 2018-6-18 08:38 被雪碧丶编辑 ,原因: 自己傻逼,眼瞎看错字
2018-6-17 22:39
0
雪    币: 149
活跃值: (38)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
5
不行联系我。。成品32  64都行。。1907616825
2018-6-19 21:32
0
雪    币: 1641
活跃值: (3601)
能力值: (RANK:15 )
在线值:
发帖
回帖
粉丝
6
辣是真滴牛批
2018-6-26 22:46
0
雪    币: 133
活跃值: (48)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
7
mark peb32
2018-10-31 13:05
0
雪    币: 116
能力值: (RANK:10 )
在线值:
发帖
回帖
粉丝
8
50少了点吧
2018-11-26 00:08
0
游客
登录 | 注册 方可回帖
返回
//