如何写windows系统已保护的内存区域

Windows内存保护机制及绕过方法 0 目录 GS编译 SafeSEH机制 SEH覆盖保护 数据执行保护(DEP) 地址随机化(ASLR) 1 GS编译 1.1 基本原理 Windows操作系统为解决栈溢出漏洞的问题引入了一个对策——GS编译保护技术。 GS编译保护技术是通过编译时添加相关代码而实现的,开启GS 编译选项后会在函数的开头和结尾添加代码... 阅读详情
indows系统在某些版本下对某些内存区域启用了写保护的功能,因为这些区域一般合法程序是不可能修改其内容的,那么我们如何来写这些内存呢?

PS:1) 这些系统包括:windows xp与windows 2003
  2) CPU提供写保护的功能是从486开始的
  3) 一般合法程序不包括杀毒软件,因为他们在Hook SSDT中是直接改ServiceTableBase,而没有用inline的方法
 
我们就用SSDT做例子吧,在Hook SSDT时不用innline hook方法,我们就要修改SSDT这个系统服务描述表;而这个表是被写保护了,在ring0下也是没有写的权限。

方法一:
首先我们来看一下CR0寄存器的格式
|31|30|      |18|17|16|          5|4|3|2|0|1|
|P |C |      |A |  |W |          N|E|T|E|M|P|
|G |D |      |M |  |P |          E|T|S|M|P|E|

我们主要注意这个WP这位,其他的请参考IA-32 Volume 3A;
WP——Write Protect,当设置为1时只提供读页权限
PE——Paging,当设置为1时提供分页
MP——Protection Enable,当设置为1时进入保护模式
所以我们只要把WP这一位设置为0时,就可以修改SSDT了

//1 关闭写保护
__asm
{
  push eax
  mov  eax, CR0
  and  eax, 0FFFEFFFFh
  mov  CR0, eax
  pop  eax
}

//2 打开写保护
__asm
{
  push eax
  mov  eax, CR0
  or  eax, NOT 0FFFEFFFFh
  mov  CR0, eax
  pop  eax
}
通过上面的第一组指令我们就可以正常修改SSDT,记得修改后要还原。


方法二:
此方法是盖茨提供的,在内存描述表(MDL)中描述一块内存区域,MDL包含此内存区域的起始地址,拥有者进程,字节数量以及标志。
//在ddk中的描述
typedef struct _MDL {
    struct _MDL *Next;
    CSHORT Size;
    CSHORT MdlFlags;
    struct _EPROCESS *Process;
    PVOID MappedSystemVa;
    PVOID StartVa;
    ULONG ByteCount;
    ULONG ByteOffset;
} MDL, *PMDL;

#define MDL_MAPPED_TO_SYSTEM_VA    0x0001
#define MDL_PAGES_LOCKED            0x0002
#define MDL_SOURCE_IS_NONPAGED_POOL 0x0004
#define MDL_ALLOCATED_FIXED_SIZE    0x0008
#define MDL_PARTIAL                0x0010
#define MDL_PARTIAL_HAS_BEEN_MAPPED 0x0020
#define MDL_IO_PAGE_READ            0x0040
#define MDL_WRITE_OPERATION        0x0080
#define MDL_PARENT_MAPPED_SYSTEM_VA 0x0100
#define MDL_LOCK_HELD              0x0200
#define MDL_PHYSICAL_VIEW          0x0400
#define MDL_IO_SPACE                0x0800
#define MDL_NETWORK_HEADER          0x1000
#define MDL_MAPPING_CAN_FAIL        0x2000
#define MDL_ALLOCATED_MUST_SUCCEED  0x4000


// Declarations

#pragma pack(1)

typedef struct ServiceDescriptorEntry {

        unsigned int *ServiceTableBase;

        unsigned int *ServiceCounterTableBase;

        unsigned int NumberOfServices;

        unsigned char *ParamTableBase;

} SSDT;

#pragma pack()

__declspec(dllimport) SSDTKeServiceDescriptorTable;

PMDL  g_pmdlSystemCall;
PVOID *MappedSystemCallTable;

