欧美在线观看视频网站,亚洲熟妇色自偷自拍另类,啪啪伊人网,中文字幕第13亚洲另类,中文成人久久久久影院免费观看 ,精品人妻人人做人人爽,亚洲a视频

Vista操作系統(tǒng)下網(wǎng)絡信息的獲取方法

文檔序號:6584265閱讀:220來源:國知局
專利名稱:Vista操作系統(tǒng)下網(wǎng)絡信息的獲取方法
技術領域
本發(fā)明涉及涉及一種Windows Vista操作系統(tǒng)下網(wǎng)絡信息的獲取方法,在WindowsVista物理內(nèi)存鏡像文件中查找網(wǎng)絡連接信息,以應用于信息安全事件和各類計算機網(wǎng)絡犯罪案件的調(diào)查取證,屬于計算機取證技術領域。
背景技術
在計算機在線取證技術領域中,由于網(wǎng)絡連接信息能夠描述計算機在被調(diào)查時與外界的通訊情況,可作為判斷被調(diào)查者是否正在從事非法的網(wǎng)絡活動的重要證據(jù)。網(wǎng)絡連接信息作為易失性數(shù)據(jù)駐留在物理內(nèi)存中,其獲取依賴于正確的物理內(nèi)存分析方法。為推進物理內(nèi)存分析技術的發(fā)展,DFRWS(Digital Forensic Research Workshop)于2005年推出了名為"Forensics Challenge"的活動,活動的主題就是物理內(nèi)存分析。從此,對于物理內(nèi)存的分析和獲取成為計算機取證的研究熱點。Zhang等的Windows MemoryAnalysis Based on KPCR(Ruichao Zhang, Lianhai Wang, Shuhui Zhang, 〃 WindowsMemory Analysis Based on KPCR, 〃 ias,vol.2,pp. 677-680,2009Fifth InternationalConference on InformationAssurance and Security, 2009)在物理內(nèi)存分析中具有高可靠性的優(yōu)點,使用該方法能夠?qū)indows各版本鏡像文件進行分析,獲取系統(tǒng)進程以及系統(tǒng)加載驅(qū)動等信息。 目前,能夠從物理內(nèi)存鏡像文件中獲取網(wǎng)絡連接信息的工具有Walters和Petroni開發(fā)的Volatility。 Volatility 1. 3—Bata版(目前推出的最新版本)能夠獲取MicrosoftWindows XP內(nèi)存鏡像文件中的網(wǎng)絡連接信息?,F(xiàn)將其方法具體描述如下 通過查找tcpip. sys中的Addr0bjTable來獲取Tcp、 Udp協(xié)議打開的端口 ;使用TCBTable來獲取已經(jīng)建立的網(wǎng)絡連接信息。 根據(jù)tcpip. sys中Addr0bjTable的地址指向的內(nèi)容可以確定0bjTable的地址和大小。0bjTable中存放了一定數(shù)量的地址,這些地址指向0bjTable中的各表項,通過分析表項即可獲得Tcp、 Udp協(xié)議打開的端口 。 根據(jù)tcpip. sys中TCBTable的地址指向的內(nèi)容定位TCBTable的內(nèi)容,通過分析TCBTable的各表項,即可獲得已經(jīng)建立的網(wǎng)絡信息。 上述網(wǎng)絡連接信息的查找方法固然簡單可行,但只適使用于WindowsXP版本,在Vista操作系統(tǒng)的各版本中卻不適用在Vista操作系統(tǒng)中,tcpip. sys中已經(jīng)沒有了Addr0bjTable和0bjTable這兩個變量,無法使用上述方法獲得網(wǎng)絡連接信息。

