模塊信息,如圖7所示,給出了本發明的實施例中 模塊結構關系圖,modules變量指向某一個已加載模塊結構體module地址,所有已加載模 塊其module形成一個雙向鏈表,如圖7所示,據此可以獲取到所有已加載模塊。
[0099] 5-3) ·獲取網絡信息及系統信息;根據 rt_hash_mask、rt_hash_table、net_ namespace_l i st變量值獲取網絡配置及鏈接信息。
[0100] 根據boot_cpu_data變量可獲取目標計算機CPU信息;根據log_buf變量可以獲 取目標計算機系統日志和調試信息;根據iomemjesource變量可以獲取系統物理內存分 段信息;根據file_systems變量可以獲取系統文件系統信息。
[0101] 6) ·獲取模塊導出符號表;在module結構體中含有Elf_Sym*symtab、unsigned int num_symtab、char*strtab等變量(如圖13所不),num_symtab指向模塊導出符號個 數,symtab指向所有符號地址,strtab指向所有符號名字。根據這三個變量獲取模塊導出 符號,這些符號在進行內存分析時起著重要作用,如利用kvm模塊導出vm_list可以獲取當 前物理機中運行的虛擬機信息。
[0102] 虛擬地址轉化為物理地址的方法敘述如下:
[0103] swapper_pg_dir所對應的頁目錄的物理地址記為CR3,待轉化的虛擬地址的21至 29 位記為 Directory、30 至 31 位記為 Directory Pointer、30 至 38 位記為 Directory Ptr、 39至47位記為PML4、48至63位記為Sing Extended,小頁模式下0至11位記為Offset、 12至20位記為Table,大頁模式下0至20位記為Offset ;
[0104] 如圖8所示,給出了本發明中64位小頁模式下地址轉換示意圖,如果操作系統位 數是64位操作系統小頁模式,則通過以下方法進行地址轉換:取CR3寄存器的12位至51 位、低12位均取為0,將其與PML4乘以8后的數值相加,獲取此地址在物理內存鏡像對應的 內容記為Al ;取Al的12位至51位、低12位均取為0,將其與Directory Ptr乘以8之后 的數值相加,獲取此地址在物理內存鏡像對應的內容記為A2 ;取A2的12位至51位、低12 位均取為〇,將其與Directory乘以8之后的數值相加,獲取此地址在物理內存鏡像對應的 內容記為A3 ;取A3的12位至51位、低12位均取為0,將其與Table乘以8之后的數值相 加,獲取此地址在物理內存鏡像對應的內容記為A4 ;取A4的12位至51位、低12位均取為 〇,將其與Offset相加,得到的數據即為的虛擬地址轉化為物理地址之后的數值;
[0105] 如圖9所示,給出了本發明中64位大頁模式下地址轉換示意圖,如果操作系統位 數是64位操作系統大頁模式,則通過以下方法進行地址轉換:取CR3寄存器的12位至51 位、低12位均取為0,將其與PML4乘以8后的數值相加,獲取此地址在物理內存鏡像對應的 內容記為Bl ;取Bl的12位至51位、低12位均取為0,將其與Directory Ptr乘以8之后 的數值相加,獲取此地址在物理內存鏡像對應的內容記為B2 ;取B2的12位至51位、低12 位均取為〇,將其與Directory乘以8之后的數值相加,獲取此地址在物理內存鏡像對應的 內容記為B3 ;取B3的21位至51位、低21位均取為0,將其與Offset相加,得到的數據即 為的虛擬地址轉化為物理地址之后的數值;
[0106] 如圖10所示,給出了本發明中32位開啟PAE小頁模式地址轉換示意圖,如果操作 系統位數是32位操作系統開啟PAE小頁模式,則通過以下方法進行地址轉換:取CR3寄存 器的12位至44位、低5位均取為0,將其與Directory Pointer乘以8后的數值相加,獲取 此地址在物理內存鏡像對應的內容記為Cl ;取Cl的12位至51位、低12位均取為0,將其 與Directory乘以8之后的數值相加,獲取此地址在物理內存鏡像對應的內容記為C2 ;取 C2的12位至51位、低12位均取為0,將其與Table乘以8之后的數值相加,獲取此地址在 物理內存鏡像對應的內容記為C3 ;取C3的12位至35位、低12位均取為0,將其與Offset 相加,得到的數據即為的虛擬地址轉化為物理地址之后的數值;
[0107] 如圖11所示,給出了本發明中32位開啟PAE下大頁模式地址轉換示意圖,如果操 作系統位數是32位操作系統開啟PAE大頁模式,則通過以下方法進行地址轉換:取CR3寄 存器的12位至44位、低5位均取為0,將其與Directory Pointer乘以8后的數值相加,獲 取此地址在物理內存鏡像對應的內容記為Dl ;取Dl的12位至51位、低12位均取為0,將 其與Directory乘以8之后的數值相加,獲取此地址在物理內存鏡像對應的內容記為D2 ; 取D2的21位至35位、低21位均取為0,將其與Offset相加,得到的數據即為的虛擬地址 轉化為物理地址之后的數值;
[0108] 在32位操作系統不開啟PAE模式下:待轉化的虛擬地址小頁模式下的0至11位 記為Offset、12至21位記為Table、22至31位記為Directory ;大頁模式下:0至21位記 為 0ffset、22 至 31 位記為 Directory ;
[0109] 如圖12所示,給出了本發明中32位未開啟PAE下小頁模式地址轉換示意圖,如 果操作系統位數是32位操作系統不開啟PAE小頁模式,則通過以下方法進行地址轉換:取 CR3寄存器的0位至31位、低13位均取為0,將其與Directory乘以8后的數值相加,獲取 此地址在物理內存鏡像對應的內容記為El ;取El的12位至51位、低12位均取為0,將其 與Table乘以8之后的數值相加,獲取此地址在物理內存鏡像對應的內容記為E2 ;取E2的 12位至31位、低12位均取為0,將其與Offset相加,得到的數據即為的虛擬地址轉化為物 理地址之后的數值;
[0110] 如圖13所示,給出了圖13為本發明中32位未開啟PAE下大頁模式地址轉換示意 圖,如果操作系統位數是32位操作系統不開啟PAE大頁模式,則通過以下方法進行地址轉 換:取CR3寄存器的0位至31位、低13位均取為0,將其與Directory乘以8后的數值相 加,獲取此地址在物理內存鏡像對應的內容記為Fl ;取Fl的21位至30位、低22位均取為 〇,將其與Offset相加,得到的數據即為的虛擬地址轉化為物理地址之后的數值。
[0111] 本發明針對目前Linux系統物理內存分析技術存在的只能分析已知操作系統版 本的物理內存鏡像文件、需要附加內核符號表文件、使用起來操作步驟較為復雜等問題,給 出了一種新的針對Linux系統物理內存分析方法,與現有技術相比,本發明所提出的方法 有以下優點:
[0112] 1、本發明所提出的方法能夠自動判斷物理內存鏡像文件對應的操作系統版本,無 需預知目標計算機的操作系統版本;同時獲取頁目錄地址,實現虛擬地址到物理地址的轉 換。
[0113] 2、本發明提出了一種從物理內存鏡像文件中進行符號表提取的新方法,根據 kallsyms_addresses、kallsyms_num_syms、kallsyms_names、kallsyms_token_table 以及 kallsyms_token_index這幾個內核變量從物理內存中提取/proc/kallsyms中的符號表, 同一內核版本,這幾個變量值是相同的,根據分析出的版本從內核變量數據庫中獲取上述 內核變量的值。對于內核變量數據庫中不存在的值,對內核函數update」ter在內存中的 二進制碼進行反編譯獲取上述內核變量的值。
[0114] 3、本發明除了獲取內核符號表外,獲取各個模塊導出的符號表,根據這些符號表 中的某些變量或者函數將獲取目標計算機的重要信息。
[0115] 4、據此開發的系統操作簡單,無需指定物理內存鏡像文件對應的操作系統版本及 進行相關系統配置即可進行。
【主權項】
1. 一種Linux系統物理內存鏡像文件分析方法,其特征在于,通過以下步驟來實現: a) .操作系統版本判斷以及頁目錄地址的獲取,在對Linux系統初始化時,通過調用初 始化函數crash_save_vmcoreinfo_int函數,將vmcoreinfo_data的內容進行初始化;從獲 取的vmcoreinfo_data數據中提取操作系統版本信息以及內核符號_stext、swapper_pg_ dir的值; 如果操作系統版本信息中含有i686字符或者獲取到的swapper_pg_dir的值為八位16 進制表示的地址,則判斷出該Linux系統為32位操作系統;如果操作系統版本信息中含有 x86_64字符或者獲取到的swapper_pg_dir的值為十六位16進制表示的地址,則此系統為 64位操作系統; 獲取到的swapper_pg_dir的值為頁目錄虛擬地址,如果操作系統為32位,則 將其減去OxcOOOOOOO即為頁目錄的物理地址;如果操作系統為64位,則將其減去 0xffffffff8000000,即可獲取頁目錄的物理地址; b) .地址轉換,32位操作系統地址分為開啟PAE模式和未開啟PAE模式,這兩種模式下 又分為大頁模式和小頁模式,利用頁目錄的物理地址,便可實現虛擬地址向物理地址的地 址轉換;64位操作系統地址分為小頁模式和大頁模式,利用步驟a)中獲取的頁目錄的物理 地址,亦可實現虛擬地址向物理地址的轉換; c) .數據庫中已存系統內核符號表的恢復,判斷在物理內存鏡像文件的內核變量 數據庫中是否能查詢到操作系統版本信息,如果能查詢到操作系統的版本信息,則獲 取 kallsyms_addresses、 kallsyms_num_syms、 kallsyms_names、 kallsyms_markers、 kallsyms_token_table 以及 kallsyms_token_index 內核變量的值,再通過步驟 c_l)至 c-3)恢復系統的內核符號表;如果不能查詢到操作系統的版本信息,則執行步驟d); c-1).獲取內核符號的數目,將獲取的kallsyms_num_syms變量虛擬地址利用步驟b) 中的地址轉換方法,轉換為對應的物理地址,并獲取此物理地址對應的物理內存信息為/ proc/kalIsyms中系統內核符號的個數; c-2).獲取內核符號的類型和名稱,kallsyms_names對應經過排序的內核符號的類型 和名稱組成的字符串,首先將kallsyms_names變量虛擬地址按照步驟b)中的方法轉化為 物理地址,利用此物理地址在內存鏡像文件中獲取字符串,每個字符串的格式為字符串長 度和壓縮串;然后再利用內核變量kallsyms_token_table和kallsyms_token_index將字 符串解析出來,以獲取內核符號的類型、名稱; c-3).獲取內核符號的虛擬地址,kallsyms_addresses變量對應經過排序的所有內核 符號的虛擬地址,對于經步驟c-2)獲取的內核符號,按照其在kallsyms_names變量中的 次序,從kallsyms_addresses變量所對應的物理地址中獲取內核符號表的虛擬地址;通過 步驟c-2)和步驟c-3)即可獲取系統數據庫中所有內核符號表的類型、名稱和虛擬地址信 息; d) .數據庫中未存