最近学习了一下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中如何将inputStream对象转换为File对象(不生成本地文件)

《在java中如何将inputStream对象转换为File对象(不生成本地文件)》:本文主要介绍在java中如何将inputStream对象转换为File对象(不生成本地文件),具有很好的参考价... 目录需求说明问题解决总结需求说明在后端中通过POI生成Excel文件流,将输出流(outputStre

java常见报错及解决方案总结

《java常见报错及解决方案总结》:本文主要介绍Java编程中常见错误类型及示例,包括语法错误、空指针异常、数组下标越界、类型转换异常、文件未找到异常、除以零异常、非法线程操作异常、方法未定义异常... 目录1. 语法错误 (Syntax Errors)示例 1:解决方案:2. 空指针异常 (NullPoi

C#原型模式之如何通过克隆对象来优化创建过程

《C#原型模式之如何通过克隆对象来优化创建过程》原型模式是一种创建型设计模式,通过克隆现有对象来创建新对象,避免重复的创建成本和复杂的初始化过程,它适用于对象创建过程复杂、需要大量相似对象或避免重复初... 目录什么是原型模式?原型模式的工作原理C#中如何实现原型模式?1. 定义原型接口2. 实现原型接口3

Java反转字符串的五种方法总结

《Java反转字符串的五种方法总结》:本文主要介绍五种在Java中反转字符串的方法,包括使用StringBuilder的reverse()方法、字符数组、自定义StringBuilder方法、直接... 目录前言方法一:使用StringBuilder的reverse()方法方法二:使用字符数组方法三:使用自

Java进阶学习之如何开启远程调式

《Java进阶学习之如何开启远程调式》Java开发中的远程调试是一项至关重要的技能,特别是在处理生产环境的问题或者协作开发时,:本文主要介绍Java进阶学习之如何开启远程调式的相关资料,需要的朋友... 目录概述Java远程调试的开启与底层原理开启Java远程调试底层原理JVM参数总结&nbsMbKKXJx

Java实现将byte[]转换为File对象

《Java实现将byte[]转换为File对象》这篇文章将通过一个简单的例子为大家演示Java如何实现byte[]转换为File对象,并将其上传到外部服务器,感兴趣的小伙伴可以跟随小编一起学习一下... 目录前言1. 问题背景2. 环境准备3. 实现步骤3.1 从 URL 获取图片字节数据3.2 将字节数组

Javascript访问Promise对象返回值的操作方法

《Javascript访问Promise对象返回值的操作方法》这篇文章介绍了如何在JavaScript中使用Promise对象来处理异步操作,通过使用fetch()方法和Promise对象,我们可以从... 目录在Javascript中,什么是Promise1- then() 链式操作2- 在之后的代码中使

MyBatis的配置对象Configuration作用及说明

《MyBatis的配置对象Configuration作用及说明》MyBatis的Configuration对象是MyBatis的核心配置对象,它包含了MyBatis运行时所需的几乎所有配置信息,这个对... 目录MyBATis配置对象Configuration作用Configuration 对象的主要作用C

Python依赖库的几种离线安装方法总结

《Python依赖库的几种离线安装方法总结》:本文主要介绍如何在Python中使用pip工具进行依赖库的安装和管理,包括如何导出和导入依赖包列表、如何下载和安装单个或多个库包及其依赖,以及如何指定... 目录前言一、如何copy一个python环境二、如何下载一个包及其依赖并安装三、如何导出requirem

SpringBoot实现导出复杂对象到Excel文件

《SpringBoot实现导出复杂对象到Excel文件》这篇文章主要为大家详细介绍了如何使用Hutool和EasyExcel两种方式来实现在SpringBoot项目中导出复杂对象到Excel文件,需要... 在Spring Boot项目中导出复杂对象到Excel文件,可以利用Hutool或EasyExcel