發(fā)明內(nèi)容
因此,針對Windows操作系統(tǒng)的發(fā)展和目前網(wǎng)絡連接信息獲取的上述技術狀況,本發(fā)明提供了一種能夠在Windows Vista內(nèi)存鏡像文件中獲取網(wǎng)絡連接信息的方法。
本發(fā)明采用以下技術方案
該發(fā)明Vista操作系統(tǒng)下網(wǎng)絡信息的獲取方法,包括以下步驟 1)通過物理內(nèi)存分析獲得tcpip. sys模塊的基地址虛擬地址; 2)根據(jù)步驟1)得到的基地址虛擬地址加上當前操作系統(tǒng)下該基地址與數(shù)據(jù)結(jié)構(gòu)
TcpEndpointPool的地址差獲取TcpEndpointPool的虛擬地址; 3)根據(jù)當前操作系統(tǒng)下地址轉(zhuǎn)換規(guī)則將步驟2)得到的虛擬地址轉(zhuǎn)換為物理地址,并定位到內(nèi)存鏡像中該物理地址指向的第一位置; 4)在步驟3)所得指向的第一位置讀取前4個字節(jié)作為虛擬地址轉(zhuǎn)換為物理地址,并定位到內(nèi)存鏡像中該物理地址指向的第二位置,在該第二位置的偏移0xlc處讀取前4個字節(jié)獲得TcpEndpointPool這一雙鏈表中第一個TcpEndpoint結(jié)構(gòu)頭的虛擬地址;
5)處理當前單鏈表頭為TcpEndpoint結(jié)構(gòu)頭的單鏈表 a)把當前TcpEndpoint結(jié)構(gòu)頭的虛擬地址轉(zhuǎn)化為物理地址,定位到內(nèi)存鏡像中該物理地址處,讀取前4個字節(jié)得到該單鏈表下第一個節(jié)點的虛擬地址;
b)判斷單鏈表當前節(jié)點的虛擬地址是否為O,若是,該單鏈表處理結(jié)束;若不是,轉(zhuǎn)步驟c); c)把單鏈表當前節(jié)點的虛擬地址轉(zhuǎn)化為物理地址,定位到內(nèi)存鏡像中該物理地址處,讀取前0x180個字節(jié)放入buffer中; d)讀取buffer的偏移0x14處4個字節(jié)的值,判斷該值是否為指向EPROCESS結(jié)構(gòu)體的指針,若是,則該結(jié)構(gòu)體為TcpEndpoint結(jié)構(gòu),轉(zhuǎn)步驟f),否則,該結(jié)構(gòu)體為TCB結(jié)構(gòu),轉(zhuǎn)下一步; e)解析TCB結(jié)構(gòu)依據(jù)當前操作系統(tǒng)的EPROCESS結(jié)構(gòu)體的特征,找出創(chuàng)建網(wǎng)絡連接的進程0wningProcess的連接信息,之后進行下一步; f)讀取buffer偏移0x0處的4個字節(jié)獲取當前單鏈表下一個節(jié)點的虛擬地址,轉(zhuǎn)步驟b); 6)依據(jù)相鄰TcpEndpoint結(jié)構(gòu)頭所存放的_LIST_ENTRY結(jié)構(gòu)的鏈接關系,若下一個JJS乙ENTRY的虛擬地址等于第一個TcpEndpoint結(jié)構(gòu)頭的虛擬地址加0x30,結(jié)束;否則,將該下一個—LSI乙ENTRY的虛擬地址減0x30得到對應當前TcpEndpoint結(jié)構(gòu)頭的下一個結(jié)構(gòu)頭的虛擬地址,進入下一步; 7)根據(jù)步驟6)的得到的下一個結(jié)構(gòu)頭的標志位判斷該結(jié)構(gòu)頭是否為TcpEndpoint結(jié)構(gòu)頭,若是,轉(zhuǎn)步驟5),若否,轉(zhuǎn)步驟6)。 對于各種Vista操作系統(tǒng)版本中,驅(qū)動tcpip. sys中都存在數(shù)據(jù)結(jié)構(gòu)TcpEndpointPool (又稱Tcp端點池,從數(shù)據(jù)結(jié)構(gòu)上描述,該池是一個雙向鏈表,簡稱雙鏈表,雙鏈表上的每個節(jié)點又是一個單鏈表的結(jié)構(gòu)頭,根據(jù)單鏈表的結(jié)構(gòu)頭的標志,可以判斷單鏈表上的節(jié)點結(jié)構(gòu)),該結(jié)構(gòu)相對于tcpip. sys的位置在各Windows Vista版本中都是固定的,并且TcpEndpointPool中的結(jié)構(gòu)不會隨Vista版本的變化而變化,所以依據(jù)本發(fā)明技術方案的Vi sta操作系統(tǒng)下網(wǎng)絡信息的獲取方法是可靠的。且可以適用于Vista的多個版本中,適用范圍廣,也解決了目前沒有Vista操作系統(tǒng)下網(wǎng)絡信息的獲取方法的現(xiàn)狀。
依據(jù)本方案,整個方法所涉及的運算量比較低,可以通過內(nèi)存分析方法對網(wǎng)絡連接信息進行快速查找,查找效率是比較高的,且通過編程實現(xiàn)起來也很方便,可實現(xiàn)性比較強。
上述獲取方法,所述步驟1)的物理內(nèi)存分析方法采用基于K P C R結(jié)構(gòu)的 Windows系統(tǒng)物理內(nèi)存分析方法。 上述獲取方法,所述步驟1)包括首先通過物理內(nèi)存分析獲得內(nèi)核變量 psLoadeModuleList,并讀取該內(nèi)核變量第一個模塊的虛擬地址,判斷該模塊的名稱是否為 tcpip. sys,若是,則取驅(qū)動模塊tcpip. sys的基地址;若不是,則進行下一個模塊的判斷, 循環(huán)進行判斷模塊名稱及其后的步驟直至找到驅(qū)動模塊tcpip. sys并取其基地址。
上述獲取方法,所述步驟2)中,若當前操作系統(tǒng)為Windows Vista SP1 ,則 TcpEndpointPool的虛擬地址為步驟l)得到的基地址虛擬地址+0xd0d5C ;若當前操作系統(tǒng) 為Windows Vista SP2,則TcpEndpointPool的虛擬地址為步驟1)得到的基地址虛擬地址 +0xd3e9c。 上述獲取方法,所述步驟5)的子步驟e)包括讀取buffer的偏移0x164處的4 個字節(jié),得到EPROCESS結(jié)構(gòu)體的虛擬地址,把其轉(zhuǎn)化為物理地址,然后定位到內(nèi)存鏡像文 件的EPROCESS結(jié)構(gòu)體物理地址+0x9c處,讀取前4個字節(jié),得到當前節(jié)點對應的網(wǎng)絡連 接的Pid ;之后讀取buffer的偏移0x16c處的8個字節(jié)得到該網(wǎng)絡連接的創(chuàng)建時間,讀取 buffer的偏移0x2c處的2個字節(jié)并轉(zhuǎn)化為10進制數(shù)得到該網(wǎng)絡連接的本地端口的值,讀 取buffer的偏移0x2e處的2個字節(jié),轉(zhuǎn)化為10進制數(shù)即是遠程端口的值。
上述獲取方法,所述步驟5)的子步驟e)還包括以下步驟1)定位到buffer的 0x10處讀取4個字節(jié)轉(zhuǎn)換成物理地址并記為nlPathPA,定位到內(nèi)存鏡像文件的物理地址 nlPathPA+0x08處,讀取4個字節(jié)得到遠程地址的值;11)讀取buffer的偏移0x34處的4個 字節(jié)轉(zhuǎn)化成物理地址并記為nlLocalPA,定位到內(nèi)存鏡像文件的物理地址nlLocalPA+0x0c 處,讀取4個字節(jié)記為nlIdentifierPA,定位到內(nèi)存鏡像文件的物理地址nlIdentifierPA 處,讀取4個字節(jié)并轉(zhuǎn)化為物理地址,定位到內(nèi)存鏡像文件的該地址處,讀取4個字節(jié)得到 本地地址的值。


