设为首页 收藏本站
查看: 947|回复: 0

[经验分享] windows 物理内存获取

[复制链接]

尚未签到

发表于 2017-12-8 11:31:46 | 显示全部楼层 |阅读模式
  由于我一般使用的虚拟内存, 有时我们需要获取到物理内存中的数据(也就是内存条中的真实数据), 按理说是很简单,打开物理内存,读取就可以了.但似乎没这么简单:
  








[cpp] view plain copy


print?

  • #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);  
  •     VOID SetPhyscialMemoryAccess(HANDLE hPhysicalMemory,//由ZwOpenSection/NtOpenSection返回的物理内存句柄  
  •         DWORD dwDesiredAccess//访问权限  
  •         );  
  •     BOOL ReadPhysicalMemory(OUT PVOID pvDataBuffer, //用于保存读取数据的缓冲区首地址  
  •         IN DWORD dwAddress, //要读取的数据的首地址,要求4KB对齐  
  •         IN DWORD dwLength //读取的长度  
  •         );  
  •     BOOL WritePhysicalMemory(IN PVOID pvDataBuffer, //用于保存要写入的数据的缓冲区首地址  
  •         IN DWORD dwAddress, //要目标地址,要求4KB对齐  
  •         IN DWORD dwLength //写入的长度  
  •         );  
  •   
  •   
  • private:  
  •     static BOOL InitPhysicalMemory() ;  
  •     static void ExitPhysicalMemory() ;  
  •   
  • private:  
  •     HANDLE m_hPhysicalMemory ;  
  •     static HMODULE sm_hNtdllModule ;  
  •     static ZwOpenSectionProc ZwOpenSection;  
  •     static ZwMapViewOfSectionProc ZwMapViewOfSection;  
  •     static ZwUnmapViewOfSectionProc ZwUnmapViewOfSection;  
  •     static RtlInitUnicodeStringProc RtlInitUnicodeString;  
  •     static PhysicalMemory * sm_pFirstObject;  
  •     PhysicalMemory * m_pNextObject;  
  • }; ...  


DSC0000.png
#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);
VOID SetPhyscialMemoryAccess(HANDLE hPhysicalMemory,//由ZwOpenSection/NtOpenSection返回的物理内存句柄
DWORD dwDesiredAccess//访问权限
);
BOOL ReadPhysicalMemory(OUT PVOID pvDataBuffer, //用于保存读取数据的缓冲区首地址
IN DWORD dwAddress, //要读取的数据的首地址,要求4KB对齐
IN DWORD dwLength //读取的长度
);
BOOL WritePhysicalMemory(IN PVOID pvDataBuffer, //用于保存要写入的数据的缓冲区首地址
IN DWORD dwAddress, //要目标地址,要求4KB对齐
IN DWORD dwLength //写入的长度
);

private:
static BOOL InitPhysicalMemory() ;
static void ExitPhysicalMemory() ;
private:
HANDLE m_hPhysicalMemory ;
static HMODULE sm_hNtdllModule ;
static ZwOpenSectionProc ZwOpenSection;
static ZwMapViewOfSectionProc ZwMapViewOfSection;
static ZwUnmapViewOfSectionProc ZwUnmapViewOfSection;
static RtlInitUnicodeStringProc RtlInitUnicodeString;
static PhysicalMemory * sm_pFirstObject;
PhysicalMemory * m_pNextObject;
}; ...








[cpp] view plain copy


