最近学习了一下PHYSICAL_MEMORY对象,总结之

2024-03-31 13:08

本文主要是介绍最近学习了一下PHYSICAL_MEMORY对象,总结之,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

最近学习了一下Windows的内存管理方面的知识,包括了PTE的修改和PHYSICAL_MEMORY的内核对象。

从网上得到了一段杀伤力很强的代码(似乎是Zwell以前写的) ,就是通过设置物理内存对象的可读写,再加上映射PTE的方式从而在Ring3环境下读取内核数据。这正是我想要,于是乎严重地学习了一下,前面已经有人总结过关键步骤了,如下:

1、用ZwOpenSection打开PHYSICAL_MEMORY对象,并设置可读写

2、进行虚拟地址到物理地址的转换

3、用NtMapViewOfSection进行映射,(用MapViewOfFile也可以)

4、读取或写入数据(但不是每个地方都能写的)

5、用NtUnmapViewOFSection取消映射(也可以使用UnMapViewOfFile),并关闭句柄(ZwClose)

经过这几步之后就可以为所欲为了,下面贴一段将虚拟地址转换成物理地址的代码,(在此得感谢Zwell的代码,使我的学习过程简化了不少):

//----------------------------------------------------------------
// paramenter : PULONG
//              PVOID
// return     : PVOID
//   convert linear address to physical address
//----------------------------------------------------------------
PVOID LinearToPhys(PULONG BaseAddress, PVOID addr)
{
    ULONG VAddr = (ULONG)addr, PGDE, PTE, PAddr;
    if ( VAddr >= 0x80000000 && VAddr < 0xa0000000 )//对于虚拟地址在0x80000000至0xa0000000这间的
    {                                                                                                //可以将虚拟的高3位置0,这样就能得到物理地址
        PAddr = VAddr - 0x80000000;
        return (PVOID)PAddr;
    }
    PGDE = BaseAddress[ VAddr >> 22 ];                            //在PDT中索引得到PDE
    if ( (PGDE&1) != 0 )
    {
        ULONG tmp = PGDE & 0x00000080;                     //如果是4M的分页则没有PageTable,用PDE的高10位 加上
        if ( tmp!=0 )                                                                //虚拟地址的低22位就可以了,所说这样是为性能的考虑
        {
            PAddr = ( PGDE & 0xFFC00000 ) + ( VAddr & 0x003FFFFF );
        }
        else                                                                                //如果是4K的分页
        {
           PGDE = (ULONG) MapViewOfFile (                        //映射到物理内存
                                                                  g_hMPM,
                                    FILE_MAP_ALL_ACCESS,
                                    0,
                                    PGDE & 0xfffff000,
                                    0x1000
                    );
            PTE  = ( (PULONG)PGDE )[ (VAddr&0x003FF000) >> 12 ];    //用虚拟地址的中间10位来索引到PTE
            if ( (PTE&1) != 0 )                                                                        //是否有效
            {
                PAddr = ( PTE & 0xFFFFF000 ) + ( VAddr & 0x00000FFF );//用PTE的高20位加上虚拟地址的低12
                UnmapViewOfFile( (PVOID)PGDE );                                                //就可以了,这时取消映射
            }
            else return 0;
        }
    }
    else return 0;

    return (PVOID)PAddr;
}

这是主要的代码了,另外还有一段代码就是用来打开对象,并设置其可读写的,后来自已加了一点代码(不超过15行)就可以指哪打哪了。

当时为了试验随便改了一下,不想改的就是PTE,后来在启动IceSwrod的时候直接重启了,比较汗。

以前听HOPY说,他用驱动试的修改PTE成功了,但用物理内存却没有成功,貌似我没有遇到过这种情况,呵呵!

 

这篇关于最近学习了一下PHYSICAL_MEMORY对象,总结之的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/864411

相关文章

Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式

《Java通过驱动包(jar包)连接MySQL数据库的步骤总结及验证方式》本文详细介绍如何使用Java通过JDBC连接MySQL数据库,包括下载驱动、配置Eclipse环境、检测数据库连接等关键步骤,... 目录一、下载驱动包二、放jar包三、检测数据库连接JavaJava 如何使用 JDBC 连接 mys

Python实现对阿里云OSS对象存储的操作详解

《Python实现对阿里云OSS对象存储的操作详解》这篇文章主要为大家详细介绍了Python实现对阿里云OSS对象存储的操作相关知识,包括连接,上传,下载,列举等功能,感兴趣的小伙伴可以了解下... 目录一、直接使用代码二、详细使用1. 环境准备2. 初始化配置3. bucket配置创建4. 文件上传到os

JavaSE正则表达式用法总结大全

《JavaSE正则表达式用法总结大全》正则表达式就是由一些特定的字符组成,代表的是一个规则,:本文主要介绍JavaSE正则表达式用法的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下... 目录常用的正则表达式匹配符正则表China编程达式常用的类Pattern类Matcher类PatternSynta

SpringMVC高效获取JavaBean对象指南

《SpringMVC高效获取JavaBean对象指南》SpringMVC通过数据绑定自动将请求参数映射到JavaBean,支持表单、URL及JSON数据,需用@ModelAttribute、@Requ... 目录Spring MVC 获取 JavaBean 对象指南核心机制:数据绑定实现步骤1. 定义 Ja

Python打印对象所有属性和值的方法小结

《Python打印对象所有属性和值的方法小结》在Python开发过程中,调试代码时经常需要查看对象的当前状态,也就是对象的所有属性和对应的值,然而,Python并没有像PHP的print_r那样直接提... 目录python中打印对象所有属性和值的方法实现步骤1. 使用vars()和pprint()2. 使

SQL中JOIN操作的条件使用总结与实践

《SQL中JOIN操作的条件使用总结与实践》在SQL查询中,JOIN操作是多表关联的核心工具,本文将从原理,场景和最佳实践三个方面总结JOIN条件的使用规则,希望可以帮助开发者精准控制查询逻辑... 目录一、ON与WHERE的本质区别二、场景化条件使用规则三、最佳实践建议1.优先使用ON条件2.WHERE用

MySQL JSON 查询中的对象与数组技巧及查询示例

《MySQLJSON查询中的对象与数组技巧及查询示例》MySQL中JSON对象和JSON数组查询的详细介绍及带有WHERE条件的查询示例,本文给大家介绍的非常详细,mysqljson查询示例相关知... 目录jsON 对象查询1. JSON_CONTAINS2. JSON_EXTRACT3. JSON_TA

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

C#之List集合去重复对象的实现方法

《C#之List集合去重复对象的实现方法》:本文主要介绍C#之List集合去重复对象的实现方法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录C# List集合去重复对象方法1、测试数据2、测试数据3、知识点补充总结C# List集合去重复对象方法1、测试数据

Nginx Location映射规则总结归纳与最佳实践

《NginxLocation映射规则总结归纳与最佳实践》Nginx的location指令是配置请求路由的核心机制,其匹配规则直接影响请求的处理流程,下面给大家介绍NginxLocation映射规则... 目录一、Location匹配规则与优先级1. 匹配模式2. 优先级顺序3. 匹配示例二、Proxy_pa