一種從64位Windows操作系統(tǒng)的內(nèi)存鏡像文件中獲取已登錄用戶密碼明文的方法
【專利摘要】本發(fā)明的從64位Windows操作系統(tǒng)的內(nèi)存鏡像文件中獲取已登錄用戶密碼明文的方法,包括:a).獲取系統(tǒng)版本信息;b).獲取lsass.exe進(jìn)程的CR3寄存器、進(jìn)程環(huán)境塊中PEB結(jié)構(gòu)變量的值;c).將動(dòng)態(tài)鏈接庫lsasrv.dll和tspkg.dll的執(zhí)行樣本轉(zhuǎn)儲(chǔ)出來;d).獲取密鑰相關(guān)數(shù)據(jù);e).從lsasrv.dll中獲取用戶信息;f).從tspkg.dll的轉(zhuǎn)儲(chǔ)文件中獲取登錄用戶主憑證;g).獲取密碼明文。本發(fā)明的獲取已登錄用戶密碼明文的方法準(zhǔn)確、高效,分析效果不受密碼復(fù)雜度的影響,是從物理內(nèi)存鏡像文件中獲取用戶登錄信息的重要手段,獲取的已登錄用戶密碼明文是計(jì)算機(jī)在線取證中的一種重要證據(jù)。
【專利說明】
—種從64位W i n d ows操作系統(tǒng)的內(nèi)存鏡像文件中獲取已登錄用戶密碼明文的方法
技術(shù)領(lǐng)域
[0001]本發(fā)明涉及一種獲取已登錄用戶密碼明文的方法,更具體的說,尤其涉及一種從64位Windows操作系統(tǒng)的內(nèi)存鏡像文件中獲取已登陸用戶的密碼明文的方法。本方法將應(yīng)用于計(jì)算機(jī)取證領(lǐng)域,主要用于信息安全事件和各類計(jì)算機(jī)犯罪案件的調(diào)查取證。
【背景技術(shù)】
[0002]計(jì)算機(jī)物理內(nèi)存中存在某些能描述系統(tǒng)遭受攻擊時(shí)所處狀態(tài)的信息,如當(dāng)前運(yùn)行的進(jìn)程信息、進(jìn)程加載的動(dòng)態(tài)鏈接庫信息、系統(tǒng)當(dāng)前登錄的用戶名稱及用戶密碼、打開的文件信息、網(wǎng)絡(luò)連接信息等。這些信息隨著計(jì)算機(jī)系統(tǒng)的關(guān)機(jī)而消失,無法作為證據(jù)進(jìn)行保存。因此,對(duì)獲取計(jì)算機(jī)物理內(nèi)存在計(jì)算機(jī)取證方面尤為重要。為推進(jìn)物理內(nèi)存分析技術(shù)的發(fā)展,DFRWS(Digital Forensic Research Workshop)于2005年推出了名為 “ForensicsChallenge”的活動(dòng),活動(dòng)的主題就是物理內(nèi)存分析。從此,對(duì)于物理內(nèi)存的分析和獲取成為計(jì)算機(jī)取證研究熱點(diǎn),然而,當(dāng)用戶登錄到計(jì)算機(jī)系統(tǒng)中時(shí),其密碼是以密文的方式存儲(chǔ)的,我們能夠通過內(nèi)存分析獲取其對(duì)應(yīng)的NThash值或者LM哈希值,對(duì)于密碼明文的獲取,需要借助于SamInside等相關(guān)解密軟件才能完成,但是對(duì)于復(fù)雜度較高的密碼,解密軟件所需時(shí)間也會(huì)相應(yīng)較長。隨著計(jì)算機(jī)硬件水平的不斷發(fā)展提高,目前大多數(shù)計(jì)算機(jī)都具備4G以上內(nèi)存空間,并支持64位操作系統(tǒng),而且隨著目前64位WindowslO系統(tǒng)的免費(fèi)升級(jí),使用高版本W(wǎng)indows操作系統(tǒng)的用戶越來越多,因此對(duì)64位windows操作系統(tǒng)的內(nèi)存鏡像文件分析工作迫在眉睫。
【發(fā)明內(nèi)容】
[0003]本發(fā)明為了克服上述技術(shù)問題的缺點(diǎn),提供了一種從64位Windows操作系統(tǒng)的內(nèi)存鏡像文件中獲取已登錄用戶密碼明文的方法。
[0004]本發(fā)明的從64位Windows操作系統(tǒng)的內(nèi)存鏡像文件中獲取已登錄用戶密碼明文的方法,其特征在于,通過以下步驟來實(shí)現(xiàn):
a).獲取系統(tǒng)版本信息,采用基于KPCR結(jié)構(gòu)的物理內(nèi)存分析方法,從當(dāng)前內(nèi)存鏡像文件中獲取包括主版本號(hào)、次版本號(hào)、內(nèi)部版本號(hào)在內(nèi)的操作系統(tǒng)版本信息;b).獲取lsass.exe進(jìn)程的C R 3寄存器內(nèi)容,進(jìn)程環(huán)境塊中P E B結(jié)構(gòu)變量的值;c ).轉(zhuǎn)儲(chǔ)執(zhí)行樣本,獲取lsass.exe加載的動(dòng)態(tài)鏈接庫鏈表,將動(dòng)態(tài)鏈接庫lsasrv.dll和tspkg.dll在內(nèi)存鏡像文件中的執(zhí)行樣本轉(zhuǎn)儲(chǔ)出來;d).獲取密鑰相關(guān)數(shù)據(jù),從lsasrv.dll的轉(zhuǎn)儲(chǔ)文件中獲取包括Initialzat1nVector值、hAesKey值、h3DesKey值在內(nèi)的密鑰相關(guān)數(shù)據(jù);e).獲取登錄數(shù)量和信息,從lsasrv.dll中獲取登錄會(huì)話列表的數(shù)量和登錄會(huì)話列表中用戶信息;f).獲取主憑證,從tspkg.dll的轉(zhuǎn)儲(chǔ)文件中,獲取當(dāng)前登錄用戶主憑證;g).獲取密碼明文,加載動(dòng)態(tài)鏈接庫nCryt.dll,借助步驟d)中獲取的密鑰相關(guān)數(shù)據(jù),對(duì)步驟f)中所獲取的主憑證中密文進(jìn)行解密,獲取登錄用戶密碼明文。
[0005]本發(fā)明的從64位Windows操作系統(tǒng)的內(nèi)存鏡像文件中獲取已登錄用戶密碼明文的方法,步驟c)所述的轉(zhuǎn)儲(chǔ)執(zhí)行樣本通過以下方法來實(shí)現(xiàn):
C-1).獲取變量Ldr,從I sasS.exe進(jìn)程PEB結(jié)構(gòu)體中獲取變量Ldr,Ldr變量指向了進(jìn)程加載的所有動(dòng)態(tài)鏈接庫結(jié)構(gòu)的鏈表結(jié)構(gòu);c-2).遍歷變量Ldr所指向的鏈表結(jié)構(gòu),判斷每個(gè)動(dòng)態(tài)鏈接庫的名稱與需要尋找的lsasrv.dll或tspkg.dll是否相同,如果存在相同,則獲得相應(yīng)動(dòng)態(tài)鏈接庫的起始虛擬地址、長度變量,并根據(jù)這兩個(gè)變量把動(dòng)態(tài)鏈接庫在內(nèi)存鏡像文件中的執(zhí)行樣本轉(zhuǎn)儲(chǔ)出來。
[0006]本發(fā)明的從64位Windows操作系統(tǒng)的內(nèi)存鏡像文件中獲取已登錄用戶密碼明文的方法,步驟e)所述的獲取登錄數(shù)量和信息通過以下方法來實(shí)現(xiàn):首先對(duì)動(dòng)態(tài)鏈接庫進(jìn)行反匯編,在動(dòng)態(tài)鏈接庫中找到函數(shù)LsapCreateLsaLogonSess 1n,查看該函數(shù)的反匯編代碼,獲取變量LogonSess1nListConut和LogonSess1nList的值;然后通過變量LogonSess1nLi stConut獲取登錄會(huì)話列表的數(shù)量,從變量LogonSess1nLi st所指向的雙向鏈表結(jié)構(gòu)體中獲取登錄會(huì)話列表中用戶信息。
[0007]本發(fā)明的從64位Windows操作系統(tǒng)的內(nèi)存鏡像文件中獲取已登錄用戶密碼明文的方法,其特征在于,步驟f)所述的獲取主憑證通過以下步驟來實(shí)現(xiàn):
f-Ι).從與內(nèi)存鏡像文件相同操作系統(tǒng)版本的計(jì)算機(jī)文件夾X:\Windows\System中找出動(dòng)態(tài)鏈接庫tspkg.dll,X表示系統(tǒng)盤,并對(duì)動(dòng)態(tài)鏈接庫tspkg.dll進(jìn)行反匯編,以找到函數(shù)TSUnloadCredTable;f_2).在TSUnloadCredTable函數(shù)體中找到變量TSGlobalCredTable的存放位置;f-3).查看變量TSGlobalCredTable存放位置所存儲(chǔ)的二進(jìn)制數(shù)據(jù),以此二進(jìn)制數(shù)據(jù)為特征碼,到Isasry.dll轉(zhuǎn)儲(chǔ)文件中搜索此特征碼;f-4).特征碼在Isasry.dll文件中被搜索到后,其存儲(chǔ)位置即為變量TSGlobalCredTable在tspkg.dl I內(nèi)存轉(zhuǎn)儲(chǔ)文件中的相對(duì)偏移地址,設(shè)該偏移地址為TSGlobalTabOffset; f-5).通過如下公式計(jì)算變量TSGlobalCredTab Ie 的虛擬地址 TSGlobalTabVa:
TSGlobalTabVa=tspkgVa+sizeof(ULONG)+TSGlobalOffset (I)
其中,tspkgVa是動(dòng)態(tài)鏈接庫tspkg.dl I在lsass.exe中加載的動(dòng)態(tài)鏈接庫虛擬地址,sizeof(ULONG)為求取數(shù)據(jù)類型ULONG的字節(jié)數(shù);
然后使用lsassCR3Val對(duì)TSGlobalTabVa進(jìn)行虛擬地址到物理地址轉(zhuǎn)換,得到變量TSGlobalCredTable 在內(nèi)存鏡像文件中的位置,TSGlobalCredTable 指向了RTL_AVL_TABLE結(jié)構(gòu);lsassCR3Val為步驟b)中獲取的lsass.exe進(jìn)程的CR3寄存器的內(nèi)容;f_6).RTL_AVL_TABLE結(jié)構(gòu)是一個(gè)平衡二叉樹,定位到TSGlobalCredTable的物理地址,從RTL_AVL_TABLE結(jié)構(gòu)樹根的孩子開始遍歷該樹;f-7).在遍歷RTL_AVL_TABLE結(jié)構(gòu)樹的過程中,讀取樹中變量OrderedPoointer的值,該值是KIWI_TS_CREDENTIAL結(jié)構(gòu)的虛擬地址,將該虛擬地址轉(zhuǎn)換為物理地址,并在內(nèi)存鏡像文件中定位到此物理地址找到KIWI_TS_CREDENTIAL結(jié)構(gòu);f_8).找到結(jié)構(gòu)KIWI_TS_CREDENTIAL中變量LocallyUniqueIdentif ier的值,該變量存放的是用戶的LUID,若已登錄用戶的LUID與當(dāng)前KIWI_TS_CREDENTIAL結(jié)構(gòu)中用戶LUID相同,則執(zhí)行步驟f-9),否則回到步驟f-6)繼續(xù)遍歷二叉樹的左孩子和右孩子;f-9).找到結(jié)構(gòu)KIWI_TS_CREDENTIAL中變量pTsPrimary ,pTsPrimary指向KIWI_TS_PRMARY_CREDENTIAL,該結(jié)構(gòu)體存放的是用戶的主憑證,讀取變量pTsPrimary的值,該值是KIWI_TS_PR頂ARY_CREDENTIAL結(jié)構(gòu)的虛擬地址,將該虛擬地址轉(zhuǎn)換為物理地址,在內(nèi)存鏡像文件中定位到物理地址找到此結(jié)構(gòu);f-1o).找到結(jié)構(gòu) KIWI_TS_PRMARY_CREDENTIAL 中變量 credentials ,credentials中存放的是當(dāng)前用戶的用戶名、域名和密文;其中,用戶名、域名和密文都是以UNICODE方式存放在物理內(nèi)存鏡像文件中的,根據(jù)UNICODE結(jié)構(gòu)體的定義,獲取出密文當(dāng)前長度Len、最大長度MaxLen及在物理內(nèi)存中的虛擬地址,并將虛擬地址轉(zhuǎn)換為物理地址,到內(nèi)存鏡像文件中定位到該物理地址;f-11).根據(jù)步驟f-ΙΟ)中獲取的物理地址在內(nèi)存鏡像文件中讀取長度為Len的數(shù)據(jù)到存儲(chǔ)空間cry P tBuf f er中,對(duì)密文解密后即獲取已登錄用戶密碼的明文。
[0008]本發(fā)明的有益效果是:(I)本發(fā)明所公開的64位windows操作系統(tǒng)的內(nèi)存鏡像文件中已登錄用戶密碼明文的獲取方法分析方法準(zhǔn)確、高效;(2)本發(fā)明所公開的64位windows操作系統(tǒng)的內(nèi)存鏡像文件中已登錄用戶密碼明文的獲取方法對(duì)密碼明文的分析效果不受密碼復(fù)雜度的影響。(3)本發(fā)明所公開的64位windows操作系統(tǒng)的內(nèi)存鏡像文件中已登錄用戶密碼明文的獲取方法是從物理內(nèi)存鏡像文件中獲取用戶登錄信息的重要手段。(4)本發(fā)明所公開的64位windows操作系統(tǒng)的內(nèi)存鏡像文件中已登錄用戶密碼明文的獲取方法分析方法獲取的已登錄用戶密碼明文是計(jì)算機(jī)在線取證中的一種重要證據(jù)。
【附圖說明】
[0009]圖1為本發(fā)明的內(nèi)存鏡像文件中獲取已登錄用戶密碼明文方法的流程圖;
圖2給出了本發(fā)明中獲取密鑰內(nèi)容的結(jié)構(gòu)關(guān)系圖;
圖3為本發(fā)明中從tspkg.dll中獲取主憑證流程圖。
[0010]圖4為本發(fā)明中從tspkg.dll獲取主憑證結(jié)構(gòu)關(guān)系圖;
圖5為本發(fā)明反匯編出的LsalnitializeProtectedMemory函數(shù)的部分截圖。
【具體實(shí)施方式】
[0011]下面結(jié)合附圖與實(shí)施例對(duì)本發(fā)明作進(jìn)一步說明。
[0012]如圖1所示,給出了本發(fā)明的從64位windows操作系統(tǒng)的內(nèi)存鏡像文件中獲取已登錄用戶密碼明文獲取方法的流程圖,其按照“獲取操作系統(tǒng)版本一一獲取lsass.exe進(jìn)程結(jié)構(gòu)體一一獲取密鑰一一獲取憑證一一解密密文”的流程來進(jìn)行。由于進(jìn)程通過其加載的動(dòng)態(tài)鏈接庫執(zhí)行所需功能,因此,可通過分析執(zhí)行登錄認(rèn)證功能的進(jìn)程加載的動(dòng)態(tài)鏈接庫進(jìn)行解密工作。如圖1所示,本發(fā)明的從64位windows操作系統(tǒng)的內(nèi)存鏡像文件中獲取已登錄用戶密碼明文的獲取方法,首先要獲取操作系統(tǒng)版本,在不同操作系統(tǒng)版本的內(nèi)存鏡像文件中,其密文及解密密文所需的數(shù)據(jù)在相關(guān)動(dòng)態(tài)鏈接庫中存放位置各不相同,因此需要先判斷出操作系統(tǒng)版本。然后從內(nèi)存鏡像文件中轉(zhuǎn)儲(chǔ)當(dāng)前運(yùn)行的lsass.exe進(jìn)程加載的lsasrv.dll和tspkg.dll鏈接庫的樣本文件。最后根據(jù)從樣本文件中分析出的信息,通過加載動(dòng)態(tài)鏈接庫的方式解密主憑證中存在的密文,從而獲取登錄用戶的密碼明文。其具體通過以步驟來實(shí)現(xiàn):
a).獲取系統(tǒng)版本信息,采用基于KPCR結(jié)構(gòu)的物理內(nèi)存分析方法,從當(dāng)前內(nèi)存鏡像文件中獲取包括主版本號(hào)、次版本號(hào)、內(nèi)部版本號(hào)在內(nèi)的操作系統(tǒng)版本信息;
b).獲取lsass.exe進(jìn)程的CR3寄存器內(nèi)容,進(jìn)程環(huán)境塊中PEB結(jié)構(gòu)變量的值;
c).轉(zhuǎn)儲(chǔ)執(zhí)行樣本,獲取lsass.exe加載的動(dòng)態(tài)鏈接庫鏈表,將動(dòng)態(tài)鏈接庫I sasrv.dl I和tspkg.dll在內(nèi)存鏡像文件中的執(zhí)行樣本轉(zhuǎn)儲(chǔ)出來; d)?獲取密鑰相關(guān)數(shù)據(jù),從I sasrv.dll的轉(zhuǎn)儲(chǔ)文件中獲取包括Ini tialzat 1nVector值、hAesKey值、h3DesKey值在內(nèi)的密鑰相關(guān)數(shù)據(jù);
e).獲取登錄數(shù)量和信息,從lsasrv.dll中獲取登錄會(huì)話列表的數(shù)量和登錄會(huì)話列表中用戶信息;
f).獲取主憑證,從tspkg.dll的轉(zhuǎn)儲(chǔ)文件中,獲取當(dāng)前登錄用戶主憑證;
g).獲取密碼明文,加載動(dòng)態(tài)鏈接庫nCryt.dll,借助步驟d)中獲取的密鑰相關(guān)數(shù)據(jù),對(duì)步驟f)中所獲取的主憑證中密文進(jìn)行解密,獲取登錄用戶密碼明文。
[0013]步驟a)中所述的獲取系統(tǒng)版本信息的具體步驟為:a_l).根據(jù)操作系統(tǒng)kpcr結(jié)構(gòu)體特征,對(duì)內(nèi)存鏡像文件進(jìn)行搜索,找到kpcr結(jié)構(gòu)體在內(nèi)存鏡像文件中的位置;a-2).獲取系統(tǒng)進(jìn)程CR3寄存器內(nèi)容。CR3寄存器的內(nèi)容是在系統(tǒng)空間內(nèi)進(jìn)行系統(tǒng)轉(zhuǎn)換的基礎(chǔ)。對(duì)于64位操作系統(tǒng)來說,CR3寄存器的內(nèi)容在kpcr結(jié)構(gòu)體的偏移OxlDO處,從此處讀取8個(gè)字節(jié)的數(shù)據(jù),即是CR3寄存器的內(nèi)容。a-3).獲取當(dāng)前線程的虛擬地址。對(duì)于不同版本操作系統(tǒng)來講,當(dāng)前線程的虛擬地址存放在kpcr結(jié)構(gòu)體的偏移值各不相同,對(duì)于64位Windows 8以上版本的操作系統(tǒng)來說,該偏移值是0x188,從此處讀取8個(gè)字節(jié)的數(shù)據(jù),即是當(dāng)前線程的虛擬地址。a-4).根據(jù)當(dāng)前線程的結(jié)構(gòu)體,獲取當(dāng)前進(jìn)程結(jié)構(gòu)體的虛擬地址和物理地址。以64位windows 8.1為例,當(dāng)前線程的虛擬地址+0xb8,即是當(dāng)前進(jìn)程的虛擬地址。使用步驟a_2)所獲得的系統(tǒng)進(jìn)程CR3寄存器的值進(jìn)行地址轉(zhuǎn)換,將虛擬地址轉(zhuǎn)換為物理地址,定位到該物理地址處,便是當(dāng)前進(jìn)程的EPR0CESS結(jié)構(gòu)體的起始位置。a-5).在進(jìn)程EPR0CESS結(jié)構(gòu)體中,存放了名為Peb的變量,該變量指向_PEB結(jié)構(gòu)體,該結(jié)構(gòu)體中存放了操作系統(tǒng)主版本號(hào)、次版本號(hào)和內(nèi)部版本號(hào)。以64位windows 8.1為例,在當(dāng)前進(jìn)程EPR0CESS結(jié)構(gòu)體的起始位置的偏移0x3e8處是變量peb的值,即結(jié)構(gòu)體_PEB的虛擬地址,將該虛擬地址轉(zhuǎn)換為物理地址,得到_PEB結(jié)構(gòu)體的起始位置,定位到該位置,在偏移0x118處存放的是操作系統(tǒng)主版本號(hào),0x11 c處存放了小版本號(hào),0x120處存放了內(nèi)部版本號(hào)。
[0014]步驟b)中所述獲取lsass.exe進(jìn)程的CR3寄存器內(nèi)容,進(jìn)程環(huán)境塊peb變量的具體步驟是:b-Ι).根據(jù)當(dāng)前進(jìn)程EPR0CESS結(jié)構(gòu)體,遍歷進(jìn)程鏈。在步驟a-4)中,獲得了當(dāng)前進(jìn)程的EPR0CESS結(jié)構(gòu)體的起始位置,EPR0CESS結(jié)構(gòu)體中,存放了指向下一進(jìn)程的EPR0CESS結(jié)構(gòu)體的指針。b-2).沿著該指針開始遍歷進(jìn)程鏈,當(dāng)進(jìn)程名稱為lsass.exe時(shí),獲取該進(jìn)程的peb變量值及CR3寄存器內(nèi)容(定義為lsassCR3Val) DWeMiwindows 8.1為例,在EPR0CESS結(jié)構(gòu)體偏移0x28處,讀取8個(gè)字節(jié)的數(shù)據(jù)即是lsassCR3Val的值。
[00?5] 步驟c)中所述獲取lsass.exe加載的動(dòng)態(tài)鏈接庫鏈表,轉(zhuǎn)儲(chǔ)lsasrv.dll和tspkg.dll在內(nèi)存鏡像文件中的執(zhí)行樣本的具體步驟是:c-Ι).在I sas s.exe進(jìn)程_PEB結(jié)構(gòu)體中,存放了變量Ldr,該變量指向了進(jìn)程加載的所有動(dòng)態(tài)鏈接庫結(jié)構(gòu)的鏈表結(jié)構(gòu)。c-2).每個(gè)動(dòng)態(tài)鏈接庫結(jié)構(gòu)中都保存了指向下一個(gè)動(dòng)態(tài)鏈接庫結(jié)構(gòu)的指針、動(dòng)態(tài)鏈接庫名稱、起始地址(虛擬地址)、長度等變量。遍歷該鏈表結(jié)構(gòu),判斷每個(gè)動(dòng)態(tài)鏈接庫的名稱是否與需要尋找的lsasrv.dl I和tspkg.dl I相同,如果滿足條件,則獲得相應(yīng)動(dòng)態(tài)鏈接庫的起始地址(虛擬地址)、長度,并根據(jù)這兩個(gè)變量把動(dòng)態(tài)鏈接庫在內(nèi)存鏡像文件中的執(zhí)行樣本轉(zhuǎn)儲(chǔ)出來。
[0016]步驟d)中所述從I sasrv.dll的轉(zhuǎn)儲(chǔ)文件中,獲取密鑰相關(guān)數(shù)據(jù)的具體步驟是:d-1).從與內(nèi)存鏡像文件的相同操作系統(tǒng)版本的計(jì)算機(jī)的C:\Windows\System32文件夾下,復(fù)制I sasrv.dl I動(dòng)態(tài)鏈接庫,使用IDA對(duì)動(dòng)態(tài)鏈接庫進(jìn)行反匯編,在動(dòng)態(tài)鏈接庫中找到函數(shù)LsalnitializeProtectedMemory,查看該函數(shù)的反匯編代碼;d_2).在該函數(shù)反匯編代碼中,找到變量Ini tialzat 1nVector的位置,如圖5所示,給出了本發(fā)明反匯編出的LsalnitializeProtectedMemory函數(shù)的部分截圖。(1-3).查看與該位置相關(guān)的二進(jìn)制數(shù)據(jù),以此數(shù)據(jù)為特征碼,到lsasrv.dll轉(zhuǎn)儲(chǔ)文件搜索此特征碼,找到變量Initialzat1nVector在I s a s r V.d I I轉(zhuǎn)儲(chǔ)文件中的相對(duì)偏移地址,設(shè)為I n i t V e c O f f s e t ;變量Ini tialzat 1nVector的虛擬地址InitVecVa可通過以下公式得到:
InitVecVa = IsasrvVa+sizeof(ULONG)+ InitVecOffset0 (2)
其中,IsasrvVa是I sasrv.dll在lsass.exe中加載的動(dòng)態(tài)鏈接庫虛擬地址,sizeof(ULONG)為求取數(shù)據(jù)類型ULONG的字節(jié)數(shù)。由于此變量在lsass.exe的進(jìn)程空間內(nèi),因此使用I sassCR3Val對(duì)InitVecVa進(jìn)行虛擬地址到物理地址轉(zhuǎn)換,得到變量Ini tialzat 1nVector在內(nèi)存鏡像文件的位置,從而獲得Initialzat1nVector的內(nèi)容。d-4).獲取變量hAesKey的值,然后創(chuàng)建Aes加密的密鑰內(nèi)容。d-5).獲取變量h3DeSKey的值,然后創(chuàng)建3Des密鑰內(nèi)容;步驟d-4)所述的創(chuàng)建Aes密鑰內(nèi)容的具體步驟為:d-4-l).獲取變量hAesKey的值,具體方法與步驟d-Ι)—d-3)中獲得變量Ini tialzat 1nVector的內(nèi)容步驟類似,如圖5所示。d-4-2).變量AesKey的值指向KIWI_BCRYPT_HANDLE_KEY結(jié)構(gòu)。
[00?7]如圖2所示,給出了本發(fā)明的64位windows內(nèi)存鏡像文件中已登錄用戶密碼明文獲取方法的獲取密鑰內(nèi)容的結(jié)構(gòu)關(guān)系圖。以64位Windows8.1為例,定位到AesKey指向的物理地址,獲得_KIWI_BCRYPT_HANDLE_KEY結(jié)構(gòu)的內(nèi)容。從中找到變量key,變量Key是指向的KI WI_BCRYPT_KEY81 結(jié)構(gòu)的指針,從KI WI_BCRYPT_HANDLE_KEY 結(jié)構(gòu)的偏移Ox 1處,讀取8個(gè)字節(jié)的數(shù)據(jù),該值就是變量key的虛擬地址,將該虛擬地址轉(zhuǎn)換為物理地址,在物理內(nèi)存鏡像文件中定位到該地址,即找到KIWI_BCRYPT_HANDLE_KEY結(jié)構(gòu)的內(nèi)容,KIWI_BCRYPT_HANDLE_KEY結(jié)構(gòu)中的HardKey變量存放的就是生成Aes密鑰所需的值,使用LoadLibrary加載與內(nèi)存鏡像文件操作系統(tǒng)版本相同的系統(tǒng)里的b c r y P t.d I I,調(diào)用其中BCryptGenerateSymmetricKey函數(shù),以HardKey為參數(shù)創(chuàng)建Aes密鑰。
[0018]步驟d-5)所述的創(chuàng)建3Des密鑰內(nèi)容的具體步驟與步驟d_4)類似。
[0019]步驟e)所述的從lsasrv.dll中獲取登錄會(huì)話列表的數(shù)量和登錄會(huì)話列表中用戶信息的方法為:對(duì)lsasrv.dll進(jìn)行反匯編,該動(dòng)態(tài)鏈接庫是來自與內(nèi)存鏡像文件的相同操作系統(tǒng)版本的計(jì)算機(jī)X:\Windows\System32(其中,X為系統(tǒng)盤)文件夾。找到函數(shù)LsapCreateLsaLogonSess1n ,查看該函數(shù)的反匯編代碼,獲取變量LogonSess1nLi stConut以及LogonSess1nLi st的位置及附近特征值,根據(jù)特征值對(duì)lsasvr.dll在內(nèi)存鏡像文件中的轉(zhuǎn)儲(chǔ)文件進(jìn)行搜索,獲取變量LogonSess1nLi stConut以及LogonSess1nLi st在內(nèi)存鏡像文件中的值。變量LogonSess1nLi stCount存儲(chǔ)了登錄會(huì)話列表的數(shù)量,變量LogonSess1nLi st指向一個(gè)雙向鏈表結(jié)構(gòu)體,該結(jié)構(gòu)體中存放了登錄會(huì)話列表中用戶信息。
[0020]如圖3所示,給出了本發(fā)明的64位windows操作系統(tǒng)的內(nèi)存鏡像文件中已登錄用戶密碼明文獲取方法中步驟f)中所述從tspkg.dll的轉(zhuǎn)儲(chǔ)文件中,獲取當(dāng)用戶主憑證的流程圖,具體步驟是:
f-Ι).從與內(nèi)存鏡像文件相同操作系統(tǒng)版本的計(jì)算機(jī)文件夾X:\Windows\System中找出動(dòng)態(tài)鏈接庫tspkg.dll,X表示系統(tǒng)盤,并對(duì)動(dòng)態(tài)鏈接庫tspkg.dll進(jìn)行反匯編,以找到函數(shù)TSUnloadCredTable;
f-2).在TSUnloadCredTable函數(shù)體中找到變量TSGlobalCredTable的存放位置;f_3).查看變量TSGlobalCredTable存放位置所存儲(chǔ)的二進(jìn)制數(shù)據(jù),以此二進(jìn)制數(shù)據(jù)為特征碼,到lsasry.dl I轉(zhuǎn)儲(chǔ)文件中搜索此特征碼;
f - 4 ).特征碼在I s a s r y.d I I文件中被搜索到后,其存儲(chǔ)位置即為變量TSGlobalCredTable在tspkg.dll內(nèi)存轉(zhuǎn)儲(chǔ)文件中的相對(duì)偏移地址,設(shè)該偏移地址為TSGlobalTabOffset;
f-5).通過如下公式計(jì)算變量TSGlobalCredTable的虛擬地址TSGlobalTabVa: TSGlobalTabVa=tspkgVa+sizeof(ULONG)+TSGlobalOffset (I)
其中,tspkgVa是動(dòng)態(tài)鏈接庫tspkg.dl I在lsass.exe中加載的動(dòng)態(tài)鏈接庫虛擬地址,sizeof(ULONG)為求取數(shù)據(jù)類型ULONG的字節(jié)數(shù);
然后使用lsassCR3Val對(duì)TSGlobalTabVa進(jìn)行虛擬地址到物理地址轉(zhuǎn)換,得到變量TSGlobalCredTable 在內(nèi)存鏡像文件中的位置,TSGlobalCredTable 指向了RTL_AVL_TABLE結(jié)構(gòu);lsassCR3Val為步驟b)中獲取的lsass.exe進(jìn)程的CR3寄存器的內(nèi)容;
f-6).RTL_AVL_TABLE結(jié)構(gòu)是一個(gè)平衡二叉樹,定位到TSGlobalCredTable的物理地址,從RTL_AVL_TABLE結(jié)構(gòu)樹根的孩子開始遍歷該樹;
f-7).在遍歷RTL_AVL_TABLE結(jié)構(gòu)樹的過程中,讀取樹中變量OrderedPoointer的值,該值是KIWI_TS_CREDENTIAL結(jié)構(gòu)的虛擬地址,將該虛擬地址轉(zhuǎn)換為物理地址,并在內(nèi)存鏡像文件中定位到此物理地址找到KIWI_TS_CREDENTIAL結(jié)構(gòu);
f-8).找到結(jié)構(gòu) KIWI_TS_CREDENTIAL 中變量 LocallyUniqueIdentif ier 的值,該變量存放的是用戶的LUID,若已登錄用戶的LUID與當(dāng)前KIWI_TS_CREDENTIAL結(jié)構(gòu)中用戶LUID相同,則執(zhí)行步驟f-9),否則回到步驟f-6)繼續(xù)遍歷二叉樹的左孩子和右孩子;
f-9).找到結(jié)構(gòu)KIWI_TS_CREDENTIAL中變量pTsPrimary,pTsPrimary所指向的結(jié)構(gòu)體存放的是用戶的主憑證,pTsPrimary指向KIWI_TS_PRIMARY_CREDENTIAL,讀取變量pTsPrimary的值,該值是KIWI_TS_PR頂ARY_CREDENTIAL結(jié)構(gòu)的虛擬地址,將該虛擬地址轉(zhuǎn)換為物理地址,在內(nèi)存鏡像文件中定位到物理地址找到此結(jié)構(gòu);
f-ΙΟ).找到結(jié)構(gòu) KIWI_TS_PRIMARY_CREDENTIAL 中變量 credentials ,credentials 中存放的是當(dāng)前用戶的用戶名、域名和密文;其中,用戶名、域名和密文都是以UNICODE方式存放在物理內(nèi)存鏡像文件中的,根據(jù)UNICODE結(jié)構(gòu)體的定義,獲取出密文當(dāng)前長度Len、最大長度MaxLen及在物理內(nèi)存中的虛擬地址,并將虛擬地址轉(zhuǎn)換為物理地址,到內(nèi)存鏡像文件中定位到該物理地址;
f-11).根據(jù)步驟f-10)中獲取的物理地址在內(nèi)存鏡像文件中讀取長度為Len的數(shù)據(jù)到存儲(chǔ)空間cry ptBuffer中,對(duì)密文解密后即獲取已登錄用戶密碼的明文。
【主權(quán)項(xiàng)】
1.一種從64位Windows操作系統(tǒng)的內(nèi)存鏡像文件中獲取已登錄用戶密碼明文的方法,其特征在于,通過以下步驟來實(shí)現(xiàn): a).獲取系統(tǒng)版本信息,采用基于KPCR結(jié)構(gòu)的物理內(nèi)存分析方法,從當(dāng)前內(nèi)存鏡像文件中獲取包括主版本號(hào)、次版本號(hào)、內(nèi)部版本號(hào)在內(nèi)的操作系統(tǒng)版本信息; b).獲取lsass.exe進(jìn)程的CR3寄存器內(nèi)容,進(jìn)程環(huán)境塊中PEB結(jié)構(gòu)變量的值; c).轉(zhuǎn)儲(chǔ)執(zhí)行樣本,獲取lsass.exe加載的動(dòng)態(tài)鏈接庫鏈表,將動(dòng)態(tài)鏈接庫lsasrv.dll和tspkg.dll在內(nèi)存鏡像文件中的執(zhí)行樣本轉(zhuǎn)儲(chǔ)出來; d).獲取密鑰相關(guān)數(shù)據(jù),從lsasrv.dll的轉(zhuǎn)儲(chǔ)文件中獲取包括Initialzat1nVector值、hAesKey值、h3DesKey值在內(nèi)的密鑰相關(guān)數(shù)據(jù); e).獲取登錄數(shù)量和信息,從lsasrv.dll中獲取登錄會(huì)話列表的數(shù)量和登錄會(huì)話列表中用戶信息; f).獲取主憑證,從tspkg.dll的轉(zhuǎn)儲(chǔ)文件中,獲取當(dāng)前登錄用戶主憑證; g).獲取密碼明文,加載動(dòng)態(tài)鏈接庫nCryt.dll,借助步驟d)中獲取的密鑰相關(guān)數(shù)據(jù),對(duì)步驟f)中所獲取的主憑證中密文進(jìn)行解密,獲取登錄用戶密碼明文。2.根據(jù)權(quán)利要求1所述的從64位Windows操作系統(tǒng)的內(nèi)存鏡像文件中獲取已登錄用戶密碼明文的方法,其特征在于,步驟c)所述的轉(zhuǎn)儲(chǔ)執(zhí)行樣本通過以下方法來實(shí)現(xiàn): c-1).獲取變量Ldr,從lsass.exe進(jìn)程PEB結(jié)構(gòu)體中獲取變量Ldr,Ldr變量指向了進(jìn)程加載的所有動(dòng)態(tài)鏈接庫結(jié)構(gòu)的鏈表結(jié)構(gòu); c-2).遍歷變量Ldr所指向的鏈表結(jié)構(gòu),判斷每個(gè)動(dòng)態(tài)鏈接庫的名稱與需要尋找的lsasrv.dlI或tspkg.dlI是否相同,如果存在相同,則獲得相應(yīng)動(dòng)態(tài)鏈接庫的起始虛擬地址、長度變量,并根據(jù)這兩個(gè)變量把動(dòng)態(tài)鏈接庫在內(nèi)存鏡像文件中的執(zhí)行樣本轉(zhuǎn)儲(chǔ)出來。3.根據(jù)權(quán)利要求1或2所述的從64位Windows操作系統(tǒng)的內(nèi)存鏡像文件中獲取已登錄用戶密碼明文的方法,其特征在于,步驟e)所述的獲取登錄數(shù)量和信息通過以下方法來實(shí)現(xiàn):首先對(duì)動(dòng)態(tài)鏈接庫進(jìn)行反匯編,在動(dòng)態(tài)鏈接庫中找到函數(shù)LsapCreateLsaLogonSess 1n,查看該函數(shù)的反匯編代碼,獲取變量LogonSess1nLi stConut和LogonSess1nLi st的值;然后通過變量LogonSess1nLi stConut獲取登錄會(huì)話列表的數(shù)量,從變量LogonSess1nLi st所指向的雙向鏈表結(jié)構(gòu)體中獲取登錄會(huì)話列表中用戶信息。4.根據(jù)權(quán)利要求1或2所述的從64位Windows操作系統(tǒng)的內(nèi)存鏡像文件中獲取已登錄用戶密碼明文的方法,其特征在于,步驟f)所述的獲取主憑證通過以下步驟來實(shí)現(xiàn): f_l).從與內(nèi)存鏡像文件相同操作系統(tǒng)版本的計(jì)算機(jī)文件夾X:\Windows\System中找出動(dòng)態(tài)鏈接庫tspkg.dll,X表示系統(tǒng)盤,并對(duì)動(dòng)態(tài)鏈接庫tspkg.dll進(jìn)行反匯編,以找到函數(shù)TSUnloadCredTable; f-2).在TSUnloadCredTable函數(shù)體中找到變量TSGlobalCredTable的存放位置;f_3).查看變量TSGlobalCredTable存放位置所存儲(chǔ)的二進(jìn)制數(shù)據(jù),以此二進(jìn)制數(shù)據(jù)為特征碼,到lsasry.dl I轉(zhuǎn)儲(chǔ)文件中搜索此特征碼; f - 4 ).特征碼在I s a s r y.d I I文件中被搜索到后,其存儲(chǔ)位置即為變量TSGlobalCredTable在tspkg.dll內(nèi)存轉(zhuǎn)儲(chǔ)文件中的相對(duì)偏移地址,設(shè)該偏移地址為TSGlobalTabOffset; f-5).通過如下公式計(jì)算變量TSGlobalCredTable的虛擬地址TSGlobalTabVa: TSGlobalTabVa=tspkgVa+sizeof(ULONG)+TSGlobalOffset (I) 其中,tspkgVa是動(dòng)態(tài)鏈接庫tspkg.dll在lsass.exe中加載的動(dòng)態(tài)鏈接庫虛擬地址,sizeof(ULONG)為求取數(shù)據(jù)類型ULONG的字節(jié)數(shù); 然后使用lsassCR3Val對(duì)TSGlobalTabVa進(jìn)行虛擬地址到物理地址轉(zhuǎn)換,得到變量TSGlobalCredTable 在內(nèi)存鏡像文件中的位置,TSGlobalCredTable 指向了RTL_AVL_TABLE結(jié)構(gòu);lsassCR3Va為步驟b)中獲取的lsass.exe進(jìn)程的CR3寄存器的內(nèi)容; f-6).RTL_AVL_TABLE結(jié)構(gòu)是一個(gè)平衡二叉樹,定位到TSGlobalCredTable的物理地址,從RTL_AVL_TABLE結(jié)構(gòu)樹根的孩子開始遍歷該樹; f-7).在遍歷RTL_AVL_TABLE結(jié)構(gòu)樹的過程中,讀取樹中變量OrderedPoointer的值,該值是KIWI_TS_CREDENTIAL結(jié)構(gòu)的虛擬地址,將該虛擬地址轉(zhuǎn)換為物理地址,并在內(nèi)存鏡像文件中定位到此物理地址找到KIWI_TS_CREDENTIAL結(jié)構(gòu); f-8).找到結(jié)構(gòu)KIWI_TS_CREDENTIAL中變量LocalIyUniqueIdentif ier的值,該變量存放的是用戶的LUID,若已登錄用戶的LUID與當(dāng)前KIWI_TS_CREDENTIAL結(jié)構(gòu)中用戶LUID相同,則執(zhí)行步驟f_9),否則回到步驟f_6)繼續(xù)遍歷二叉樹的左孩子和右孩子; f-9).找到結(jié)構(gòu)KIWI_TS_CREDENTIAL中變量pTsPrimary,pTsPrimary指向KIWI_TS_PR頂ARY_CREDENTIAL,該結(jié)構(gòu)體存放的是用戶的主憑證,讀取變量pTsPrimary的值,該值是KIWI_TS_PRMARY_CREDENTIAL結(jié)構(gòu)的虛擬地址,將該虛擬地址轉(zhuǎn)換為物理地址,在內(nèi)存鏡像文件中定位到物理地址找到此結(jié)構(gòu); f-10).找到結(jié)構(gòu)KIWI_TS_PR頂ARY_CREDENTIAL中變量credentials ,credentials中存放的是當(dāng)前用戶的用戶名、域名和密文;其中,用戶名、域名和密文都是以UNICODE方式存放在物理內(nèi)存鏡像文件中的,根據(jù)UNICODE結(jié)構(gòu)體的定義,獲取出密文當(dāng)前長度Len、最大長度MaxLen及在物理內(nèi)存中的虛擬地址,并將虛擬地址轉(zhuǎn)換為物理地址,到內(nèi)存鏡像文件中定位到該物理地址; f-11).根據(jù)步驟f-10)中獲取的物理地址在內(nèi)存鏡像文件中讀取長度為Len的數(shù)據(jù)到存儲(chǔ)空間cry ptBuffer中,對(duì)密文解密后即獲取已登錄用戶密碼的明文。
【文檔編號(hào)】G06F21/31GK105893107SQ201610276405
【公開日】2016年8月24日
【申請(qǐng)日】2016年4月29日
【發(fā)明人】徐麗娟, 王連海, 葛亮, 趙大偉, 周洋, 徐淑獎(jiǎng)
【申請(qǐng)人】山東省計(jì)算中心(國家超級(jí)計(jì)算濟(jì)南中心)