print?

  • #include "windows.h"  
  • #include "Aclapi.h"  
  • #include "PhysicalMemory.h"  
  • //初始化OBJECT_ATTRIBUTES类型的变量  
  • #define InitializeObjectAttributes( p, n, a, r, s ) { (p)->Length = sizeof( OBJECT_ATTRIBUTES );(p)->RootDirectory = r; (p)->Attributes = a; (p)->ObjectName = n; (p)->SecurityDescriptor = s; (p)->SecurityQualityOfService = NULL; }  
  • // #define InitializeObjectAttributes( p, n, a, r, s ) { \   
  • //  (p)->Length = sizeof( OBJECT_ATTRIBUTES ); \   
  • //    (p)->RootDirectory = r; \   
  • //   (p)->Attributes = a; \   
  • //    (p)->ObjectName = n; \   
  • //    (p)->SecurityDescriptor = s; \   
  • //    (p)->SecurityQualityOfService = NULL; \   
  • //}  
  •   
  • // static variables of class PhysicalMemory  
  • PhysicalMemory* PhysicalMemory::sm_pFirstObject = NULL;  
  • HMODULE PhysicalMemory::sm_hNtdllModule  = NULL;  
  • ZwOpenSectionProc PhysicalMemory::ZwOpenSection = NULL;  
  • ZwMapViewOfSectionProc PhysicalMemory::ZwMapViewOfSection = NULL;  
  • ZwUnmapViewOfSectionProc PhysicalMemory::ZwUnmapViewOfSection = NULL;  
  • RtlInitUnicodeStringProc PhysicalMemory::RtlInitUnicodeString = NULL;  
  •   
  • PhysicalMemory::PhysicalMemory(DWORD dwDesiredAccess)  
  • {  
  •     if(sm_hNtdllModule == NULL)  
  •         if(!InitPhysicalMemory())  
  •             return;  
  •     m_pNextObject = sm_pFirstObject;  
  •     sm_pFirstObject = this;  
  •     // 以下打开内核对象  
  •     m_hPhysicalMemory = OpenPhysicalMemory(dwDesiredAccess);  
  •     return ;  
  • }  
  •   
  • /////////////////////////////////////////////////////////////////////////////////////////////  
  • /////////////////////////////////////////////////////////////////////////////////////////////  
  •   
  • PhysicalMemory::~PhysicalMemory()  
  • {  
  •     if (m_hPhysicalMemory != NULL)  
  •     {  
  •         CloseHandle(m_hPhysicalMemory);  
  •         m_hPhysicalMemory = NULL;  
  •     }  
  •   
  •     PhysicalMemory *pCurrentObject = sm_pFirstObject;  
  •     if(pCurrentObject==this)  
  •         sm_pFirstObject = sm_pFirstObject->m_pNextObject;  
  •     else{  
  •         while(pCurrentObject!=NULL){  
  •             if(pCurrentObject->m_pNextObject==this){  
  •                 pCurrentObject->m_pNextObject=this->m_pNextObject;  
  •                 break;            
  •             }  
  •             pCurrentObject = pCurrentObject->m_pNextObject;  
  •         }  
  •     }  
  •     if(sm_pFirstObject == NULL)  
  •         ExitPhysicalMemory();  
  • }  
  • /////////////////////////////////////////////////////////////////////////////////////////////  
  • /////////////////////////////////////////////////////////////////////////////////////////////  
  •   
  • // initialize  
  • BOOL PhysicalMemory::InitPhysicalMemory()  
  • {  
  •     if (!(sm_hNtdllModule = LoadLibrary("ntdll.dll")))  
  •     {  
  •         return FALSE;  
  •     }  
  •     // 以下从NTDLL获取我们需要的几个函数指针  
  •     if (!(ZwOpenSection = (ZwOpenSectionProc)GetProcAddress(sm_hNtdllModule,"ZwOpenSection")))  
  •     {  
  •         return FALSE;  
  •     }  
  •   
  •     if (!(ZwMapViewOfSection = (ZwMapViewOfSectionProc)GetProcAddress(sm_hNtdllModule, "ZwMapViewOfSection")))  
  •     {  
  •         return FALSE;  
  •     }  
  •   
  •     if (!(ZwUnmapViewOfSection = (ZwUnmapViewOfSectionProc)GetProcAddress(sm_hNtdllModule, "ZwUnmapViewOfSection")))  
  •     {  
  •         return FALSE;  
  •     }  
  •   
  •     if (!(RtlInitUnicodeString = (RtlInitUnicodeStringProc)GetProcAddress(sm_hNtdllModule, "RtlInitUnicodeString")))  
  •     {  
  •         return FALSE;  
  •     }  
  •     return TRUE;  
  • }  
  • /////////////////////////////////////////////////////////////////////////////////////////////  
  • /////////////////////////////////////////////////////////////////////////////////////////////  
  • void PhysicalMemory::ExitPhysicalMemory()  
  • {  
  •     if (sm_hNtdllModule != NULL)  
  •     {  
  •         //      sm_pFirstObject->~PhysicalMemory();  
  •         FreeLibrary(sm_hNtdllModule);  
  •     }  
  • }  
  • /////////////////////////////////////////////////////////////////////////////////////////////  
  • /////////////////////////////////////////////////////////////////////////////////////////////  
  • HANDLE PhysicalMemory::OpenPhysicalMemory(DWORD dwDesiredAccess)  
  • {  
  •     ULONG PhyDirectory;  
  •   
  •     OSVERSIONINFO OSVersion;  
  •     OSVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);  
  •     GetVersionEx (&OSVersion);  
  •   
  •     if (5 != OSVersion.dwMajorVersion)  
  •         return NULL;  
  •   
  •     switch(OSVersion.dwMinorVersion)  
  •     {  
  •     case 0:  
  •         PhyDirectory = 0x30000;  
  •         break; //2k  
  •     case 1:  
  •         PhyDirectory = 0x39000;  
  •         break; //xp  
  •     default:  
  •         return NULL;  
  •     }  
  •   
  •     WCHAR PhysicalMemoryName[] = L"\\Device\\PhysicalMemory";  
  •     UNICODE_STRING PhysicalMemoryString;  
  •     OBJECT_ATTRIBUTES attributes;  
  •     RtlInitUnicodeString(&PhysicalMemoryString, PhysicalMemoryName);  
  •     InitializeObjectAttributes(&attributes, &PhysicalMemoryString, 0, NULL, NULL);  
  •     HANDLE hPhysicalMemory ;  
  •     NTSTATUS status = ZwOpenSection(&hPhysicalMemory, dwDesiredAccess, &attributes );  
  •     if(status == STATUS_ACCESS_DENIED)  
  •     {   
  •         status = ZwOpenSection(&hPhysicalMemory, READ_CONTROL|WRITE_DAC, &attributes);   
  •         SetPhyscialMemoryAccess(hPhysicalMemory,dwDesiredAccess);   
  •         CloseHandle(hPhysicalMemory);  
  •         status = ZwOpenSection(&hPhysicalMemory, dwDesiredAccess, &attributes);   
  •     }  
  •     return ( NT_SUCCESS(status) ? hPhysicalMemory : NULL );  
  •     //    g_pMapPhysicalMemory = MapViewOfFile(g_hMPM, FILE_MAP_READ|FILE_MAP_WRITE, 0, PhyDirectory,   
  •     //0x1000);  
  •     //    if( g_pMapPhysicalMemory == NULL )  
  •     //        return NULL;  
  •     //    return g_hMPM;  
  • }  
  • /////////////////////////////////////////////////////////////////////////////////////////////  
  • /////////////////////////////////////////////////////////////////////////////////////////////  
  • VOID PhysicalMemory::SetPhyscialMemoryAccess(HANDLE hPhysicalMemory,//由ZwOpenSection/NtOpenSection返回的物理内存句柄  
  •                                              DWORD dwDesiredAccess//访问权限  
  •                                              )  
  •                                              //设置物理内存的访问权限,成功返回TRUE,错误返回FALSE  
  • {   
  •     PACL pDacl                    = NULL;   
  •     PSECURITY_DESCRIPTOR pSD    = NULL;   
  •     PACL pNewDacl = NULL;   
  •   
  •     DWORD dwRes = GetSecurityInfo(hPhysicalMemory, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL,   
  •   
  •         NULL, &pDacl, NULL, &pSD);  
  •   
  •     if(ERROR_SUCCESS != dwRes)  
  •     {  
  •   
  •         if(pSD)   
  •             LocalFree(pSD);   
  •         if(pNewDacl)   
  •             LocalFree(pNewDacl);   
  •     }  
  •   
  •     EXPLICIT_ACCESS ea;   
  •     RtlZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));   
  •     ea.grfAccessPermissions = SECTION_MAP_WRITE;   
  •     ea.grfAccessMode = GRANT_ACCESS;   
  •     ea.grfInheritance= NO_INHERITANCE;   
  •     ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME;   
  •     ea.Trustee.TrusteeType = TRUSTEE_IS_USER;   
  •     ea.Trustee.ptstrName = "CURRENT_USER";   
  •   
  •     dwRes = SetEntriesInAcl(1,&ea,pDacl,&pNewDacl);  
  •   
  •     if(ERROR_SUCCESS != dwRes)  
  •     {  
  •   
  •         if(pSD)   
  •             LocalFree(pSD);   
  •         if(pNewDacl)   
  •             LocalFree(pNewDacl);   
  •     }  
  •     dwRes = SetSecurityInfo  
  •   
  •         (hPhysicalMemory,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,pNewDacl,NULL);  
  •   
  •     if(ERROR_SUCCESS != dwRes)  
  •     {  
  •   
  •         if(pSD)   
  •             LocalFree(pSD);   
  •         if(pNewDacl)   
  •             LocalFree(pNewDacl);   
  •     }  
  •   
  • }   
  • /////////////////////////////////////////////////////////////////////////////////////////////  
  • /////////////////////////////////////////////////////////////////////////////////////////////  
  • BOOL PhysicalMemory::ReadPhysicalMemory(OUT PVOID pvDataBuffer, //用于保存读取数据的缓冲区首地址  
  •                                         IN DWORD dwAddress, //要读取的数据的首地址,要求4KB对齐  
  •                                         IN DWORD dwLength //读取的长度  
  •                                         )  
  • {  
  •     if((dwAddress & 0x0fff ))//若地址不是4KB对齐,则返回  
  •     {  
  •         return FALSE;  
  •     }  
  •     if(m_hPhysicalMemory == NULL)  
  •     {  
  •         return FALSE;  
  •   
  •     }  
  •   
  •     DWORD dwOutLenth;            // 输出长度,根据内存分页大小可能大于要求的长度  
  •     PVOID pvVirtualAddress;          // 映射的虚地址  
  •     NTSTATUS status;         // NTDLL函数返回的状态  
  •     LARGE_INTEGER base;      // 物理内存地址  
  •   
  •     pvVirtualAddress = 0;  
  •     dwOutLenth = dwLength;  
  •     base.QuadPart = (ULONGLONG)(dwAddress);  
  •   
  •     // 映射物理内存地址到当前进程的虚地址空间  
  •     status = ZwMapViewOfSection(m_hPhysicalMemory,  
  •         (HANDLE) -1,  
  •         (PVOID *)&pvVirtualAddress,  
  •         0,  
  •         dwLength,  
  •         &base,  
  •         &dwOutLenth,  
  •         ViewShare,  
  •         0,  
  •         PAGE_READONLY  
  •         );  
  •   
  •     if (status < 0)  
  •     {  
  •         return FALSE;  
  •     }  
  •   
  •     // 当前进程的虚地址空间中,复制数据到输出缓冲区  
  •     memmove(pvDataBuffer,pvVirtualAddress, dwLength);  
  •     // 完成访问,取消地址映射  
  •     status = ZwUnmapViewOfSection((HANDLE)-1, (PVOID)pvVirtualAddress);  
  •   
  •     return (status >= 0);  
  • }  
  • /////////////////////////////////////////////////////////////////////////////////////////////  
  • /////////////////////////////////////////////////////////////////////////////////////////////  
  • BOOL PhysicalMemory::WritePhysicalMemory(IN PVOID pvDataBuffer, //用于保存要写入的数据的缓冲区首地址  
  •                                          IN DWORD dwAddress, //要目标地址,要求4KB对齐  
  •                                          IN DWORD dwLength //写入的长度  
  •                                          )  
  • {  
  •     if((dwAddress & 0x0fff ))//若地址不是4KB对齐,则返回  
  •     {  
  •         return FALSE;  
  •     }  
  •     if(m_hPhysicalMemory == NULL)  
  •     {  
  •         return FALSE;  
  •   
  •     }  
  •     DWORD dwOutLenth;            // 输出长度,根据内存分页大小可能大于要求的长度  
  •     PVOID pvVirtualAddress;          // 映射的虚地址  
  •     NTSTATUS status;         // NTDLL函数返回的状态  
  •     LARGE_INTEGER base;      // 物理内存地址  
  •   
  •     pvVirtualAddress = 0;  
  •     dwOutLenth = dwLength;  
  •     base.QuadPart = (ULONGLONG)(dwAddress);  
  •   
  •     // 映射物理内存地址到当前进程的虚地址空间  
  •     status = ZwMapViewOfSection(m_hPhysicalMemory,  
  •         (HANDLE) -1,  
  •         (PVOID *)&pvVirtualAddress,  
  •         0,  
  •         dwLength,  
  •         &base,  
  •         &dwOutLenth,  
  •         ViewShare,  
  •         ,0  
  •         FILE_MAP_WRITE//PAGE_READWRITE  
  •         );  
  •   
  •     if (status < 0)  
  •     {  
  •         return FALSE;  
  •     }  
  •   
  •     // 当前进程的虚地址空间中,复制数据到输出缓冲区  
  •     ::memmove(pvVirtualAddress, pvDataBuffer,dwLength);  
  •     // 完成访问,取消地址映射  
  •     status = ZwUnmapViewOfSection((HANDLE)-1, (PVOID)pvVirtualAddress);  
  •   
  •     return (status >= 0);  
  • }  
  • /////////////////////////////////////////////////////////////////////////////////////////////  
  • /////////////////////////////////////////////////////////////////////////////////////////////  



