版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領
文檔簡介
1、【原創(chuàng)】跨進程內存讀取, 附源碼標 題:【原創(chuàng)】跨進程內存讀取, 附源碼作 者:stnoe時 間: 2009-06-26,21:24:18 鏈 接: http:/ 在科銳學習的第4 階段 , 保護模式課后作業(yè), 跨進程內存讀寫的小工具. 第一次內核編程 , 代碼寫的比較亂 , 不免也有些錯誤. 各位牛哥們 , 見笑樂 ,! 時間倉促 , 也沒對代碼進程封裝,和界面相關太多 . 1. 切換目標進程的cr3 通常 , 跨進程讀寫內存 , 用到 readprocessmemory, writeprocessmemory, 但需要進程句柄, 如果目標進程受到保護 , 可能獲得進程句柄會失敗. read
2、processmemory最后會調用到kestackattachprocess附加到目標進程上切換進程環(huán)境進行拷貝的, 所以想到拿到目標進程的虛擬內存內容, 可以將目標進程的頁目錄基地址放入cr3中即可 . 首先要獲得目標進程的cr3 寄存器 , 即頁目錄基地址 ( 開啟 pae, 頁目錄指針表 ), 每個進程在內核里都有一個eprocess 結構. 代碼 : nt!_eprocess +0 x000 pcb : _kprocess +0 x06c processlock : _ex_push_lock +0 x070 createtime : _large_integer +0 x078 e
3、xittime : _large_integer +0 x080 rundownprotect : _ex_rundown_ref . pcb 中就有我們想要得到的cr3 代碼 : nt!_kprocess +0 x000 header : _dispatcher_header +0 x010 profilelisthead : _list_entry +0 x018 directorytablebase : 2 uint4b +0 x020 ldtdescriptor : _kgdtentry +0 x028 int21descriptor : _kidtentry 那只需要獲得目標進程ep
4、rocess 就可以得到 cr3了遍歷 eprocess 里的 activeprocesslinks 的鏈表獲取指定進程的eprocess 代碼 : / 獲得當前進程 eprocess信息 ulong ueprocess = 0; _asm mov eax, fs:0 x124 / _ethread mov eax, eax+0 x44 / _kprocess mov ueprocess, eax kdprint(eprocess: 0 x%08xn, ueprocess); list_entry listhead; initializelisthead(&listhead); ulo
5、ng ufirsteprocess = ueprocess; ulong ucount = 0; plist_entry pactiveprocesslinks; processinfolist *pprocsslist = null; ulong unameoffset = getplantformdependentinfo(file_name_offset); ulong upidoffset = getplantformdependentinfo(process_id_offset); ulong ulinkoffset = getplantformdependentinfo(proce
6、ss_link_offset); ulong uexittime = getplantformdependentinfo(exit_time_offset); / 遍歷鏈表獲得進程信息 do pprocsslist= (processinfolist *)exallocatepool(pagedpool, sizeof(processinfolist); if (pprocsslist = null) status = status_insufficient_resources; break; plarge_integer exittime; exittime = (plarge_intege
7、r)(ueprocess + uexittime); if (exittime-quadpart = 0) if (*(int *)(ueprocess + upidoffset) procinfo.uprocessid = 0; pprocsslist-procinfo.ueprocess = ueprocess; pprocsslist-procinfo.ucr3 = *(pulong)(ueprocess + 0 x18); rtlcopymemory(pprocsslist-procinfo.pszimagefilename, idle, 16); insertheadlist(&am
8、p;listhead, &pprocsslist-listentry); kdprint(pid: %d, eprocess: 0 x%08x, filename: %s, cr3: 0 x%08xn, pprocsslist-procinfo.uprocessid, pprocsslist-procinfo.ueprocess, pprocsslist-procinfo.pszimagefilename, pprocsslist-procinfo.ucr3); else pprocsslist-procinfo.ueprocess = ueprocess; pprocsslist-p
9、rocinfo.ucr3 = *(pulong)(ueprocess + 0 x18); pprocsslist-procinfo.uprocessid = *(pulong)(ueprocess + upidoffset); rtlcopymemory(pprocsslist-procinfo.pszimagefilename, (pvoid)(ueprocess + unameoffset), 16); insertheadlist(&listhead, &pprocsslist-listentry); kdprint(pid: %d, eprocess: 0 x%08x,
10、 filename: %s, cr3: 0 x%08xn, pprocsslist-procinfo.uprocessid, pprocsslist-procinfo.ueprocess, pprocsslist-procinfo.pszimagefilename, pprocsslist-procinfo.ucr3); ucount+; pactiveprocesslinks = (plist_entry)(ueprocess + ulinkoffset); ueprocess = (ulong)pactiveprocesslinks-blink - ulinkoffset; if (uep
11、rocess = ufirsteprocess) break; while (ueprocess != 0); 引用了北極星2003 大哥的 getplantformdependentinfo 獲取 eprocess 的成員偏移下面是讀寫內存的: 代碼 : _try writememoryinfo *pinfo = (writememoryinfo *)exallocatepool(pagedpool, sizeof(writememoryinfo); rtlcopymemory(pinfo, piobuffer, sizeof(writememoryinfo); pvoid pwrite =
12、 exallocatepool(pagedpool, pinfo-nwritesize); rtlcopymemory(pwrite, pinfo-pdata, pinfo-nwritesize); /pinfo-pdata = (pbyte)exallocatepool(pagedpool, pinfo-nwritesize); ulong uoldcr3 = 0; ulong ucurrentcr3 = *(pulong)(pinfo-neprocess + 0 x18); if (pinfo-nmemoryaddr = 0) status = status_unsuccessful; b
13、reak; _asm mov eax, cr3 mov uoldcr3, eax mov eax, ucurrentcr3 mov cr3, eax _asm cli push eax mov eax, cr0 and eax, not 10000h mov cr0, eax rtlcopymemory(pvoid)pinfo-nmemoryaddr, pwrite, pinfo-nwritesize); _asm mov eax, cr0 or eax, 10000h mov cr0,eax pop eax sti _asm mov eax, uoldcr3 mov cr3, eax uou
14、tsize = pinfo-nwritesize; if (pinfo != null) exfreepool(pinfo); pinfo = null; / return success status = status_success; _except(1) status = status_unsuccessful; 代碼 : _try readmemoryinfo *pinfo = (readmemoryinfo *)exallocatepool(pagedpool, sizeof(readmemoryinfo); rtlcopymemory(pinfo, piobuffer, sizeo
15、f(readmemoryinfo); ulong uoldcr3 = 0; ulong ucurrentcr3 = *(pulong)(pinfo-neprocess + 0 x18); if (pinfo-nmemoryaddr = 0) status = status_unsuccessful; break; _asm mov eax, cr3 mov uoldcr3, eax mov eax, ucurrentcr3 mov cr3, eax rtlcopymemory(piobuffer, (pvoid)pinfo-nmemoryaddr ,pinfo-nreadsize); uout
16、size = pinfo-nreadsize; _asm mov eax, uoldcr3 mov cr3, eax if (pinfo != null) exfreepool(pinfo); pinfo = null; / return success status = status_success; _except(1) status = status_unsuccessful; 2. 根據分頁機制 , 進行手工轉換 , 得到虛擬地址的映射的物理地址, 讀其物理地址得到目標進程虛擬地址的內容 . 詳見附件分析 . 獲得了 cr3, 接下來 , 就是根據分頁機制, 把虛擬地址轉換為物理地址勒
17、. 在轉換之前要判斷是否開啟pae,非 pae和開啟 pae的轉換有所不同控制寄存器 cr4的第 5 位標記是否開啟pae 代碼 : / 獲得 cr4的值_asm _emit 0 x0f _emit 0 x20 _emit 0 xe0 mov ucr4, eax 未開啟 pae情況通過 cr3寄存器定位到頁目錄的基地址線性地址的高10 位作為獲取頁目錄表項的索引, 獲得一個頁目錄的一個表項注: windows的保護實現基本不使用分段機制, 主要是通過分頁機制來實現保護, 這里的就線性地址等于虛擬地址 . 代碼 : / 獲得頁目錄表項 (pde) dwpagedirindex = (dwvirt
18、ualaddr & 0 xffc00000) 22; dword dwpagedirentry = readpagedirentrynopae(dwpagedirindex); if (dwpagedirentry = 0) return; 根據 pde獲得頁表基地址或者頁基地址當沒有開啟 pae時, 有兩種 pde格式 , 分別指向 4kb的頁表 , 和 4mb的內存頁頁目錄項的第7 位判斷頁大小代碼 : / 獲得頁大小dword creadmemorydlg:getpagesizenopae(dword dwaddr) if (dwaddr & 0 x00000080) =
19、 0 x00000080) return mbsize; else return kbsize; 4kb時, 頁目錄項的高20 位為頁表基地址 . 線性地址的12 位到 21 位作為選取頁表的一個表項.(pte) 代碼 : dwpagetableindex = (dwvirtualaddr & 0 x0003ff000) 12; dword dwpagetablebaseaddr = dwpagedirentry & 0 xfffff000; / 獲得頁表dword dwpagetable = readpagetablenopae(dwpagetablebaseaddr, dw
20、pagetableindex); if (dwpagetable = 0) return; if (ispresentnopae(dwpagetable) = false) return; 取 pte的高 20 位, 作為內存頁的基地址, 線性地址的低12 作為頁中偏移得到物理地址代碼 : / 頁的基地址dword dwpagebaseaddr = dwpagetable & 0 xfffff000; dwpageoffset = dwvirtualaddr & 0 x00000fff; 這時獲得的物理地址就是想要的目標進程虛擬地址的映射的物理地址代碼 : pvoid prea
21、dbuf = new bytedwreadsize; bool bret = readpagememorynopae(preadbuf, dwpageoffset, dwreadsize, dwpagebaseaddr); if (bret = false) return; 4mb時, 頁目錄項的高10 位作為頁的基地址, 線性地址的低22 位在物理地址在頁中的偏移代碼 : / 線性地址的低 22 位是頁內偏移dword dwpageoffsetmb = dwvirtualaddr & 0 x003fffff; / 高 10 位, 是頁基地址dword dwpagebaseaddr =
22、 dwpagedirentry & 0 xffc00000; 這時獲得的物理地址就是想要的目標進程虛擬地址的映射的物理地址代碼 : pvoid preadbuf = new bytedwreadsize; bool bret = readpagememorypae(preadbuf, dwpageoffsetmb, dwreadsize, dwpagebaseaddr); if (bret = false) return; 開啟 pae情況cr4中的物理地址擴展(pae)標志可以開啟pae機制 , 將物理地址從32 位擴展到 36 位. 當開始 pae機制后 , 處理器支持兩種尺寸的頁
23、:4kb 和 2mb的頁 . 增加了頁目錄指針表項. 表項的大小從32 位增加到了64 位表項中的物理基地址擴展到了24 位寄存器 cr3中的高位頁目錄基地址被換為27 位的頁目錄指針表基地址通過 cr3寄存器定位到頁目錄指針表起始地址,取線性地址的高2 位作為選取頁目錄指針表項的索引代碼 : dword dwdirpointertableindex = (dwvirtualaddr & 0 xc0000000) 30; dword dwdirpointertablebaseaddr = m_ndirbase & 0 xffffffe0; / 獲得頁目錄指針表_int64 np
24、agedirpointertable = readpagedirpae(dwdirpointertableindex, dwdirpointertablebaseaddr); if (npagedir = 0) return; 取線性地址的第21 位到 29 位作為頁目錄索引,頁目錄指針表項的第12 位到第 35 位為頁目錄基地址代碼 : / 頁目錄基地址dword dwdirbaseaddr = (dword)(npagedirpointertable &0 x0000000ffffff000); / 頁目錄項索引dword dwpagedirindex = (dwvirtualad
25、dr & 0 x3fe00000) 21; _int64 npagedirentry = readpagedirentrypae(dwpagedirindex, dwdirbaseaddr); if (npagedirentry = 0) return; 根據頁目錄項的第7 位判斷頁大小 ,2mb, 還是 4kb 代碼 : / 獲得頁大小dword creadmemorydlg:getpagesizepae(_int64 naddr) if (naddr & 0 x0000000000000080) = 0 x0000000000000080) return mbsize; else return kbsize; 4kb時,頁目錄項的第12位到 35位作為頁表基地址的高24 位. 取線性地址第12 位到 20 位作為在頁表中的偏移代碼 : / 獲得頁表dword dwpagetablebaseaddr = (dword)(npagedirentry & 0 x0000000ffffff000); dword dwpagetableindex = (dwvirtualaddr & 0 x001ff000) 12; _int64 n
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
- 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
- 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年度礦業(yè)權抵押擔保項目合同樣本3篇
- 2024經七路施工項目廉潔保障合同版B版
- 二零二五年度廠房裝修安全風險評估合同3篇
- 2025年度高校文印服務外包合同3篇
- 二零二五年度園林景觀裝修合同范本2篇
- 2024版影視融資中介協(xié)議模板版B版
- 簡易勞務派遣合同范本
- 二零二五年度icp許可證辦理與互聯(lián)網企業(yè)合規(guī)性審查與法律支持合同3篇
- 二零二五版二手車按揭轉讓合同范本3篇
- 二零二五版建筑材料租賃與合同變更合同3篇
- 人教版(2025新版)七年級下冊英語:寒假課內預習重點知識默寫練習
- 【公開課】同一直線上二力的合成+課件+2024-2025學年+人教版(2024)初中物理八年級下冊+
- 高職組全國職業(yè)院校技能大賽(嬰幼兒照護賽項)備賽試題庫(含答案)
- 2024年公安部直屬事業(yè)單位招聘筆試參考題庫附帶答案詳解
- NB-T 47013.15-2021 承壓設備無損檢測 第15部分:相控陣超聲檢測
- SJG 05-2020 基坑支護技術標準-高清現行
- 汽車維修價格表
- 司爐崗位應急處置卡(燃氣)參考
- 10KV供配電工程施工組織設計
- 終端攔截攻略
- 藥物外滲處理及預防【病房護士安全警示教育培訓課件】--ppt課件
評論
0/150
提交評論