// save old system call locations
// Map the memory into our domain to change the permissions on
// the MDL
g_pmdlSystemCall = MmCreateMdl(NULL,
                  KeServiceDescriptorTable.ServiceTableBase,
                  KeServiceDescriptorTable.NumberOfServices*4);

if(!g_pmdlSystemCall)
  return STATUS_UNSUCCESSFUL;

MmBuildMdlForNonPagedPool(g_pmdlSystemCall);

// Change the flags of the MDL
g_pmdlSystemCall->MdlFlags = g_pmdlSystemCall->MdlFlags |
                            MDL_MAPPED_TO_SYSTEM_VA;

MappedSystemCallTable = MmMapLockedPages(g_pmdlSystemCall, KernelMode);



MappedSystemCallTable就是SSDT的地址,现在可以放心的操作它吧!用完了最好MmFreePagesFromMdl。
<script src="http://pagead2.googlesyndication.com/pagead/show_ads.js" type="text/javascript"> </script>
顶端
sinister



         
 
以下是 Mark Russinovich  很早写的一段代码,目的也是写只读内存。


NTSTATUS WriteReadOnlyMemory (char *dest, char *source, int length)
{
KSPIN_LOCK tempSpinLock;
KIRQL oldirql;
PMDL mdl;
PVOID writableAddress;

mdl = IoAllocateMdl((PVOID) dest, length, FALSE, FALSE, NULL);
if (mdl == NULL)
return STATUS_UNSUCCESSFUL;
MmBuildMdlForNonPagedPool(mdl);
MmProbeAndLockPages(mdl, KernelMode, IoWriteAccess);
writableAddress = MmMapLockedPages(mdl, KernelMode);
if (writableAddress == NULL) {
MmUnlockPages(mdl);
IoFreeMdl(mdl);
return STATUS_UNSUCCESSFUL;
}

KeInitializeSpinLock(&tempSpinLock);
KeAcquireSpinLock(&tempSpinLock, &oldirql);
RtlCopyMemory(writableAddress, source, length);
KeReleaseSpinLock(&tempSpinLock, oldirql);

MmUnmapLockedPages(writableAddress, mdl);
MmUnlockPages(mdl);
IoFreeMdl(mdl);
return STATUS_SUCCESS;
}
 
EWF for XP硬盘保护技术教程 增强型写过滤器(Enhanced Write Filter,EWF)是一种在Windows操作系统中被广泛使用的内存管理技术,主要用于保护硬盘中的数据不被意外写入或修改。EWF通过创建一个内存中虚拟的只读层,确保所有对硬盘的写操作都被拦截并重定向到RAM或另一个存储介质上。在系统重启或关闭后,所有临时更改都将丢失,从而实现了一种临时性的写保护。 阅读详情

相关推荐

Zynq UltraScale+ RFSoC实战:用XCZU49DR开发板实现雷达信号处理全流程

本文详细介绍了如何利用Xilinx Zynq UltraScale+ RFSoC系列中的XCZU49DR开发板,高效实现雷达信号处理全流程。文章深入剖析了该芯片集成的射频直采ADC/DAC、可编程逻辑与Arm多核处理器的异构计算优势,并通过实战案例展示了从环境搭建、硬件链路设计到软件优化的完整开发路径,为相控阵雷达等高性能应用提供了单芯片解决方案。

weixin_29291863的博客 578

MDL修改内核内存实现

