windows 物理内存获取

时间:2021-07-05 05:32:25

由于我一般使用的虚拟内存, 有时我们需要获取到物理内存中的数据(也就是内存条中的真实数据), 按理说是很简单,打开物理内存,读取就可以了.但似乎没这么简单:


[cpp]

#include "windows.h"  

  

//定义相应的变量类型,见ntddk.h  

typedef LONG    NTSTATUS;  

  

#define NT_SUCCESS(Status)((NTSTATUS)(Status) >= 0)  

#define STATUS_ACCESS_DENIED ((NTSTATUS)0xC0000022L)  

  

typedef struct _UNICODE_STRING  

{  

    USHORT Length;  

    USHORT MaximumLength;  

    PWSTR Buffer;  

} UNICODE_STRING, *PUNICODE_STRING;  

  

typedef enum _SECTION_INHERIT  

{  

    ViewShare = 1,  

    ViewUnmap = 2  

} SECTION_INHERIT, *PSECTION_INHERIT;  

  

typedef struct _OBJECT_ATTRIBUTES  

{  

    ULONG Length;  

    HANDLE RootDirectory;  

    PUNICODE_STRING ObjectName;  

    ULONG Attributes;  

    PVOID SecurityDescriptor;  

    PVOID SecurityQualityOfService;  

} OBJECT_ATTRIBUTES, *POBJECT_ATTRIBUTES;  

  

  

// Interesting functions in NTDLL  

typedef NTSTATUS (WINAPI *ZwOpenSectionProc)  

(  

 PHANDLE SectionHandle,  

 DWORD DesiredAccess,  

 POBJECT_ATTRIBUTES ObjectAttributes  

 );  

typedef NTSTATUS (WINAPI *ZwMapViewOfSectionProc)  

(  

 HANDLE SectionHandle,  

 HANDLE ProcessHandle,  

 PVOID *BaseAddress,  

 ULONG ZeroBits,  

 ULONG CommitSize,  

 PLARGE_INTEGER SectionOffset,  

 PULONG ViewSize,  

 SECTION_INHERIT InheritDisposition,  

 ULONG AllocationType,  

 ULONG Protect  

 );  

typedef NTSTATUS (WINAPI *ZwUnmapViewOfSectionProc)  

(  

 HANDLE ProcessHandle,  

 PVOID BaseAddress  

 );  

typedef VOID (WINAPI *RtlInitUnicodeStringProc)  

(  

 IN OUT PUNICODE_STRING DestinationString,  

 IN PCWSTR SourceString  

 );  

  

class PhysicalMemory  

{  

public:  

    PhysicalMemory(DWORD dwDesiredAccess = SECTION_MAP_READ);  

    ~PhysicalMemory();  

    HANDLE OpenPhysicalMemory(DWORD dwDesiredAccess = SECTION_MAP_READ);