下面結(jié)合說明書附圖對本發(fā)明技術方案作更具體的描述,使本領域的技術人員更 好的理解本發(fā)明,其中 圖1為TcpEndpointPool內(nèi)部組織結(jié)構(gòu)圖。 圖2為雙鏈表上每個節(jié)點的一般結(jié)構(gòu)圖。 圖3為結(jié)構(gòu)頭的連接關系圖。 圖4為本發(fā)明實施例Vista操作系統(tǒng)下網(wǎng)絡信息的獲取方法的概括描述流程圖。 圖5為內(nèi)核變量pcLoadedModuleList的地址獲取方法流程圖。 圖6為頁大小4KB的地址轉(zhuǎn)換。 圖7為頁大小4MB的地址轉(zhuǎn)換。 圖8為PAE (Physical Address Extension)機制下頁大小為4KB的地址轉(zhuǎn)換。 圖9為PAE機制下頁大小為2MB的地址轉(zhuǎn)換。 圖10為PSE(Page Size Extension)-36機制下的地址轉(zhuǎn)換。 圖11為獲取tcpip. sys基地址流程圖。 圖12為處理TcpEndpoint結(jié)構(gòu)頭引導的單鏈表流程圖。
具體實施例方式
參照說明書附圖4和12,其示出了一種Vista操作系統(tǒng)下網(wǎng)絡信息的獲取方法,該 獲取方法包括以下步驟 1)通過物理內(nèi)存分析獲得tcpip. sys模塊的基地址虛擬地址; 2)根據(jù)步驟1)得到的基地址虛擬地址加上當前操作系統(tǒng)下該基地址與數(shù)據(jù)結(jié)構(gòu)
TcpEndpointPool的地址差獲取TcpEndpointPool的虛擬地址; 3)根據(jù)當前操作系統(tǒng)下地址轉(zhuǎn)換規(guī)則將步驟2)得到的虛擬地址轉(zhuǎn)換為物理地 址,并定位到內(nèi)存鏡像中該物理地址指向的第一位置; 4)在步驟3)所得指向的第一位置讀取前4個字節(jié)作為虛擬地址轉(zhuǎn)換為物理地址, 并定位到內(nèi)存鏡像中該物理地址指向的第二位置,在該第二位置的偏移0xlc處讀取前4個 字節(jié)獲得TcpEndpointPool這一雙鏈表中第一個TcpEndpoint結(jié)構(gòu)頭的虛擬地址;
5)處理當前單鏈表頭為TcpEndpoint結(jié)構(gòu)頭的單鏈表 a)把當前TcpEndpoint結(jié)構(gòu)頭的虛擬地址轉(zhuǎn)化為物理地址,定位到內(nèi)存鏡像中該 物理地址處,讀取前4個字節(jié)得到該單鏈表下第一個節(jié)點的虛擬地址;
b)判斷單鏈表當前節(jié)點的虛擬地址是否為O,若是,該單鏈表處理結(jié)束;若不是, 轉(zhuǎn)步驟c); c)把單鏈表當前節(jié)點的虛擬地址轉(zhuǎn)化為物理地址,定位到內(nèi)存鏡像中該物理地址 處,讀取前0x180個字節(jié)放入buffer中; d)讀取buffer的偏移0x14處4個字節(jié)的值,判斷該值是否為指向EPROCESS結(jié)構(gòu) 體的指針,若是,則該結(jié)構(gòu)體為TcpEndpoint結(jié)構(gòu),轉(zhuǎn)步驟f),否則,該結(jié)構(gòu)體為TCB結(jié)構(gòu),轉(zhuǎn) 下一步; e)解析TCB結(jié)構(gòu)依據(jù)當前操作系統(tǒng)的EPROCESS結(jié)構(gòu)體的特征,找出創(chuàng)建網(wǎng)絡連 接的進程0wningProcess的連接信息,之后進行下一步; f)讀取buffer偏移0x0處的4個字節(jié)獲取當前單鏈表下一個節(jié)點的虛擬地址,轉(zhuǎn) 步驟b); 6)依據(jù)相鄰TcpEndpoint結(jié)構(gòu)頭所存放的_LIST_ENTRY結(jié)構(gòu)的鏈接關系,若下一 個JJS乙ENTRY的虛擬地址等于第一個TcpEndpoint結(jié)構(gòu)頭的虛擬地址加0x30,結(jié)束;否 則,將該下一個—LSI乙ENTRY的虛擬地址減0x30得到對應當前TcpEndpoint結(jié)構(gòu)頭的下一 個結(jié)構(gòu)頭的虛擬地址,進入下一步; 7)根據(jù)步驟6)的得到的下一個結(jié)構(gòu)頭的標志位判斷該結(jié)構(gòu)頭是否為 TcpEndpoint結(jié)構(gòu)頭,若是,轉(zhuǎn)步驟5),若否,轉(zhuǎn)步驟6)。 說明書附圖1示出了 TcpEndpointPool的內(nèi)部組織結(jié)構(gòu),圓形代表結(jié)構(gòu)頭,圓形內(nèi) 的字符代表該結(jié)構(gòu)頭的標志;矩形代表單鏈表的節(jié)點,矩形內(nèi)的字符代表該節(jié)點的結(jié)構(gòu)體 類型。關于單鏈表上節(jié)點結(jié)構(gòu)的判斷,一個示例若單鏈表的結(jié)構(gòu)頭標志位"TcpE",則依此 標志位為結(jié)構(gòu)頭的單鏈表由TcpEndPoint結(jié)構(gòu)或TCB結(jié)構(gòu)組成。TcpEndPoint結(jié)構(gòu)和TCB 結(jié)構(gòu)描述了 tcpip已建立的網(wǎng)絡連接信息。因此,本方案就是應用了查找TcpEndPoint結(jié) 構(gòu)和TCB結(jié)構(gòu)的方式獲取已建立的網(wǎng)絡連接信息。 優(yōu)選地,參照說明書附圖5,所述步驟1)的物理內(nèi)存分析方法采用基于KPCR結(jié)構(gòu)
7的Windows系統(tǒng)物理內(nèi)存分析方法,該方法由本申請人于2008年11月27日申請的,并于 2009年4月22日公開的中國第200810159260號發(fā)明專利申請所公開,使用本方案可以能
夠準確地實現(xiàn)虛擬地址到物理內(nèi)存地址轉(zhuǎn)換,且能夠準確查找系統(tǒng)進程、系統(tǒng)模塊信息。
具體的,由于需要支持多個CPU, Windows內(nèi)核中為此定義了一套以處理器控制區(qū) KPCR為樞紐的數(shù)據(jù)結(jié)構(gòu),使每個CPU都對應一個KPCR結(jié)構(gòu),用于保存與線程切換有關的全
局信肩,KPCR在線性空間中的位置一般不會隨Windows版本變動而改變。KPCR結(jié)構(gòu)如下
lkd > dt_kpcrnt ! _KPCR十OxOOONtTib—NT—TIB+0x0lc SelfPerPtr32_KPCR+0x020PrcbPtr32—KPRCB+0x024IrqlUChar+0x028IRRUint4B+0x02c IrrActiveUint4B+0x030IDRUint4B+0x034KdVersionBlockPtr32Void十0x038IDTPtr32_KIDTENTRY十0x03c GDTPtr32—KGDTE證Y+0x040TSSPtr32—KTSS+0x044MajorVersionUint2B+0x046MinorVersionUint2B+0x048S etMemberUint4B+0x04c StallScaleFactor :Uint4B
+0x050DebugActiveUChar+0x051NumberUChar+0x052Spare0UChar+0x053SecondLevelCacheAssociativity :UChar
+0x054VdmAlertUint4B+0x058KernelReserved[14]Uint4B+0x090SecondLevelCacheSizeUint4B+0x094HalReserved[16]Uint4B+0x0d4InterruptModeUint4B十0x0d8Sparel:UChar+OxOdc KernelReserved2:[17]Uint4B+0xl20PrcbData:—KPRCB從KPCR結(jié)構(gòu)體中可以看到,在Oxlc處為指向自身的指針,0x20處為指向KPRCB的指針,這兩個指針的差值為0x120,可以根據(jù)此特征來尋找KPCR,使用基于KPCR結(jié)構(gòu)的物理 內(nèi)存分析方法獲得內(nèi)核變量psLoadedModuleList的地址的分析流程如圖5所示
獲取PsLoadedMoudleList地址的具體算法描述如下
St印l在內(nèi)存鏡像文件中尋找兩個大于0x80000000的鄰近值,且滿足這兩個值差 為0x120的條件,此地址減去0xlc為kpcr的值;
St印2CR3寄存器中的內(nèi)容的查找 在J(PRCB結(jié)構(gòu)體中0xlc處為ProcessorSate成員,是一個J(PR0CESS0R—STATE結(jié) 構(gòu)。_KPROCESSOR_STATE結(jié)構(gòu)體中0x2cc處為SpecialRegister成員,在SpecialRegister 偏移地址為0x08處為CR3寄存器。通過分析該處保存的總是系統(tǒng)進程的頁目錄信息,當禁 用物理地址拓展,保存的就是系統(tǒng)進程頁目錄的基地址。綜上分析,KPCR的物理地址加上 0x410后所得的地址指向的內(nèi)容即為CR3寄存器中的內(nèi)容。
St印3根據(jù)CR3寄存器中內(nèi)容實現(xiàn)地址轉(zhuǎn)換 在內(nèi)存中存儲的地址一般都是虛擬地址,而物理內(nèi)存中地址定位的是物理地址,
因此計算虛擬地址(線形地址)到物理地址的映射關系是內(nèi)存分析的關鍵。 說明書附圖6-10表示了 Intel處理器的幾種常見的地址轉(zhuǎn)換方式,根據(jù)intel
64and IA-32Architectures Software Developer' s Ma麗l[3],分頁方式禾口頁的大小主要
由CR4寄存器的PAE標志位、PSE標志位,以及頁目錄的PS標志位等決定的。但是Windows
在實現(xiàn)過程中,卻不是完全按這些來實施的例如在PAE模式下,CR4寄存器的內(nèi)容依然為
O,而且同一目錄下,指向或通過頁表指向的物理內(nèi)存頁的大小也可能不同。通過研究我們
發(fā)現(xiàn)通過以下算法可以確定分頁方式和頁的大小 St印3. 1根據(jù)CR3寄存器的內(nèi)容找到它指向的物理地址。 St印3. 2判斷該地址處的第一個字節(jié),如果不是0x01,則轉(zhuǎn)到st印3。如果是Ol, 則表明使用PAE方式,從這個地址開始的8個字節(jié)是頁目錄指針。根據(jù)待轉(zhuǎn)換的虛擬地址 的第31-30位選擇頁目錄指針(按圖5或圖6的方式來換算),例如如果待轉(zhuǎn)換的地址是 0x8054c2b8,則頁目標指針表的第三項(每項8個字節(jié))為指向頁目錄的指針,根據(jù)這個指 針找到頁目錄基地址。 根據(jù)頁目錄基地址和虛擬地址的第29-21位確定待轉(zhuǎn)換虛擬地址對應的頁目錄 項。例如如果待轉(zhuǎn)換的地址是0x8054c2b8,則第29-21位是000000010 (0x02),則從頁目錄 基地址+8*2開始的8個字節(jié)就是所找的頁目錄項。 判斷該頁目錄項第一個字節(jié)的第高位,如果是"1",則按圖6所示的那樣進行地址 轉(zhuǎn)換。 St印3.3判斷該地址處的第一個字節(jié)最高位,如何是"1",則表表明使用的大頁 模式,按圖4進行地址轉(zhuǎn)換,如果是"O",則表明它指向頁表,可按圖3進行地址轉(zhuǎn)換
St印4確定系統(tǒng)版本在KPCR結(jié)構(gòu)體中0x34處為KdVersionBlock成員,是 一 個指向_DBGKD_GET_
VERSI0N64結(jié)構(gòu)體的指針,KdVersionBlock的結(jié)構(gòu)體如下 lkd > dt_DBGKD_GET_VERSI0N64nt ! _DBGKD_GET_VERSI0N64+0x000MajorVersion :Uint2B+0x002MinorVersion :Uint2B+0x004ProtocolVersion :Uint2B+0x006Flags :Uint2B
+0x008MachineTypeUint2B+0x00a MaxPacketTypeUChar+0x00b MaxSteteChMigeUChar+0x00c MaxManipulateUChar+0x00d SimulationUChar+0x00e U墜ed[1]Uint2B+0x010KernBaseUint8B+0x018PsLoadedModuleList :Uint8B
+0又0200613哪6漲1:£11^81 :Uint8B將KdVersionBlock的指針地址按照上述方法轉(zhuǎn)換為物理地址,定位到鏡像位置此地址處即可獲取系統(tǒng)版本信息。根據(jù)總結(jié),發(fā)行的windows vista的小版本號為6000或者6001, windowsxp的小 版本號為2600, windows 2003的小版本號為3790, windows 2000的小版本號為2195。如 果上述方法獲取的小版本號為上述小版本號之一,說明求得的為正確的kpcr和cr3。否則, 將文件指針后移0x100位繼續(xù)按照KPCR結(jié)構(gòu)特征進行檢索。
St印5內(nèi)核變量PsLoadedModuleList的物理地址的查找 由KdVersionBlock的結(jié)構(gòu)體可知,將KdVersionBlock的指針地址加上0x18即 得到內(nèi)核變量PsLoadedModuleList的虛擬地址,按照上述方法轉(zhuǎn)換為物理地址,定位到鏡 像位置此地址處即可獲得PsLoadedModuleList的虛擬地址,再進行一次地址轉(zhuǎn)換即得到 PsLoadedModuleList的物理地址。 PsLoadedModuleList所指向的結(jié)構(gòu)是—M0DULE—ENTRY。該結(jié)構(gòu)的定義如下 Typedef struct_M0UDLE_ENTRY{ LIST—ENTRY le_mod ; DWORD unknown [4]; DWORD base ; DWORD driver_start ; DWORD Size ; UNICODE—STRING driver—Path; UNICODE—STRING driver—Name; } M0DULE_ENTRY , *PM0DULE_ENTRY ; 在本方案中,所有的物理地址和虛擬地址的轉(zhuǎn)換,以及涉及到的Vsita的版本確 定均可采用以上方案。就目前來看,本領域的技術人員還可以采用其他的內(nèi)存分析方法,比 如目前常用的物理內(nèi)存鏡像分析方法。 參考說明書附圖ll,所述步驟l)包括首先通過物理內(nèi)存分析獲得內(nèi)核變量 psLoadeModuleList,并讀取該內(nèi)核變量第一個模塊的虛擬地址,判斷該模塊的名稱是否為 tcpip. sys,若是,則取驅(qū)動模塊tcpip. sys的基地址;若不是,則進行下一個模塊的判斷, 循環(huán)進行判斷模塊名稱及其后的步驟直至找到驅(qū)動模塊tcpip. sys并取其基地址。從而通 過名稱匹配可以方便的獲取驅(qū)動模塊tcpip. sys,并依據(jù)本方案獲得psLoadeModuleList 地址的情況下,依據(jù)附圖11所示的獲取方案容易獲得tcpip. sys的基地址。
10
關于獲得tcpip. sys基地址的方法,更具體的描述是 St印l'定位到內(nèi)存鏡像中psLoadedModuleList的物理地址指向的位置,讀取4個 字節(jié),即為第一個驅(qū)動模塊的_M0UDLE_ENTRY結(jié)構(gòu)的起始虛擬地址,將其轉(zhuǎn)化為物理地址, 進行下一步; St印2'定位到內(nèi)存鏡像中該物理地址指向的位置,讀取該位置開始處的52個字 節(jié)到buffer中,進行下一步; St印3'開始結(jié)構(gòu)解析定位到buffer偏移0x2c處讀取驅(qū)動模塊的名稱,判讀是 否為tcpip. sys。若是,則進行下一步;否則進行St印5'; St印4'定位到buffer偏移0x18處讀取4個字節(jié),該值即是驅(qū)動模塊tcpip. sys 的基地址的虛擬地址。退出。 St印5' buffer的0x0處存放了 LIST_ENTRY結(jié)構(gòu),使用該結(jié)構(gòu)可以得到下一個驅(qū) 動模塊的虛擬地址和上一個驅(qū)動模塊的虛擬地址。定位到buffer偏移0x00處讀取4個字 節(jié),該處存放了下一個驅(qū)動模塊的_M0UDLE_ENTRY結(jié)構(gòu)的起始虛擬地址,判斷該地址是否 等于St印l'中所獲取的第一個模塊的_M0UDLE_ENTRY結(jié)構(gòu)的起始虛擬地址,若是,則說明 已經(jīng)遍歷了整個雙向鏈表,沒有找到tcpip. sys這個驅(qū)動模塊,退出;否則將其轉(zhuǎn)換為物理 地址,并轉(zhuǎn)St印2'。 以上內(nèi)容還會依據(jù)說明書附圖2所示的結(jié)構(gòu)頭的一般結(jié)構(gòu)和說明書附圖3所示 的結(jié)構(gòu)頭的連接關系,其中在該結(jié)構(gòu)頭的0x30處是LIST_ENTRY結(jié)構(gòu),JJS乙ENTRY的結(jié)構(gòu) 是 +0x000Flink :Ptr32_LIST_ENTRY
+0x004Blink :Ptr32_LIST_ENTRY 為了快捷的進行地址轉(zhuǎn)換,所述步驟2)中,若當前操作系統(tǒng)為Windows Vista SPl,則TcpEndpointPool的虛擬地址為步驟1)得到的基地址虛擬地址+0xd0d5c ;若當前 操作系統(tǒng)為Windows Vista SP2,則TcpEndpointPool的虛擬地址為步驟1)得到的基地 址虛擬地址+0xd3e9c。該方法的依據(jù)是使用Windbg進行分析可知在Windows Vista SP1版本中,TcpEndpointPool的地址相對于tcpip. sys的基地址的偏移是0xd0d5c,即 TcpEndpointPool的虛擬地址=tcpip. sys的基地址的虛擬地址+0xd0d5c。在Windows Vista SP2版本中,TcpEndpointPool的虛擬地址=tcpip. sys的基地址的虛擬地址 +0xd3e9c。 Windbg是Debugging tool for windows的簡寫,是微軟開發(fā)的一款免費調(diào) 試工具,可以從以下地址獲取http://www. microsoft, com/whdc/devtools/debugging/ installx86. mspx 該調(diào)試工具主要用來調(diào)試windows操作系統(tǒng)的驅(qū)動程序、應用程序、服務以及操 作系統(tǒng)本身。 經(jīng)分析,得到TcpEndPoint和TCB結(jié)構(gòu)中對解析網(wǎng)絡連接信息有用的各字段定義 如下 TcpEndPoint結(jié)構(gòu)體中與網(wǎng)絡連接相關的各字段及在結(jié)構(gòu)體中的偏移定義如下 typedef struct_TCP_ENDP0INT{PEPR0CESS 0wningProcess ; +0x14PETHREAD 0wningThread ; +0x18
LARGE_INTEGER CreationTime ; +0x20 CONST NL_LOCAL_ADDRESS*LocalAddress ; +0x34 USHORT LocalPort ; +0x3e }TCP_ENDP0INT, *PTCP_ENDP0INT ; 從以上結(jié)構(gòu)中可以看出,該結(jié)構(gòu)中偏移0x14處是指向創(chuàng)建網(wǎng)絡連接的進程 OwningProcess的指針;偏移0x18處是指向創(chuàng)建網(wǎng)絡連接的線程OwningThread的指針;偏 移0x20處是創(chuàng)建時間CreationTime ;偏移0x34處是包含本地地址LocalAddress的結(jié)構(gòu) NL_L0CAL_ADDRESS ;偏移0x3e處是本地端口 LocalPort等網(wǎng)絡連接信息。
Tcb結(jié)構(gòu)體中與網(wǎng)絡連接相關的各字段及在結(jié)構(gòu)體中的偏移定義如下 typedef struct_TCB{ CONST NL_PATH*Path ; +0x10 USHORT LocalPort ; +0x2c USHORT RemotePort ; +0x2e PEPROCESS OwningProcess ; +0x164 LARGE_INTEGER CreationTime ; +0xl6c 從以上中可以看出,該結(jié)構(gòu)偏移0x10處是包含本地地址和遠程地址的NL_PATH結(jié) 構(gòu)體的指針;偏移0x2c處是本地端口 LocalPort ;偏移0x2e處是遠程端口 RemotePort等 (還包含其他的什么信息)信息;偏移0x164處是指向創(chuàng)建網(wǎng)絡連接的進程OwningProcess 的EPROCESS結(jié)構(gòu)體的指針;偏移0x16c處是創(chuàng)建時間CreationTime。 因此,所述步驟5)的子步驟e)更具體的步驟包括讀取buffer的偏移0x164處 的4個字節(jié),得到EPROCESS結(jié)構(gòu)體的虛擬地址,把其轉(zhuǎn)化為物理地址,然后定位到內(nèi)存鏡像 文件的EPROCESS結(jié)構(gòu)體物理地址+0x9c處,讀取前4個字節(jié),得到當前節(jié)點對應的網(wǎng)絡連 接的Pid ;之后讀取buffer的偏移0x16c處的8個字節(jié)得到該網(wǎng)絡連接的創(chuàng)建時間,讀取 buffer的偏移0x2c處的2個字節(jié)并轉(zhuǎn)化為10進制數(shù)得到該網(wǎng)絡連接的本地端口的值,讀 取buffer的偏移0x2e處的2個字節(jié),轉(zhuǎn)化為10進制數(shù)即是遠程端口的值。據(jù)此可以準確 并快捷的獲的網(wǎng)絡連接信息。 所述步驟5)的子步驟e)還包括以下步驟1)定位到buffer的0x10處讀取4個字 節(jié)轉(zhuǎn)換成物理地址并記為nlPathPA,定位到內(nèi)存鏡像文件的物理地址nlPathPA+0x08處, 讀取4個字節(jié)得到遠程地址的值;11)讀取buffer的偏移0x34處的4個字節(jié)轉(zhuǎn)化成物理 地址并記為nlLocalPA,定位到內(nèi)存鏡像文件的物理地址nlLocalPA+OxOc處,讀取4個字節(jié) 記為nlIdentifierPA,定位到內(nèi)存鏡像文件的物理地址nlldentif ierPA處,讀取4個字節(jié) 并轉(zhuǎn)化為物理地址,定位到內(nèi)存鏡像文件的該地址處,讀取4個字節(jié)得到本地地址的值。
此外,涉及到的NL_PATH結(jié)構(gòu)體的指針,關系到TcpEndpoint結(jié)構(gòu)和TCB結(jié)構(gòu)的判
斷,其結(jié)構(gòu)體定義如下 typedef struct_NL_PATH{CONST NL_LOCAL_ADDRESS*SourceAddress ; +0x00
CONST UCHA腳estinationAddress ; +0x08
} NL_PATH, *PNL_PATH ;
typedef struct_NL_LOCAL_ADDRESS{
CONST NL_ADDRESS_IDENTIFIER*Identifier ; +OxOc }NL_LOCAL_ADDRESS , *PNL_LOCAL_ADDRESS ; typedef struct_NL_ADDRESS_IDENTIFIER{ CONST UCHAR*Address ; +0x00 }NL_ADDRESS_IDENTIFIER, *PNL_ADDRESS_IDENTIFIER ; 經(jīng)過對TCP_ENDPOINT結(jié)構(gòu)體和TCB結(jié)構(gòu)體的分析對比可知,在TCP_ENDPOINT結(jié) 構(gòu)體的偏移0x14處是指向EPROCESS結(jié)構(gòu)體的指針,0x18處是指向ETHREAD結(jié)構(gòu)體的指 針,而在TCB結(jié)構(gòu)體中,偏移0x14處不是指向EPROCESS結(jié)構(gòu)體的指針。因此,我們可以通 過判斷以TcpE為標志的結(jié)構(gòu)體中的偏移0x14處是否為指向結(jié)構(gòu)EPROCESS (對于vista操 作系統(tǒng)來說,EPROCESS結(jié)構(gòu)體的前4個字節(jié)是0x03002000)的指針來確定該結(jié)構(gòu)是TCP_ ENDPOINT結(jié)構(gòu)還是TCB結(jié)構(gòu)。這些內(nèi)容可有助于上述步驟5)的子步驟d)的實現(xiàn)。
1權(quán)利要求
一種Vista操作系統(tǒng)下網(wǎng)絡信息的獲取方法,包括以下步驟1)通過物理內(nèi)存分析獲得tcpip.sys模塊的基地址虛擬地址;2)根據(jù)步驟1)得到的基地址虛擬地址加上當前操作系統(tǒng)下該基地址與數(shù)據(jù)結(jié)構(gòu)TcpEndpointPool的地址差獲取TcpEndpointPool的虛擬地址;3)根據(jù)當前操作系統(tǒng)下地址轉(zhuǎn)換規(guī)則將步驟2)得到的虛擬地址轉(zhuǎn)換為物理地址,并定位到內(nèi)存鏡像中該物理地址指向的第一位置;4)在步驟3)所得指向的第一位置讀取前4個字節(jié)作為虛擬地址轉(zhuǎn)換為物理地址,并定位到內(nèi)存鏡像中該物理地址指向的第二位置,在該第二位置的偏移0x1c處讀取前4個字節(jié)獲得TcpEndpointPool這一雙鏈表中第一個TcpEndpoint結(jié)構(gòu)頭的虛擬地址;5)處理當前單鏈表頭為TcpEndpoint結(jié)構(gòu)頭的單鏈表a)把當前TcpEndpoint結(jié)構(gòu)頭的虛擬地址轉(zhuǎn)化為物理地址,定位到內(nèi)存鏡像中該物理地址處,讀取前4個字節(jié)得到該單鏈表下第一個節(jié)點的虛擬地址;b)判斷單鏈表當前節(jié)點的虛擬地址是否為0,若是,該單鏈表處理結(jié)束;若不是,轉(zhuǎn)步驟c);c)把單鏈表當前節(jié)點的虛擬地址轉(zhuǎn)化為物理地址,定位到內(nèi)存鏡像中該物理地址處,讀取前0x180個字節(jié)放入buffer中;d)讀取buffer的偏移0x14處4個字節(jié)的值,判斷該值是否為指向EPROCESS結(jié)構(gòu)體的指針,若是,則該結(jié)構(gòu)體為TcpEndpoint結(jié)構(gòu),轉(zhuǎn)步驟f),否則,該結(jié)構(gòu)體為TCB結(jié)構(gòu),轉(zhuǎn)下一步;e)解析TCB結(jié)構(gòu)依據(jù)當前操作系統(tǒng)的EPROCESS結(jié)構(gòu)體的特征,找出創(chuàng)建網(wǎng)絡連接的進程OwningProcess的連接信息,之后進行下一步;f)讀取buffer偏移0x0處的4個字節(jié)獲取當前單鏈表下一個節(jié)點的虛擬地址,轉(zhuǎn)步驟b);6)依據(jù)相鄰TcpEndpoint結(jié)構(gòu)頭所存放的_LIST_ENTRY結(jié)構(gòu)的鏈接關系,若下一個_LIST_ENTRY的虛擬地址等于第一個TcpEndpoint結(jié)構(gòu)頭的虛擬地址加0x30,結(jié)束;否則,將該下一個_LSIT_ENTRY的虛擬地址減0x30得到對應當前TcpEndpoint結(jié)構(gòu)頭的下一個結(jié)構(gòu)頭的虛擬地址,進入下一步;7)根據(jù)步驟6)的得到的下一個結(jié)構(gòu)頭的標志位判斷該結(jié)構(gòu)頭是否為TcpEndpoint結(jié)構(gòu)頭,若是,轉(zhuǎn)步驟5),若否,轉(zhuǎn)步驟6)。
2. 根據(jù)權(quán)利要求1所述的獲取方法,其特征在于所述步驟1)的物理內(nèi)存分析方法采 用基于KPCR結(jié)構(gòu)的Windows系統(tǒng)物理內(nèi)存分析方法。
3. 根據(jù)權(quán)利要求2所述的獲取方法,其特征在于所述步驟1)包括首先通過物理內(nèi) 存分析獲得內(nèi)核變量psLoadeModuleList,并讀取該內(nèi)核變量第一個模塊的虛擬地址,判斷 該模塊的名稱是否為tcpip. sys,若是,則取驅(qū)動模塊tcpip. sys的基地址;若不是,則進行 下一個模塊的判斷,循環(huán)進行判斷模塊名稱及其后的步驟直至找到驅(qū)動模塊tcpip. sys并 取其基地址。
4. 根據(jù)權(quán)利要求1所述的獲取方法,其特征在于所述步驟2)中,若當前操作系統(tǒng)為 Windows Vista SP1,則TcpEndpointPool的虛擬地址為步驟1)得到的基地址虛擬地址 +0xd0d5c ;若當前操作系統(tǒng)為Windows Vista SP2,則TcpEndpointPool的虛擬地址為步驟1)得到的基地址虛擬地址+0xd3e9c。
5. 根據(jù)權(quán)利要求1所述的獲取方法,其特征在于所述步驟5)的子步驟e)包括讀取 buffer的偏移0x164處的4個字節(jié),得到EPROCESS結(jié)構(gòu)體的虛擬地址,把其轉(zhuǎn)化為物理地 址,然后定位到內(nèi)存鏡像文件的EPROCESS結(jié)構(gòu)體物理地址+0x9c處,讀取前4個字節(jié),得到 當前節(jié)點對應的網(wǎng)絡連接的Pid ;之后讀取buffer的偏移0x16c處的8個字節(jié)得到該網(wǎng)絡 連接的創(chuàng)建時間,讀取buffer的偏移0x2c處的2個字節(jié)并轉(zhuǎn)化為10進制數(shù)得到該網(wǎng)絡連 接的本地端口的值,讀取buffer的偏移0x2e處的2個字節(jié),轉(zhuǎn)化為10進制數(shù)即是遠程端 口的值。
6. 根據(jù)權(quán)利要求5所述的獲取方法,其特征在于所述步驟5)的子步驟e)還包括以 下步驟1)定位到buffer的0x10處讀取4個字節(jié)轉(zhuǎn)換成物理地址并記為nlPathPA,定位 到內(nèi)存鏡像文件的物理地址nlPathPA+0x08處,讀取4個字節(jié)得到遠程地址的值;11)讀取 buffer的偏移0x34處的4個字節(jié)轉(zhuǎn)化成物理地址并記為nlLocalPA,定位到內(nèi)存鏡像文件 的物理地址nlLocalPA+OxOc處,讀取4個字節(jié)記為nlldentif ierPA,定位到內(nèi)存鏡像文件 的物理地址nlldentif ierPA處,讀取4個字節(jié)并轉(zhuǎn)化為物理地址,定位到內(nèi)存鏡像文件的 該地址處,讀取4個字節(jié)得到本地地址的值。
全文摘要
本發(fā)明公開了一種Vista操作系統(tǒng)下網(wǎng)絡信息的獲取方法,該獲取方法通過物理內(nèi)存分析獲得tcpip.sys模塊的基地址虛擬地址,并進而獲得該基地址下獲取雙鏈表TcpEndpointPool的虛擬地址,通過遍歷該雙鏈表獲得網(wǎng)絡的連接信息,具有可靠性高,速度快的優(yōu)點。
文檔編號G06F12/06GK101727323SQ200910231540
公開日2010年6月9日 申請日期2009年12月4日 優(yōu)先權(quán)日2009年12月4日
發(fā)明者徐麗娟, 王英龍, 王連海 申請人:山東省計算中心
網(wǎng)友詢問留言 已有0條留言
  • 還沒有人留言評論。精彩留言會獲得點贊!
1
乳源| 苏尼特左旗| 榕江县| 濮阳市| 阜新市| 拜城县| 海盐县| 绿春县| 泸州市| 嵩明县| 绿春县| 普定县| 庄河市| 革吉县| 崇礼县| 汉寿县| 喀什市| 镇巴县| 华池县| 子长县| 景谷| 遂溪县| 宁德市| 万盛区| 青州市| 林芝县| 保靖县| 朔州市| 永昌县| 中方县| 页游| 江西省| 定日县| 中方县| 长丰县| 伊金霍洛旗| 台州市| 凌源市| 石柱| 周宁县| 浠水县|