日本免费全黄少妇一区二区三区-高清无码一区二区三区四区-欧美中文字幕日韩在线观看-国产福利诱惑在线网站-国产中文字幕一区在线-亚洲欧美精品日韩一区-久久国产精品国产精品国产-国产精久久久久久一区二区三区-欧美亚洲国产精品久久久久

Windows2000下用戶(hù)模式的內(nèi)存掃描

簡(jiǎn)述:
本文簡(jiǎn)要介紹了在Windows2000下實(shí)現(xiàn)內(nèi)存掃描的基本理論和實(shí)現(xiàn)的辦
法 。內(nèi)存掃描是一項(xiàng)重要的技術(shù),有相當(dāng)廣泛的應(yīng)用范圍:如病毒掃描、
游戲修改等 。Windows2000是一個(gè)完全保護(hù)的系統(tǒng),且具有兩種工作模式,
即用戶(hù)態(tài)和核心態(tài)(User Model and Kernel Model) 。內(nèi)存掃描也可分為
用戶(hù)態(tài)的內(nèi)存掃描與核心態(tài)的內(nèi)存掃描 。本文主要講述的是工作于用戶(hù)態(tài)
的內(nèi)存掃描 。
一.相關(guān)理論
早期在Dos壞境下進(jìn)行內(nèi)存掃描是一件相對(duì)簡(jiǎn)單的事情 。因?yàn)镈OS工作在
CPU的實(shí)模式下,沒(méi)有采用虛存技術(shù)也沒(méi)有提供內(nèi)存的保護(hù)機(jī)制,只要實(shí)實(shí)
在在的掃描完所有的物理內(nèi)存,一切工作也就完成了,早期有一些防毒軟
件就是用了這樣的辦法 。當(dāng)然為了提高效率,我們并不用掃描所有的內(nèi)存
區(qū)域,因?yàn)橛行┛臻g是沒(méi)有被用到的,掃描這些地方也是只浪費(fèi)時(shí)間 。這
可以通過(guò)遍歷DOS系統(tǒng)的MCB(Memory Control Block)鏈,來(lái)得到實(shí)際內(nèi)
存的使用區(qū)域,從而使掃描的效率大大提高 。相似的思路在Windows2000下
的內(nèi)存掃描也是適用的 。
Windows2000則是一個(gè)完全保護(hù)的系統(tǒng),工作于CPU的保護(hù)模式下,引入
了虛存技術(shù) 。每個(gè)進(jìn)程擁有獨(dú)立的4GB的地址空間,其中低的2GB為進(jìn)程的私有空間,高的2GB為系統(tǒng)空間的映射(如果在Boot.ini文件中使用
“/3GB”的開(kāi)關(guān)可以使進(jìn)程的私有空間增大到3GB,系統(tǒng)空間1GB) 。對(duì)于
每個(gè)進(jìn)程來(lái)講其虛擬的地址空間是連續(xù)的,實(shí)際上它們是以頁(yè)面為單位
離 散的存在于物理內(nèi)存中,一些可能被交換到硬盤(pán)上的頁(yè)面文件中,而
且還有大部分的空間是未提交(Uncommitted)的 。因此在Windows2000
中對(duì)進(jìn)程的用戶(hù)空間進(jìn)行掃描必須依次對(duì)每個(gè)進(jìn)程的空間進(jìn)行掃描 。一
個(gè)進(jìn)程的低2GB有空間的分布如下表:
范圍
大小
作用
0x0~~ 0xFFFF
64 KB
不可訪(fǎng)問(wèn)區(qū)域,只是用來(lái)防止非法的指針訪(fǎng)問(wèn),訪(fǎng)問(wèn)該范圍的地址會(huì)導(dǎo)致訪(fǎng)問(wèn)違例 。
0x10000~~
0x7FFEFFFF
2 GB 減去至少 192 KB
進(jìn)程的私有地址空間
0x7FFDE000~~
0x7FFDEFFF
4 KB
【W(wǎng)indows2000下用戶(hù)模式的內(nèi)存掃描】進(jìn)程中第一個(gè)線(xiàn)程的線(xiàn)程環(huán)境塊,即 TEB ( Thread environment block )
0x7FFDF000~~ 0x7FFDFFFF
4 KB
進(jìn)程的進(jìn)程環(huán)境塊,即 PEB ( Process environment block )
0x7FFE0000~~
0x7FFE0FFF
4 KB
一個(gè)共享的只讀用戶(hù)數(shù)據(jù)塊,該塊映射到到系
統(tǒng)空間的一個(gè)數(shù)據(jù)塊,其中存放的是一些系統(tǒng)
信息如系統(tǒng)時(shí)間、時(shí)鐘的滴答數(shù)、系統(tǒng)版本號(hào)
等 。這樣訪(fǎng)問(wèn)這些信息的時(shí)候系統(tǒng)就不用切換
到核心模式 。
0x7FFE1000~~
0x7FFEFFFF
60 KB
不可訪(fǎng)問(wèn)
0x7FFF0000~~ 0x7FFFFFFF
64 KB
不可訪(fǎng)問(wèn),用于防止線(xiàn)程的緩沖跨越兩種模式
空間的邊界
表 1
二.實(shí)現(xiàn) 從上表可以看出,我們要掃描范圍的起點(diǎn)和終點(diǎn)不是從 0~~2GB,而只是其中的一 部分 。要得到這個(gè)起點(diǎn)和終點(diǎn)可以使用API函數(shù)GetSystemInfo,函數(shù)的原型如下: VOID GetSystemInfo( LPSYSTEM_INFO lpSystemInfo // system information ); 而在結(jié)構(gòu)SYSTEM_INFO中有兩個(gè)域: lpMinimumApplicationAddress 和 lpMaximumApplicationAddress (類(lèi)型都是 LPVOID) 中 ,我們就可以得到一個(gè)應(yīng)用程序可用的最小和最大的地址空間 。這樣我們就得到了要掃描的地址的起點(diǎn)和終點(diǎn) 。那么是不是這起點(diǎn)和終點(diǎn)間所有的地址都要掃描呢?并不是這樣的,因?yàn)橐话闱闆r下一個(gè)進(jìn)程是用不著這么大(接近2GB)的地址空間的 。因此一個(gè)進(jìn)程的大部分地址空間都是未用(Free)或是保留(Reserved)的,真正用到的只是那些已提交(Committed)的內(nèi)存而已 。內(nèi)存頁(yè)面可以有三種狀態(tài): 未用( Free)、保留(Reserved)和提交

推薦閱讀