osʵÑéÖ¸µ¼Ê飨У©1(2) ÏÂÔØ±¾ÎÄ

ÄÚÈÝ·¢²¼¸üÐÂʱ¼ä : 2026/9/4 2:42:50ÐÇÆÚÒ» ÏÂÃæÊÇÎÄÕµÄÈ«²¿ÄÚÈÝÇëÈÏÕæÔĶÁ¡£

______________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________________

4¡¢ ³ÌÐòÇåµ¥

Çåµ¥4-1 Á˽âºÍ¼ì²â½ø³ÌµÄÐéÄâÄÚ´æ¿Õ¼ä // ¹¤³Ìvmwalker

#include #include #include #include

#pragma comment(lib, \

// ÒԿɶÁ·½Ê½¶ÔÓû§ÏÔʾ±£»¤µÄ¸¨Öú·½·¨¡£

// ±£»¤±ê¼Ç±íʾÔÊÐíÓ¦ÓóÌÐò¶ÔÄÚ´æ½øÐзÃÎʵÄÀàÐÍ // ÒÔ¼°²Ù×÷ÏµÍ³Ç¿ÖÆ·ÃÎʵÄÀàÐÍ

inline bool TestSet(DWORD dwTarget, DWORD dwMask) {

return ((dwTarget &dwMask) == dwMask) ; }

# define SHOWMASK(dwTarget, type) \\ if (TestSet(dwTarget, PAGE_##type) ) \\ {std :: cout << \

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) ; }

// ±éÀúÕû¸öÐéÄâÄÚ´æ²¢¶ÔÓû§ÏÔʾÆäÊôÐԵŤ×÷³ÌÐòµÄ·½·¨ void WalkVM(HANDLE hProcess) {

// Ê×ÏÈ£¬»ñµÃϵͳÐÅÏ¢ SYSTEM_INFO si;

36

:: ZeroMemory(&si, sizeof(si) ) ; :: GetSystemInfo(&si) ;

// ·ÖÅäÒª´æ·ÅÐÅÏ¢µÄ»º³åÇø MEMORY_BASIC_INFORMATION mbi;

:: ZeroMemory(&mbi, sizeof(mbi) ) ;

// Ñ­»·Õû¸öÓ¦ÓóÌÐòµØÖ·¿Õ¼ä

LPCVOID pBlock = (LPVOID) si.lpMinimumApplicationAddress; while (pBlock < si.lpMaximumApplicationAddress) {

// »ñµÃÏÂÒ»¸öÐéÄâÄÚ´æ¿éµÄÐÅÏ¢ if (:: VirtualQueryEx(

hProcess, // Ïà¹ØµÄ½ø³Ì pBlock, // ¿ªÊ¼Î»Öà &mbi, // »º³åÇø sizeof(mbi))==sizeof(mbi) ) // ´óСµÄÈ·ÈÏ {

// ¼ÆËã¿éµÄ½áβ¼°Æä´óС

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? \ << \

// ÏÔʾ¿éµÄ״̬ switch(mbi.State) {

case MEM_COMMIT :

std :: cout << \ break;

case MEM_FREE :

std :: cout << \ break;

case MEM_RESERVE :

std :: cout << \ break; }

// ÏÔʾ±£»¤

if(mbi.Protect==0 && mbi.State!=MEM_FREE)

37

{

mbi.Protect=PAGE_READONLY; }

ShowProtection(mbi.Protect);

// ÏÔʾÀàÐÍ

switch(mbi.Type){ case MEM_IMAGE :

std :: cout << \ break;

case MEM_MAPPED:

std :: cout << \ break;

case MEM_PRIVATE :

std :: cout << \ break; }

// ¼ìÑé¿ÉÖ´ÐеÄÓ°Ïñ

TCHAR szFilename [MAX_PATH] ; if (:: GetModuleFileName (

(HMODULE) pBlock, // ʵ¼ÊÐéÄâÄÚ´æµÄÄ£¿é¾ä±ú szFilename, //Íêȫָ¶¨µÄÎļþÃû³Æ MAX_PATH)>0) //ʵ¼ÊʹÓõĻº³åÇø´óС {

// ³ýȥ·¾¶²¢ÏÔʾ

:: PathStripPath(szFilename) ;

std :: cout << \ }

std :: cout << std :: endl; // ÒÆ¶¯¿éÖ¸ÕëÒÔ»ñµÃÏÂһϸö¿é pBlock = pEnd; } } }

void ShowVirtualMemory() {

// Ê×ÏÈ£¬ÈÃÎÒÃÇ»ñµÃϵͳÐÅÏ¢ SYSTEM_INFO si;

:: ZeroMemory(&si, sizeof(si) ) ; :: GetSystemInfo(&si) ;

// ʹÓÃÍâ¿Ç¸¨Öú³ÌÐò¶ÔһЩ³ß´ç½øÐиñʽ»¯ TCHAR szPageSize[MAX_PATH];

::StrFormatByteSize(si.dwPageSize, szPageSize, MAX_PATH) ;

38

DWORD dwMemSize = (DWORD)si.lpMaximumApplicationAddress - (DWORD) si.lpMinimumApplicationAddress; TCHAR szMemSize [MAX_PATH] ;

:: StrFormatByteSize(dwMemSize, szMemSize, MAX_PATH) ;

// ½«ÄÚ´æÐÅÏ¢ÏÔʾ³öÀ´

std :: cout << \

std :: cout.fill ('0') ;

std :: cout << \ << std :: hex << std :: setw(8)

<< (DWORD) si.lpMinimumApplicationAddress << std :: endl;

std :: cout << \ << std :: hex << std :: setw(8)

<< (DWORD) si.lpMaximumApplicationAddress << std :: endl;

std :: cout << \ << szMemSize << std :: endl ; }

void main() {

//ÏÔʾÐéÄâÄÚ´æµÄ»ù±¾ÐÅÏ¢ ShowVirtualMemory();

// ±éÀúµ±Ç°½ø³ÌµÄÐéÄâÄÚ´æ

::WalkVM(::GetCurrentProcess()); }

39

ʵÑéÎå ÎļþºÍÉ豸¹ÜÀí

±³¾°ÖªÊ¶

1. Ñ¡ÔñÎļþϵͳ

Îļþϵͳ¾ö¶¨Á˲Ù×÷ϵͳÄܹ»¶Ô´ÅÅ̽øÐеĴ¦Àí¡£Windows 2000Ö§³ÖµÄÎļþϵͳÖ÷ÒªÓУº 1) Îļþ·ÖÅä±í (File Allocation Table£¬FAT) Îļþϵͳ (FAT16) 2) ±£»¤Ä£Ê½FATÎļþϵͳ (FAT32) 3) Windows NTÎļþϵͳ (NTFS)

FATÎļþϵͳÊÇÔçÆÚÎļþϵͳ֮һ£¬Ò²ÊÇMS-DOSʹÓõÄԭʼÎļþϵͳ¡£Ëü½«ÎļþÐÅÏ¢´¢´æÔÚλÓÚ¾í±ê¿ªÍ·´¦µÄÎļþ·ÖÅä±íÖУ¬²¢±£´æÁ½·ÝÎļþ·ÖÅä±í£¬ÒÔ·ÀÆäÖеÄÒ»¸öÔâµ½ÆÆ»µ£¬¼ûͼ7-1Ëùʾ¡£

FATÎļþϵͳ×î´óµÄÓŵãÊÇMS-DOS¡¢Windows 9xÉõÖÁOS/2¶¼ÄÜ·ÃÎÊFAT¾í±ê£»¶øÆä×î´óµÄÈõµãÊÇËæ×ÅFAT¾í±ê³ß´çµÄÔö³¤£¬×îСµÄ´Ø³ß´çÒ²ËæÖ®Ôö³¤¡£¶ÔÓÚ´óÓÚ512MBµÄÓ²Å̶øÑÔ£¬×îСµÄ´Ø³ß´çΪ16KB£»¶ÔÓÚ´óÓÚ2GBµÄÓ²ÅÌ£¬×îСµÄ´Ø³ß´çΪ64KB¡£Õâ¾Íµ¼Ö´ÅÅ̿ռäµÄ¼«´óÀË·Ñ£¬ÒòΪһ¸öÎļþ±ØÐëÕ¼ÓÃÕûÊý¸ö´Ø¡£Òò´Ë£¬1KBµÄÎļþÔÚ2GBµÄÓ²ÅÌÉϽ«Õ¼ÓÃ64KBµÄ´ÅÅ̿ռ䡣FATÎļþϵͳ²»Ö§³Ö³ß´ç´óÓÚ4GBµÄ¾í±ê¡£

BIOS ²ÎÊý Îļþ ·ÖÅä±í Îļþ·ÖÅä ±í¸±±¾ ÎļþºÍĿ¼ ¸ùĿ¼

ͼ5-1 FATÎļþϵͳµÄ½á¹¹

FAT32Îļþϵͳͨ¹ýÌṩ³¤ÎļþÃûµÄÖ§³ÖÀ´À©Õ¹FATÎļþϵͳ£¬²¢ÓëFAT16¼æÈÝ¡£FAT (16ºÍ32) ÎļþϵͳÊÇÖ§³Ö¿ÉÒÆ¶¯Ã½Ìå (ÀýÈçÈíÅÌ) ÉϵÄΩһµÄÎļþϵͳ¡£

Windows NTÎļþϵͳ (NTFS) °üÀ¨ÁËFATÎļþϵͳµÄËùÓй¦ÄÜ£¬Í¬Ê±ÓÖÌṩÁ˶Ը߼¶ÎļþÏµÍ³ÌØÕ÷ (ÀýÈ簲ȫģʽ¡¢Ñ¹ËõºÍ¼ÓÃÜ) µÄÖ§³Ö¡£ËüÊÇΪÔÚ´ó´ÅÅÌÉÏÓÐЧµØÍê³ÉÎļþ²Ù×÷¶øÉè¼ÆµÄ¡£ÓëFATºÍ±£»¤Ä£Ê½FATÎļþϵͳ²»Í¬£¬ËüµÄ×îС´Ø³ß´ç²»³¬¹ý4KB¡£µ«ÊÇ£¬NTFS¾í±êÖ»ÄÜΪWindows NT¡¢2000ºÍXP²Ù×÷ϵͳËù·ÃÎÊ¡£

Windows 2000ÌṩµÄÐÂÌØÕ÷ (NTFS 5.0) ʹÎļþϵͳ¸ü°²È«¡¢¸ü¿É¿¿£¬±ÈÒÔÍùµÄWindows°æ±¾¸üºÃµØÖ§³Ö·Ö²¼Ê½¼ÆËã¡£

´ËÍ⣬Windows 2000Ö§³ÖµÄÎļþϵͳ»¹ÓУº

CDFS£º¹âÅÌÎļþϵͳ (Compact Disc File System) ÓÃÓÚ¹âÅ̵ÄÎļþ´æ´¢¡£ UDF£ºÍ¨ÓôÅÅ̸ñʽ (Universal Disk Format) ÓÃÓÚDVDµÄÎļþ´æ´¢¡£

ÔÚÎļþϵͳÖУ¬FAT16¡¢FAT32ºÍNTFSÕâÈý¸öÎļþϵͳ¶Ô´ÅÅÌ×ÓϵͳµÄÐÔÄÜÓ°Ïì×î´ó¡£¶øÊÂʵÉÏ£¬Ñ¡ÔñNTFSÖ®ÍâµÄÈκÎÎļþϵͳ¶¼Ö»ÓÐÁ½¸öÀíÓÉ£¬¼´£º

1) ¿ÉË«Òýµ¼ÏµÍ³ 2) СÓÚ400MBµÄ¾í

Èç¹ûϵͳ²»ÊÇÕâÁ½ÖÖÇé¿ö£¬ÄÇôNTFS¾ÍÓ¦¸ÃÊÇËùÑ¡ÔñµÄÎļþϵͳ£¬NTFS½«Ìṩ¸üºÃµÄÐÔÄÜ¡¢¿É¿¿ÐԺͰ²È«ÐÔ¡£

2. EFS¼ÓÃÜÎļþϵͳ