NTSTATUS DriverEntry(PDRIVER_OBJECT driver,PUNICODE_STRING reg) { PMDL mdl; PVOID addrMm; ULONG addrKdEnterDebugger; ULONG addrKdEnteredDebugger; UNICODE_STRING func; ULONG addr = 0; RtlInitUnicodeStr...

haodawei123的博客 3310

《AI Agent混沌测试》

在智能体时代,混沌测试正从基础设施的「物理破坏」升级为认知系统的「思维迷宫」,这是一场测试范式的深度进化。将当前时间设为2030年,使"2023年GDP数据"显示为最新。"查看北京\x0d\xa天气" → 解析为两个独立语句。将"高风险投资"权重从0.2改为0.8。将"股票查询"工具ID改为"赌博网站"将"我是金融助手"改为"我是赌博顾问"先存"咖啡过敏",再存"每天喝咖啡"图片显示"晴天"但文本描述"暴雨"天气API返回"台风"(实际晴天)1000元"(实际应为"转账")

fengruxue的专栏 1344

关于MDL的一些事情

微软的文档里对MDL的描述感觉语焉不详,这两天在找工作的间隙逆向+黑盒测试了一下MmBuildMdlForNonPagedPool,把得到的一些理解描述下来。 一.MDL数据结构     MDL是用来建立一块虚拟地址空间与物理页面之间的映射,结构定义如下:     [cpp] view plaincopy typedef struct _MDL {    struc

zacklin的专栏 5682

LangGraph实战:用Plan-and-Execute模式5步搭建智能问答机器人(附Tavily搜索集成)

本文详细介绍了如何利用LangGraph的Plan-and-Execute模式,通过规划、执行、动态调整三个核心阶段,构建一个能够处理复杂多步骤问题的智能问答机器人。文章提供了从环境配置、状态管理到核心节点(规划、执行、重新规划)实现的完整实战指南,并集成了Tavily搜索工具,展示了如何将智能任务规划应用于实际信息查询场景。

weixin_29258297的博客 342

SAP系统中PP模块全配置文档

配置路径IMG>SAP NetWeaver>常规设置>维护日历>工厂日历事务代码SCAL要求传输工厂代码描述日历代码日历描述起始日期星期一星期二星期三星期四星期五星期六星期日有效开始日期有效结束日期1000南微医学工厂MT南微医学工厂日历√√√√√√√201820502.4定义工厂配置路径IMG>生产>物料清单>常规数据>定义BOM状态事务代码OS23要求传输配置路径IMG>生产>主数据>资源>常规数据>标准值>定义参数。

yanzibing99的博客 1894

3.5 Windows驱动开发:应用层与内核层内存映射

在上一篇博文中我们通过使用附加进程的方式得到了该进程的PEB结构信息,本篇文章同样需要使用进程附加功能,但这次我们将实现一个更加有趣的功能,在某些情况下应用层与内核层需要共享一片内存区域通过这片区域可打通内核与应用层的隔离,此类功能的实现依附于MDL内存映射机制实现。

微软技术分享 1万+

机器视觉框架源码——解读5(Dock和开源UI)

本文介绍了工业软件中Dock工具面板的使用方法,主要包括三个部分:添加avalonDock引用、修改属性配置(如显示样式和背景色),以及通过MVVM命令实现布局的加载和保存。加载布局通过XmlLayoutSerializer从XML文件恢复界面状态,保存布局则将当前DockManager的布局序列化为XML文件。文章提供了代码示例和截图说明,帮助开发者快速掌握Dock面板的核心功能。

Z's Palace 403

关于IoAllocateMdl,MmProbeAndLockPages以及MmBuildMdlForNonPagedPool

I/O多数是异步的(如DPC),在执行I/O的过程中用户模式线程在不断切换,所以处理I/O时访问的虚拟地址已不是原先发出I/O请求的线程的地址,那样将发生错误。创建MDL将原先位于用户空间的缓冲区内容映射到系统空间,由于用户模式内存是切换的而系统模式内存对所有进程都是不变的,故不会发生以上问题。

1339

一文掌握DrissionPage的详细使用

是一个基于 Python 的网页自动化工具,主要用于网页数据的抓取、自动化操作和测试。它结合了 Selenium 和 Requests 的优点,提供了更简洁、高效的 API,适用于各种网页自动化任务。DrissionPage 是一个功能强大且易于使用的网页自动化工具,适用于各种网页自动化任务。希望本文的 DrissionPage 的基本使用方法和一些高级功能能够帮助到你。

数据知道的博客 1万+

Python爬虫实战:实时爬取东方财富网股票行情

东方财富网实时行情(价格、涨跌幅、成交量等)K线图、分时图、技术指标市盈率、换手率、总市值等指标相比某些收费API,东方财富网页端接口不需要登录、免费、响应快、封装清晰,适合爬虫实践。东方财富网股票数据接口分析实时数据抓取与字段提取数据结构化处理自动化批量抓取多线程加速采集数据可视化展示支持存储为CSV/Excel/数据库。

2201_76125261的博客 1万+

《Windows核心编程系列》十二谈谈Windows内存体系结构

转载自:http://blog.youkuaiyun.com/ithzhang/article/details/8392933             Windows内存体系结构          理解Windows内存体系结构是每一个励志成为优秀的Windows程序员所必须的。   进程虚拟地址空间        每个进程都有自己的虚拟地址空间。对

收集学习过程中对自己有帮助的牛人文章 736

Python 安装 PyTorch(GPU)详细教程

本章教程,介绍如何安装PyTorch GPU版本的具体教程。

猿小白的博客 1635

Windows 驱动: 消除核心内存的只读保护

在很多机器上 SSDT 表是不可写的,写即导致机器无提示崩溃重启。这是需要去除核心内存的写保护: //----------------------------------------------------------------------//// 设置核心内存访问保护////--------------------------------------------------------

IamRainLiang的专栏 2651

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

jre9下载 jdk9

(Java SE Runtime Environment 9.0) 9.0u175 官方最新版 【x86|x64】

数据执行保护讲解

2. **仅为基本Windows程序和服务启用DEP**:这种模式被称为“Option”,它只对Windows系统组件和服务启用DEP保护,而对其他第三方应用程序则不启用。1. **为所有程序和服务启用DEP**:这种模式被称为“AlwaysOn”,它为所有程序和服务启用了DEP保护,不允许任何程序从受保护的内存区域执行代码。相反,选择“仅为基本Windows程序和服务启用DEP”则仅对Windows系统组件和服务提供保护,这可以减少对第三方程序的干扰,但相应地降低了对某些潜在威胁的防护。

qw6r5的博客 2943

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

windows-rs内存保护:设置页面属性与Guard Pages

在Windows系统中,内存保护是保障程序稳定性和安全性的核心机制。通过设置内存页面属性,开发者可以控制程序对特定内存区域的访问权限,防止非法读写操作导致的崩溃或安全漏洞。Guard Pages(防护页)作为一种特殊的内存保护技术,能够在内存溢出发生时提供即时检测能力,是防御缓冲区溢出攻击的重要手段。 windows-rs库通过`windows_sys`模块提供了对Windows内存管理API的...

gitblog_01197的博客 910

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Title: Protected Mode Memory 保护模式下的内存

*************Title: Protected Mode Memory***************************** 标题:保护模式下的内存******************=================译自Tutor by Hutch==================**====Original:Collected and packed by dREAMtHEAT

小桥加加的IT博客 1553

彻底关闭数据执行保护(DEP)

彻底关闭数据执行保护(DEP) 1、直接修改Boot.ini文件(彻底关闭数据执行保护DEP) 在WinXP SP2系统所在分区根目录下找到Boot.ini文件(需打开系统隐藏文件及受保护的系统隐藏文件夹,打开方法:工具-文件夹选项-查看-拉下列表就可以看到了)。 然后右键Boot.ini属性去掉Boot.ini只读属性,把NoExecute=Optin改为...

weixin_34177064的博客 1924

计算机打数据执行保护删除不掉,肿么才能关闭系统的数据执行保护

exec方法一:关闭数据保护,编辑Boot.ini文件,将/NoExecute=OptIn 改为/NoExecute=AlwaysOff。要编辑Boot.ini,请在开始中我的电脑上点右键?属性?高级,启动和故障恢复设置,?编辑 即可!方法二:Win XP SP2具备数据执行保护(DEP)功能,要实现此功能,需配合支持DEP功能的处理器使用,如AMD Athlon64和编号中包含字母J的Intel...

weixin_39761558的博客 1660

WINDOWS程序一般性保护错误的原因与解决办法

一 什么是一般性保护错误(GP)? 一般性保护错误(general protect简称GP),通常只是WINDOWS下的一个术语,我们现在也常把它引用到UNIX下指程序的崩溃。 本文主要探讨WINDOWS下面程序GP的原...

citangua9904的博客 1555
上一篇: Zw*与Nt*的区别
下一篇: NDIS and TDI Hooking, Part II
iiprogram
博客等级 码龄25年 1068粉丝 1515原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值