?? 7-1.cpp
字號:
// 工程vmwalker
#include <windows.h>
#include <iostream>
#include <shlwapi.h>
#include <iomanip>
#pragma comment(lib, "Shlwapi.lib")
// 以可讀方式對用戶顯示保護(hù)的輔助方法。
// 保護(hù)標(biāo)記表示允許應(yīng)用程序?qū)?nèi)存進(jìn)行訪問的類型
// 以及操作系統(tǒng)強制訪問的類型
inline bool TestSet(DWORD dwTarget, DWORD dwMask)
{
return ((dwTarget &dwMask) == dwMask) ;
}
# define SHOWMASK(dwTarget, type) \
if (TestSet(dwTarget, PAGE_##type) ) \
{std :: cout << ", " << #type; }
void ShowProtection(DWORD dwTarget)
{
SHOWMASK(dwTarget, READONLY) ;
SHOWMASK(dwTarget, GUARD) ;
SHOWMASK(dwTarget, NOCACHE) ;
SHOWMASK(dwTarget, READWRITE) ;
SHOWMASK(dwTarget, WRITECOPY) ;
SHOWMASK(dwTarget, EXECUTE) ;
SHOWMASK(dwTarget, EXECUTE_READ) ;
SHOWMASK(dwTarget, EXECUTE_READWRITE) ;
SHOWMASK(dwTarget, EXECUTE_WRITECOPY) ;
SHOWMASK(dwTarget, NOACCESS) ;
}
// 遍歷整個虛擬內(nèi)存并對用戶顯示其屬性的工作程序的方法
void WalkVM(HANDLE hProcess)
{
// 首先,獲得系統(tǒng)信息
SYSTEM_INFO si;
:: ZeroMemory(&si, sizeof(si) ) ;
:: GetSystemInfo(&si) ;
// 分配要存放信息的緩沖區(qū)
MEMORY_BASIC_INFORMATION mbi;
:: ZeroMemory(&mbi, sizeof(mbi) ) ;
// 循環(huán)整個應(yīng)用程序地址空間
LPCVOID pBlock = (LPVOID) si.lpMinimumApplicationAddress;
while (pBlock < si.lpMaximumApplicationAddress)
{
// 獲得下一個虛擬內(nèi)存塊的信息
if (:: VirtualQueryEx(
hProcess, // 相關(guān)的進(jìn)程
pBlock, // 開始位置
&mbi, // 緩沖區(qū)
sizeof(mbi))==sizeof(mbi) ) // 大小的確認(rèn)
{
// 計算塊的結(jié)尾及其大小
LPCVOID pEnd = (PBYTE) pBlock + mbi.RegionSize;
TCHAR szSize[MAX_PATH];
:: StrFormatByteSize(mbi.RegionSize, szSize, MAX_PATH) ;
// 顯示塊地址和大小
std :: cout.fill ('0') ;
std :: cout
<< std :: hex << std :: setw(8) << (DWORD) pBlock
<< "-"
<< std :: hex << std :: setw(8) << (DWORD) pEnd
<< (:: strlen(szSize)==7? " (" : " (") << szSize
<< ") " ;
// 顯示塊的狀態(tài)
switch(mbi.State)
{
case MEM_COMMIT :
std :: cout << "Committed" ;
break;
case MEM_FREE :
std :: cout << "Free" ;
break;
case MEM_RESERVE :
std :: cout << "Reserved" ;
break;
}
// 顯示保護(hù)
if(mbi.Protect==0 && mbi.State!=MEM_FREE)
{
mbi.Protect=PAGE_READONLY;
}
ShowProtection(mbi.Protect);
// 顯示類型
switch(mbi.Type){
case MEM_IMAGE :
std :: cout << ", Image" ;
break;
case MEM_MAPPED:
std :: cout << ", Mapped";
break;
case MEM_PRIVATE :
std :: cout << ", Private" ;
break;
}
// 檢驗可執(zhí)行的影像
TCHAR szFilename [MAX_PATH] ;
if (:: GetModuleFileName (
(HMODULE) pBlock, // 實際虛擬內(nèi)存的模塊句柄
szFilename, //完全指定的文件名稱
MAX_PATH)>0) //實際使用的緩沖區(qū)大小
{
// 除去路徑并顯示
:: PathStripPath(szFilename) ;
std :: cout << ", Module: " << szFilename;
}
std :: cout << std :: endl;
// 移動塊指針以獲得下一下個塊
pBlock = pEnd;
}
}
}
void main()
{
// 遍歷當(dāng)前進(jìn)程的虛擬內(nèi)存
::WalkVM(::GetCurrentProcess());
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -