周壑x64位内核学习 (四)、x64分页机制
64位寻址,前16位是符号扩展,后48位才是要寻找的地址
一、四级页表
二、根据地址找物理页
以fffff800`3846efc0为例
1、舍弃前16位 11111000 00000000 00111000 01000110 11101111 11000000
2、拆分
1 1111 0000 0x1f0
0 0000 0000 0x0
1 1100 0010 0x1c2
0 0110 1110 0x6e
1 1111 1000 000 0xfc0
3、找物理地址
三、x64位下PTE的位置
ge根据不同机型有所不同
0地址对应的pte地址是这一个,从此时起,每多1000字节的地址,pte的地址就会增加8
假如我们要求的地址为0xffffxxxx`xxxxxxxx,那么其pte地址为
(0xffffxxxx`xxxxxxxx & 0x0000ffff`ffffffff >> 12) <<3 + FFFF878000000000
同理,x64下的PDT,PPE,PXE也可以这样得到
注意这三句话,pte也需要指向它自己的地址,指向他的地址就是pdt,以此类推
我们把pte当作普通地址经过上面那个公式演算就可以得到pte
用代码的话,就像这样
也就是说,只要我们知道pte的基地址,就可以求出所有页表的值
四、pte的基地址每次打开都是随机的
我们需要获取pte的基址
这里,周哥提供了一种方法,找调用pte基址的系统api
再根据内核文件的位置,找到这个偏移,每次读取这个偏移的数据即可!
五、实验
微软虚拟地址映射也是通过PTE的方式进行的
根据cr3的值,根据cr3找到pte的值,强搜调用这个值的API,再找到相对内核文件的偏移即可
lm
找到!!
算相对内核偏移
FFFFF80333403D6a - fffff80333400000 = 3D6A
下面求nt模块的基址,可以通过遍历内核模块的方法,或驱动driver结构体直接获取
这里我们写死地址
成功!!!
代码如下:
__EOF__

本文作者:_TLSN
本文链接:https://www.cnblogs.com/lordtianqiyi/articles/16057139.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
本文链接:https://www.cnblogs.com/lordtianqiyi/articles/16057139.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 25岁的心里话
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现