-
-
如何计算出物理地址?
-
发表于:
2011-4-13 11:32
3806
-
首先说一下我的目的,我看书上说是在内核中看到的地址都是线性地址,所以我想找到一个字符串在物理内存中的地址:
首先找到线性地址:
CHAR *Name = "Hello";
DbgPrint("K 的虚拟地址=%X",&Name);
其次找到页目录基址:
ULONG cr3Address;
__asm
{
cli
push ebx
mov ebx,cr3
mov cr3Address,ebx
pop ebx
sti
}
DbgPrint("目录表页面的物理基地址高20位= %X",cr3Address>>12);
最后找到物理地址:
PHYSICAL_ADDRESS phyAddr;
ULONG phy;
phyAddr = MmGetPhysicalAddress(&Name);
phy = phyAddr.QuadPart;
DbgPrint("K的物理低地址是=%X",phy);
程序运行后:打印出:K 的虚拟地址=0xF88FAC44 ,页目录 = 0x34D
F88FAC44 = 0011111000 100011111010 110001000100
根据分页:
CR3(高20位)+(虚拟地址[高10位]+虚拟地址[位21~位12])*4 + 虚拟地址[低12位偏移]
最后我得到和MmGetPhysicalAddress得到地址是不一样的,求解~
[招生]科锐逆向工程师培训(2024年11月15日实地,远程教学同时开班, 第51期)