#include "windows.h"
#include "Aclapi.h"
#include "PhysicalMemory.h"
//初始化OBJECT_ATTRIBUTES类型的变量
#define InitializeObjectAttributes( p, n, a, r, s ) { (p)->Length = sizeof( OBJECT_ATTRIBUTES );(p)->RootDirectory = r; (p)->Attributes = a; (p)->ObjectName = n; (p)->SecurityDescriptor = s; (p)->SecurityQualityOfService = NULL; }
// #define InitializeObjectAttributes( p, n, a, r, s ) { \
//  (p)->Length = sizeof( OBJECT_ATTRIBUTES ); \
//    (p)->RootDirectory = r; \
//   (p)->Attributes = a; \
//    (p)->ObjectName = n; \
//    (p)->SecurityDescriptor = s; \
//    (p)->SecurityQualityOfService = NULL; \
//}
// static variables of class PhysicalMemory
PhysicalMemory* PhysicalMemory::sm_pFirstObject = NULL;
HMODULE PhysicalMemory::sm_hNtdllModule  = NULL;
ZwOpenSectionProc PhysicalMemory::ZwOpenSection = NULL;
ZwMapViewOfSectionProc PhysicalMemory::ZwMapViewOfSection = NULL;
ZwUnmapViewOfSectionProc PhysicalMemory::ZwUnmapViewOfSection = NULL;
RtlInitUnicodeStringProc PhysicalMemory::RtlInitUnicodeString = NULL;
PhysicalMemory::PhysicalMemory(DWORD dwDesiredAccess)
{
if(sm_hNtdllModule == NULL)
if(!InitPhysicalMemory())
return;
m_pNextObject = sm_pFirstObject;
sm_pFirstObject = this;
// 以下打开内核对象
m_hPhysicalMemory = OpenPhysicalMemory(dwDesiredAccess);
return ;
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
PhysicalMemory::~PhysicalMemory()
{
if (m_hPhysicalMemory != NULL)
{
CloseHandle(m_hPhysicalMemory);
m_hPhysicalMemory = NULL;
}
PhysicalMemory *pCurrentObject = sm_pFirstObject;
if(pCurrentObject==this)
sm_pFirstObject = sm_pFirstObject->m_pNextObject;
else{
while(pCurrentObject!=NULL){
if(pCurrentObject->m_pNextObject==this){
pCurrentObject->m_pNextObject=this->m_pNextObject;
break;
}
pCurrentObject = pCurrentObject->m_pNextObject;
}
}
if(sm_pFirstObject == NULL)
ExitPhysicalMemory();
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
// initialize
BOOL PhysicalMemory::InitPhysicalMemory()
{
if (!(sm_hNtdllModule = LoadLibrary("ntdll.dll")))
{
return FALSE;
}
// 以下从NTDLL获取我们需要的几个函数指针
if (!(ZwOpenSection = (ZwOpenSectionProc)GetProcAddress(sm_hNtdllModule,"ZwOpenSection")))
{
return FALSE;
}
if (!(ZwMapViewOfSection = (ZwMapViewOfSectionProc)GetProcAddress(sm_hNtdllModule, "ZwMapViewOfSection")))
{
return FALSE;
}
if (!(ZwUnmapViewOfSection = (ZwUnmapViewOfSectionProc)GetProcAddress(sm_hNtdllModule, "ZwUnmapViewOfSection")))
{
return FALSE;
}
if (!(RtlInitUnicodeString = (RtlInitUnicodeStringProc)GetProcAddress(sm_hNtdllModule, "RtlInitUnicodeString")))
{
return FALSE;
}
return TRUE;
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
void PhysicalMemory::ExitPhysicalMemory()
{
if (sm_hNtdllModule != NULL)
{
//sm_pFirstObject->~PhysicalMemory();
FreeLibrary(sm_hNtdllModule);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
HANDLE PhysicalMemory::OpenPhysicalMemory(DWORD dwDesiredAccess)
{
ULONG PhyDirectory;
OSVERSIONINFO OSVersion;
OSVersion.dwOSVersionInfoSize = sizeof(OSVERSIONINFO);
GetVersionEx (&OSVersion);
if (5 != OSVersion.dwMajorVersion)
return NULL;
switch(OSVersion.dwMinorVersion)
{
case 0:
PhyDirectory = 0x30000;
break; //2k
case 1:
PhyDirectory = 0x39000;
break; //xp
default:
return NULL;
}
WCHAR PhysicalMemoryName[] = L"\\Device\\PhysicalMemory";
UNICODE_STRING PhysicalMemoryString;
OBJECT_ATTRIBUTES attributes;
RtlInitUnicodeString(&PhysicalMemoryString, PhysicalMemoryName);
InitializeObjectAttributes(&attributes, &PhysicalMemoryString, 0, NULL, NULL);
HANDLE hPhysicalMemory ;
NTSTATUS status = ZwOpenSection(&hPhysicalMemory, dwDesiredAccess, &attributes );
if(status == STATUS_ACCESS_DENIED)
{
status = ZwOpenSection(&hPhysicalMemory, READ_CONTROL|WRITE_DAC, &attributes);
SetPhyscialMemoryAccess(hPhysicalMemory,dwDesiredAccess);
CloseHandle(hPhysicalMemory);
status = ZwOpenSection(&hPhysicalMemory, dwDesiredAccess, &attributes);
}
return ( NT_SUCCESS(status) ? hPhysicalMemory : NULL );
//    g_pMapPhysicalMemory = MapViewOfFile(g_hMPM, FILE_MAP_READ|FILE_MAP_WRITE, 0, PhyDirectory,
//0x1000);
//    if( g_pMapPhysicalMemory == NULL )
//        return NULL;
//    return g_hMPM;
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
VOID PhysicalMemory::SetPhyscialMemoryAccess(HANDLE hPhysicalMemory,//由ZwOpenSection/NtOpenSection返回的物理内存句柄
DWORD dwDesiredAccess//访问权限
)
//设置物理内存的访问权限,成功返回TRUE,错误返回FALSE
{
PACL pDacl                    = NULL;
PSECURITY_DESCRIPTOR pSD    = NULL;
PACL pNewDacl = NULL;
DWORD dwRes = GetSecurityInfo(hPhysicalMemory, SE_KERNEL_OBJECT, DACL_SECURITY_INFORMATION, NULL,
NULL, &pDacl, NULL, &pSD);
if(ERROR_SUCCESS != dwRes)
{
if(pSD)
LocalFree(pSD);
if(pNewDacl)
LocalFree(pNewDacl);
}
EXPLICIT_ACCESS ea;
RtlZeroMemory(&ea, sizeof(EXPLICIT_ACCESS));
ea.grfAccessPermissions = SECTION_MAP_WRITE;
ea.grfAccessMode = GRANT_ACCESS;
ea.grfInheritance= NO_INHERITANCE;
ea.Trustee.TrusteeForm = TRUSTEE_IS_NAME;
ea.Trustee.TrusteeType = TRUSTEE_IS_USER;
ea.Trustee.ptstrName = "CURRENT_USER";
dwRes = SetEntriesInAcl(1,&ea,pDacl,&pNewDacl);
if(ERROR_SUCCESS != dwRes)
{
if(pSD)
LocalFree(pSD);
if(pNewDacl)
LocalFree(pNewDacl);
}
dwRes = SetSecurityInfo
(hPhysicalMemory,SE_KERNEL_OBJECT,DACL_SECURITY_INFORMATION,NULL,NULL,pNewDacl,NULL);
if(ERROR_SUCCESS != dwRes)
{
if(pSD)
LocalFree(pSD);
if(pNewDacl)
LocalFree(pNewDacl);
}
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
BOOL PhysicalMemory::ReadPhysicalMemory(OUT PVOID pvDataBuffer, //用于保存读取数据的缓冲区首地址
IN DWORD dwAddress, //要读取的数据的首地址,要求4KB对齐
IN DWORD dwLength //读取的长度
)
{
if((dwAddress & 0x0fff ))//若地址不是4KB对齐,则返回
{
return FALSE;
}
if(m_hPhysicalMemory == NULL)
{
return FALSE;
}
DWORD dwOutLenth;            // 输出长度,根据内存分页大小可能大于要求的长度
PVOID pvVirtualAddress;          // 映射的虚地址
NTSTATUS status;         // NTDLL函数返回的状态
LARGE_INTEGER base;      // 物理内存地址
pvVirtualAddress = 0;
dwOutLenth = dwLength;
base.QuadPart = (ULONGLONG)(dwAddress);
// 映射物理内存地址到当前进程的虚地址空间
status = ZwMapViewOfSection(m_hPhysicalMemory,
(HANDLE) -1,
(PVOID *)&pvVirtualAddress,
0,
dwLength,
&base,
&dwOutLenth,
ViewShare,
0,
PAGE_READONLY
);
if (status < 0)
{
return FALSE;
}
// 当前进程的虚地址空间中,复制数据到输出缓冲区
memmove(pvDataBuffer,pvVirtualAddress, dwLength);
// 完成访问,取消地址映射
status = ZwUnmapViewOfSection((HANDLE)-1, (PVOID)pvVirtualAddress);
return (status >= 0);
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////
BOOL PhysicalMemory::WritePhysicalMemory(IN PVOID pvDataBuffer, //用于保存要写入的数据的缓冲区首地址
IN DWORD dwAddress, //要目标地址,要求4KB对齐
IN DWORD dwLength //写入的长度
)
{
if((dwAddress & 0x0fff ))//若地址不是4KB对齐,则返回
{
return FALSE;
}
if(m_hPhysicalMemory == NULL)
{
return FALSE;
}
DWORD dwOutLenth;            // 输出长度,根据内存分页大小可能大于要求的长度
PVOID pvVirtualAddress;          // 映射的虚地址
NTSTATUS status;         // NTDLL函数返回的状态
LARGE_INTEGER base;      // 物理内存地址
pvVirtualAddress = 0;
dwOutLenth = dwLength;
base.QuadPart = (ULONGLONG)(dwAddress);
// 映射物理内存地址到当前进程的虚地址空间
status = ZwMapViewOfSection(m_hPhysicalMemory,
(HANDLE) -1,
(PVOID *)&pvVirtualAddress,
0,
dwLength,
&base,
&dwOutLenth,
ViewShare,
,0
FILE_MAP_WRITE//PAGE_READWRITE
);
if (status < 0)
{
return FALSE;
}
// 当前进程的虚地址空间中,复制数据到输出缓冲区
::memmove(pvVirtualAddress, pvDataBuffer,dwLength);
// 完成访问,取消地址映射
status = ZwUnmapViewOfSection((HANDLE)-1, (PVOID)pvVirtualAddress);
return (status >= 0);
}
/////////////////////////////////////////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////


jpg改rar
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-422097-1-1.html 上篇帖子: windows开机自启动bat脚本设置 下篇帖子: ubuntu14.04 spring cloud config server + gradle搭建
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表