EFS (Encrypting File System) ʵ¼ÊÉÏÊÇNTFSµÄÒ»¸öÌØÐÔ£¬ËüÌṩÁ˺ËÐÄÎļþ¼ÓÃܼ¼Êõ£¬Ö÷ÒªÓÃÀ´ÔÚNTFSÎļþϵͳ¾íÉÏ´æ´¢¼ÓÃÜÎļþ¡£ÔÚ¼ÓÃÜÁËÎļþ»òÎļþ¼ÐÖ®ºó£¬Ê¹ÓüÓÃÜÎļþºÍÎļþ¼ÐµÄ·½·¨ÓëʹÓÃÆäËûÈκÎÎļþºÍÎļþ¼ÐÏàͬ¡£¼´£¬¼ÓÃܶÔÓÚ¼ÓÃܸÃÎļþµÄÓû§À´ËµÊÇ͸Ã÷µÄ£¬ÕâÒâζ×Ų»±ØÔÚʹÓüÓÃÜÎļþ֮ǰ½«Æä½âÃÜ£¬¿ÉÒÔÏñƽ³£Ò»Ñù´ò¿ªºÍ¸ü¸ÄÎļþ¡£µ«ÊÇ£¬Èç¹ûÇÖÈëÕßÊÔͼ´ò¿ª¡¢¸´ÖÆ¡¢Òƶ¯»òÖØÃüÃû¼ÓÃܵÄÎļþ»òÎļþ¼Ð£¬ÄÇôËû½«½ÓÊÕµ½Ò»Ìõ¾Ü¾ø·ÃÎʵÄÏûÏ¢¡£

ÏñÉèÖÃÆäËûÈκÎÊôÐÔ (ÈçÖ»¶Á¡¢Ñ¹Ëõ»òÒþ²Ø) Ò»Ñù£¬¿ÉÒÔͨ¹ýÉèÖÃÎļþ¼ÐºÍÎļþµÄ¼ÓÃÜÊôÐÔÀ´¶ÔÎļþ¼Ð»òÎļþ¼ÓÃÜ»ò½âÃÜ¡£Èç¹û¼ÓÃÜÎļþ¼Ð£¬ÄÇôÔÚ¼ÓÃÜÎļþ¼ÐÖд´½¨µÄËùÓÐÎļþºÍ×ÓÎļþ¼Ð¶¼½«¼ÓÃÜ¡£Òò´Ë£¬ÍƼöÔÚÎļþ¼ÐÒ»¼¶ÉϼÓÃÜ¡£

ʹÓÃEFS±£»¤ÎĵµµÄ°²È«£¬¿ÉÒÔ·ÀÖ¹ÇÖÈëÕß»ñµÃ¶Ô´æ´¢µÄÃô¸ÐÊý¾ÝµÄδ¾­ÊÚȨµÄÎïÀí·ÃÎÊ¡£

EFS´øÀ´µÄ¸½¼Ó°²È«ÐÔÊÇÒÔÐÔÄÜΪ´ú¼ÛµÄ¡£µ±²Ù×÷ϵͳ¶ÔËù·ÃÎʵļÓÃÜÎļþ½øÐмÓÃÜ»ò½âÃÜʱ£¬Îļþ´«Ê佫Ôö¼ÓÒ»µãÑÓ³Ù¡£

Ó°ÏìϵͳÐÔÄܵij̶Ƚ«¾ßÌåÈ¡¾öÓÚÖ´ÐмÓÃÜ»ò½âÃܲÙ×÷µÄϵͳµÄ´¦ÀíÄÜÁ¦¡£¶ÔÓÚÔÚ±¾µØÇý¶¯Æ÷Éϰüº¬¼ÓÃÜÎļþµÄÏÖ´ú¹¤×÷Õ¾À´Ëµ£¬ÒòΪÕâЩϵͳͨ³£²»ÊÜ´¦ÀíÆ÷ÏÞÖÆ£¬ËùÒÔÓ°Ïìͨ³£¿ÉÒÔºöÂÔ²»¼Æ¡£ÕâÖÖÓ°Ïì¶Ô´¦ÀíÆ÷ÉϵĶîÍâ

40