码农知识堂 - 1000bd
  •   Python
  •   PHP
  •   JS/TS
  •   JAVA
  •   C/C++
  •   C#
  •   GO
  •   Kotlin
  •   Swift
  • 驱动挂载物理页代码示例


    驱动挂载物理页代码示例

    使用的实验环境为32位xp系统在101012分页模式下

    此实验用于测试对分页模式的掌握程度

    代码思路如下:

    1. 获取目标进程的cr3
    2. 在目标进程中申请新的物理页
    3. 拆分新申请的物理页的线性地址
    4. 通过差分出的内容获取pte
    5. 将pte写入到要挂载的线性地址的pte中(这个线性地址也可以为不同cr3中的线性地址,这种情况下就可以两个进程共享同一物理页但是要把pte和pde都挂载好)
    6. 此时目标线性地址和新申请的线性地址映射为同一物理页

    样例代码:

    #include 
    #define NTSTRSAFE_LIB
    #include 
    #include 
    
    VOID Unload(PDRIVER_OBJECT pDriver) {
    	KdPrint(("unload"));
    	
    }
    
    NTSTATUS DriverEntry(PDRIVER_OBJECT pDriver, PUNICODE_STRING pRegPath) {
    	NTSTATUS status = STATUS_SUCCESS;
    	pDriver->DriverUnload = Unload;
    	KdPrint(("begin"));
    	//417   01 00 17
    	DWORD32 new_va = 0x417000;
    	DWORD32 new_cr3 = 0x02e96000;
    	DWORD32 old_cr3 = 0x0;
    	DWORD32* pdt_va = (DWORD32*)0xc0300000;
    	UCHAR* ptt_va = (UCHAR*)0xc0000000;
    
    	//拆分new_va
    	KdPrint(("开始拆分线性地址"));
    	DWORD32 new_va_10_1 = new_va >> 0x16;
    	DWORD32 new_va_10_2 = new_va << 0xa;
    	new_va_10_2 >>= 0x16;
    	DWORD32 new_va_12 = new_va & 0x00000fff;
    	KdPrint(("10:0x%x, 10:0x%x, 12:0x%x \r\n", new_va_10_1, new_va_10_2, new_va_12));
    	//挂载物理页
    	KdPrint(("开始挂载物理页"));
    	KIRQL irql = KeRaiseIrqlToDpcLevel();
    	old_cr3 = __readcr3();
    	__writecr3(new_cr3);
    	KeLowerIrql(irql);
    
    	DWORD32* pte = (ptt_va + ((new_va_10_1 << 12) + (new_va_10_2 << 2)));
    	KdPrint(("0x%p\r\n",pte));
    	DWORD32* new_pte = (DWORD32*)(ptt_va + 4);
    	KdPrint(("0x%p\r\n", new_pte));
    	*new_pte = *pte;
    
    	irql = KeRaiseIrqlToDpcLevel();
    	__writecr3(old_cr3);
    	KeLowerIrql(irql);
    	/*DWORD32* cr3_va = (DWORD32*)0xc0300000;
    	for (size_t i = 0; i < 1024; i++)
    	{
    		KdPrint(("%d: 0x%x", i, cr3_va[i]));
    	}*/
    	return status;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
  • 相关阅读:
    4、 后台服务配制以及代码生成[木字楠博客]
    这篇文章让你实现时光机特效的操作
    springboot+vue+elementUI304springboot305springboot农机电招租赁预约平台#毕业设计
    【vue设计与实现】挂载和更新 3-class的处理
    工控安全PLC固件逆向三
    10.网络编程套接字Socket
    8.1 建军 环境配置
    【进阶C语言】进阶指针--学会所有指针类型
    The Missing Semester of Your CS Education(计算机教育中缺失的一课)
    一言不合就汇编--分析max宏的两种异常情况
  • 原文地址:https://blog.csdn.net/qq_43147121/article/details/133421474
  • 最新文章
  • 攻防演习之三天拿下官网站群
    数据安全治理学习——前期安全规划和安全管理体系建设
    企业安全 | 企业内一次钓鱼演练准备过程
    内网渗透测试 | Kerberos协议及其部分攻击手法
    0day的产生 | 不懂代码的"代码审计"
    安装scrcpy-client模块av模块异常,环境问题解决方案
    leetcode hot100【LeetCode 279. 完全平方数】java实现
    OpenWrt下安装Mosquitto
    AnatoMask论文汇总
    【AI日记】24.11.01 LangChain、openai api和github copilot
  • 热门文章
  • 十款代码表白小特效 一个比一个浪漫 赶紧收藏起来吧!!!
    奉劝各位学弟学妹们,该打造你的技术影响力了!
    五年了,我在 CSDN 的两个一百万。
    Java俄罗斯方块,老程序员花了一个周末,连接中学年代!
    面试官都震惊,你这网络基础可以啊!
    你真的会用百度吗?我不信 — 那些不为人知的搜索引擎语法
    心情不好的时候,用 Python 画棵樱花树送给自己吧
    通宵一晚做出来的一款类似CS的第一人称射击游戏Demo!原来做游戏也不是很难,连憨憨学妹都学会了!
    13 万字 C 语言从入门到精通保姆级教程2021 年版
    10行代码集2000张美女图,Python爬虫120例,再上征途
Copyright © 2022 侵权请联系2656653265@qq.com    京ICP备2022015340号-1
正则表达式工具 cron表达式工具 密码生成工具

京公网安备 11010502049817号