首页
社区
课程
招聘
如何计算出物理地址?
发表于: 2011-4-13 11:32 3806

如何计算出物理地址?

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期)

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 93
活跃值: (365)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
2
物理地址扩展
2011-4-13 11:48
0
雪    币: 387
活跃值: (76)
能力值: ( LV4,RANK:50 )
在线值:
发帖
回帖
粉丝
3
*(PULONG)(*(PULONG)((ULONG)cr3+linear addr 高十位*4)+linear addr 中间10位*4)+低12位
2011-4-13 12:31
0
游客
登录 | 注册 方可回帖
返回
//