c语言访问windows内存,问一下大家,Windows上本人用C语言分配一段内存空间,输出的这些地址都是虚拟地址吗?那本人要找到真实地址怎...

问一下大家,Windows上本人用C语言分配一段内存空间,输出的这些地址都是虚拟地址吗?那本人要找到真实地址怎么找呢?

#include 

#include 

int main(int argc,char *argv[])

{

int *p=(int*)calloc(100,sizeof(int));

printf("%X",(p+10));

return 0;

}

解决方案

20

已知一个虚拟地址0x01AF5518, 则转换的过程如下:

注意: *这里讨论的以Windows下普通模式分页的情况, 也就是2级页表的情况*

1.首先把虚拟地址拆分成3个部分(低12位, 中10位, 高10位), 换成2进制如下:

-> 0000 0001 1010 1111 0101 0101 0001 1000

按照10, 10, 12的位数重新排列后

-> (页目录索引)00 000 00110, (页表项索引)10 1111 0101, (偏移)0101 0001 1000

换算成十六进制后可以得到如下结果

页目录索引 = 6, 页表项索引 = 0x2f5 , 偏移 = 0x518

2. 根据当前的CR3寄存器中的物理地址定位页目录表基址

Cr3中存放的是物理地址, 这个物理地址指向进程的页目录表基址, 由此可以得到

页目录表基址(PDE) = Cr3 = 0xAA0E5000

3. 计算页表项的地址

页表地址存放在页目录表(PDE)中的第6个项目中, 也就是

[0xAA0E5000 + 4 * 6] = [0xAA0E5018] = 0x3D955867, 其中0x00000867为该页表属性值, PTE = 0x3D955000

3. 计算页面物理地址

我们要找的页面在这个页表中的第0x2f5项, 所以虚拟地址所在的页的物理地址为

[0x3D955000 + 0x2f5 * 4] = [0x3D955BD4] =

假设[0x3D955BD4] = 0x7095e847, 页面的物理地址 x0x7095e000, 0x00000847表示的是页面属性

4. 计算最终的物理地址

由虚拟地址分离的偏移可以计算出最终的物理地址为

0x7095E000 + 0x00000518 = 0x7095E518.

10

使用WinIO.sys

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值