(23)逆向分析 MmIsAddressValid 函数(XP系统 10-10-12分页)
一、找到 MmIsAddressValid 函數(shù)
方法一:在windbg中輸入 u MmIsAddressValid
方法二:在c:\windows\system32\ 中找到內(nèi)核程序,用IDA分析。
ntkrnlpa.exe 2-9-9-12 分頁內(nèi)核
ntoskrnl.exe 10-10-12 分頁內(nèi)核
打開 ntoskrnl.exe 后,導入pdb文件,即可查看函數(shù)名稱。
如果你沒有pdb文件,請先安裝對應系統(tǒng)版本的符號文件。
二、分析代碼
先作一些說明,關(guān)于PAT位,我不清楚其作用,因此不做分析。
正式分析前,先聊聊函數(shù)頭的 MOV EDI,EDI 指令。這條指令看起來什么也沒做,但是很多系統(tǒng)函數(shù)開頭都有這條指令,why?其實這是為了實現(xiàn)對函數(shù)行為的動態(tài)修改(熱補丁),可以一下這篇文章 函數(shù)開始處的MOV EDI, EDI的作用
下面直接貼上我分析后的函數(shù)。
.text:0040C65C ; --------------------------------------------------------------------------- .text:0040C65C nop .text:0040C65D nop .text:0040C65E nop .text:0040C65F nop .text:0040C660 nop .text:0040C661 ; Exported entry 685. MmIsAddressValid .text:0040C661 .text:0040C661 ; =============== S U B R O U T I N E ======================================= .text:0040C661 .text:0040C661 ; Attributes: bp-based frame .text:0040C661 .text:0040C661 ; BOOLEAN __stdcall MmIsAddressValid(PVOID VirtualAddress) .text:0040C661 public MmIsAddressValid .text:0040C661 MmIsAddressValid proc near ; CODE XREF: sub_40D65E+Cp .text:0040C661 ; sub_415459:loc_415470p ... .text:0040C661 .text:0040C661 VirtualAddress = dword ptr 8 .text:0040C661 .text:0040C661 ; FUNCTION CHUNK AT .text:0041B856 SIZE 00000007 BYTES .text:0040C661 ; FUNCTION CHUNK AT .text:0044A562 SIZE 00000019 BYTES .text:0040C661 .text:0040C661 mov edi, edi .text:0040C663 push ebp .text:0040C664 mov ebp, esp .text:0040C666 mov ecx, [ebp+VirtualAddress] ; ecx=VirtualAddress .text:0040C669 mov eax, ecx ; eax = VirtualAddress .text:0040C66B shr eax, 14h ; 右移20位 .text:0040C66E mov edx, 0FFCh ; 除PDI外其他位清零 .text:0040C673 and eax, edx ; eax = PDI * 4 .text:0040C675 sub eax, 3FD00000h ; eax += 0xC0300000 此時eax指向PDE .text:0040C67A mov eax, [eax] ; eax = PDE .text:0040C67C test al, 1 ; if (P==0) JZ 意思是 P=0 則跳轉(zhuǎn)到非法處理 .text:0040C67E jz loc_41B856 .text:0040C684 test al, al ; if (al < 0) JS 意思是 PS=1(大頁)就返回1 .text:0040C686 js short loc_40C6AC ; 返回1,表示線性地址有效 .text:0040C688 shr ecx, 0Ah ; ecx(VirtualAddress) >> 10 .text:0040C68B and ecx, 3FFFFCh ; 除PDI,PTI外的位清零 .text:0040C691 sub ecx, 40000000h ; ecx = 0xC0000000 + PDI * 4KB + PTI * 4 ecx指向PTE .text:0040C697 mov eax, ecx .text:0040C699 mov ecx, [eax] ; ecx = PTE .text:0040C69B test cl, 1 ; if (P==0) 非法 .text:0040C69E jz loc_41B856 .text:0040C6A4 test cl, cl ; if (PAT == 1) JS 如果 PAT==1 另作判斷,我就不分析了 .text:0040C6A6 js loc_44A562 .text:0040C6AC .text:0040C6AC loc_40C6AC: ; CODE XREF: MmIsAddressValid+25j .text:0040C6AC ; MmIsAddressValid+3DF0Fj .text:0040C6AC mov al, 1 ; 返回1,表示線性地址有效 .text:0040C6AE .text:0040C6AE loc_40C6AE: ; CODE XREF: MmIsAddressValid+F1F7j .text:0040C6AE pop ebp .text:0040C6AF retn 4 .text:0040C6AF MmIsAddressValid endpMmIsAddressValid 函數(shù)和我們之前練習時做的事情是一樣的,主要就是判斷PDE和PTE是否 P=1。MmIsAddressValid 是系統(tǒng)函數(shù),它的效率是很高的,位運算看起來有點費腦,目的也是減少指令數(shù)。
總結(jié)
以上是生活随笔為你收集整理的(23)逆向分析 MmIsAddressValid 函数(XP系统 10-10-12分页)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: (22)通过代码修改PTE实现挂物理页
- 下一篇: (24)2-9-9-12分页(上)