日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > windows >内容正文

windows

(23)逆向分析 MmIsAddressValid 函数(XP系统 10-10-12分页)

發布時間:2025/3/21 windows 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 (23)逆向分析 MmIsAddressValid 函数(XP系统 10-10-12分页) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

一、找到 MmIsAddressValid 函數

方法一:在windbg中輸入 u MmIsAddressValid

方法二:在c:\windows\system32\ 中找到內核程序,用IDA分析。
ntkrnlpa.exe 2-9-9-12 分頁內核
ntoskrnl.exe 10-10-12 分頁內核

打開 ntoskrnl.exe 后,導入pdb文件,即可查看函數名稱。
如果你沒有pdb文件,請先安裝對應系統版本的符號文件。




二、分析代碼

先作一些說明,關于PAT位,我不清楚其作用,因此不做分析。
正式分析前,先聊聊函數頭的 MOV EDI,EDI 指令。這條指令看起來什么也沒做,但是很多系統函數開頭都有這條指令,why?其實這是為了實現對函數行為的動態修改(熱補丁),可以一下這篇文章 函數開始處的MOV EDI, EDI的作用

下面直接貼上我分析后的函數。

.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 則跳轉到非法處理 .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 endp

MmIsAddressValid 函數和我們之前練習時做的事情是一樣的,主要就是判斷PDE和PTE是否 P=1。MmIsAddressValid 是系統函數,它的效率是很高的,位運算看起來有點費腦,目的也是減少指令數。

總結

以上是生活随笔為你收集整理的(23)逆向分析 MmIsAddressValid 函数(XP系统 10-10-12分页)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。