學HOOK學的 API 函數、、VirtualQuery、、VirtualProtect、、 WriteProcessMemory

先說一下MEMORY_BASIC_INFORMATION這個結構、、ide

typedef   struct  _MEMORY_BASIC_INFORMATION {函數

 PVOID BaseAddress;   //區域基地址。與VirtualQuery函數的第一個參數lpAddr相同指針

 PVOID AllocationBase; //分配基地址指明用VirtualAlloc函數分配內存區域的基地址,lpAddr在該區域內。進程

 DWORD AllocationProtect; //區域被初次保留時賦予的保護屬性。例PAGE_READWRITE容許讀寫、、內存

 SIZE_T RegionSize;      //區域大小(字節)。用於指明內存塊從基地址即BaseAddress開始的全部頁面的大小(以字節爲計量單位)it

                     這些頁面與含有用lpAddr參數設定的地址的頁面擁有相//同的保護屬性、狀態和類型。io

 DWORD State;    //狀態(MEM_FREE、MEM_RESERVE或MEM_COMMIT)。指明全部相鄰頁面的狀態class

                             //MEM_COMMIT指明已分配物理內存或者系統頁文件。  變量

                              //MEM_FREE空閒狀態。該區域的虛擬地址不受任何內存的支持。該地址空間沒有被保留。分頁

                              //在此狀態下AllocationBase、AllocationProtect、Protect  和Type等成員均未定義。

                                 //MEM_RESERVE指明頁面被保留,可是沒有分配任何物理內存。該狀態下Protect成員未定。

 DWORD Protect;   //保護屬性。意義同AllocationProtect  

 DWORD Type;  //類型。用於指明支持全部相鄰頁面的物理存儲器的類型/(MEM_IMAGE,MEM_MAPPED或MEM_PRIVATE)。

                            //若是是Windows 98,那麼這個成員將老是  MEM_PRIVATE 。  

                          //MEM_IMAGE 指明該區域的虛擬地址原先受內存映射的映像文件(如.exe或DLL文件)的支持,但也許再也不受映像文件的支持。

              例如,當寫入模塊映像中的全局變量時,「寫入時拷貝」的機制將由頁文件來支持特定的頁面,而不是受原始映像文件的支持。

                            //MEM_MAPPED 該區域的虛擬地址原先是受內存映射的數據文件的支持,但也許再也不受數據文件的支持。

               例如,數據文件能夠使用「寫入時拷貝」的保護屬性來映射。對文件的任何寫入操做都將致使頁文件而不是原始數據支持特定的頁面。                      //MEM_PRIVATE 指明該內存區域是私有的。不被其餘進程共享。   

 } MEMORY_BASIC_INFORMATION, *PMEMORY_BASIC_INFORMATION;

 

VirtualQuery (lpAddr,  &mbi,  sizeof(mbi));

// VirtualQuery函數:查詢地址空間中內存地址的信息。並填充MEMORY_BASIC_INFORMATION結構、

// DWORD VirtualQuery(

LPCVOID   lpAddress,查詢內存的地址

PMEMORY_BASIC_INFORMATION   lpBuffer,指向MBI結構的指針,用於接收內存信息

DWORD  dwLength         MEMORY_BASIC_INFORMATION結構的大小。

);// 函數寫入lpBuffer的字節數,若是不等於sizeof(MEMORY_BASIC_INFORMATION)表示失敗

VirtualProtect (lpAddr,  sizeof(DWORD),  PAGE_READWRITE,  &dwOLD);

// BOOL VirtualProtect(   

LPVOID lpAddress, //目標地址起始位置  

DWORD dwSize, //大小 要變動的記憶體分頁區域的大小(單位是字節)。  

DWORD flNewProtect, //請求的保護方式  

PDWORD lpflOldProtect //保存老的保護方式  

);

WriteProcessMemory (GetCurrentProcess(),     lpAddr, &ADD, sizeof(DWORD), NULL);

//此函數能寫入某一進程的內存區域。入口區必須能夠訪問

// BOOL WriteProcessMemory(   

HANDLE hProcess, 由OpenProcess返回的進程句柄 這裏是去獲取目標進程的句柄

LPVOID lpBaseAddress,要寫的內存首地址再寫入以前,此函數將先檢查目標地址是否可用,

並能容納待寫入的數據  

LPVOID lpBuffer, 指向要寫的數據的指針。

DWORD nSize,   要寫入的字節數。  

LPDWORD lpNumberOfBytesWritten 實際數據的長度 通常寫爲NULL、、

);返回值  非零值表明成功

相關文章
相關標籤/搜索