xiangshifu
驱动小牛
驱动小牛
  • 注册日期2002-07-25
  • 最后登录2013-10-18
  • 粉丝1
  • 关注0
  • 积分5分
  • 威望20点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
阅读:1921回复:7

在驱动中,如何对于任意内存空间读写?

楼主#
更多 发布于:2004-04-05 12:46
在驱动中,如何对于任意内存空间读写?

在9x下很简单,用指针直接就可以操作!
在nt/2000/xp系统下,对于一个线性地址,是不是首先要转化成物理地址,再读写,如果有写保护,还应去掉其写保护标志位?有没有例子?

我找到一份代码,没有看懂!

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;
}
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2004-04-05 13:28
首先你要确保该地址存在,不然当然不行,其次在XP以后系统有内核写保护,防止RING0驱动改写核心结构,X86下需要屏蔽CR0的位16 WP保护位就可以在RING0读写任意存在的地址了。
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
xiangshifu
驱动小牛
驱动小牛
  • 注册日期2002-07-25
  • 最后登录2013-10-18
  • 粉丝1
  • 关注0
  • 积分5分
  • 威望20点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
板凳#
发布于:2004-04-05 19:31
这段代码运行后 必定死机 为什么?


#include "mem.h"
#include "debug.h"

#define  PROCESS_NAME_OFFSET  0x01234567


VOID
ReadMem()
{
    PVOID               ioBuffer[16];

RtlCopyMemory (ioBuffer, (char *)PROCESS_NAME_OFFSET, 16);

InterruptDrv_KDPRINT( ("ReadMem function x%\n",ioBuffer) );
}

VOID
WriteMem()
{

}
xiangshifu
驱动小牛
驱动小牛
  • 注册日期2002-07-25
  • 最后登录2013-10-18
  • 粉丝1
  • 关注0
  • 积分5分
  • 威望20点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
地板#
发布于:2004-04-05 20:22
如何读/写 地址 0x01234567 ?假设这个地址有效!
AllenZh
驱动老牛
驱动老牛
  • 注册日期2001-08-19
  • 最后登录2015-11-27
  • 粉丝19
  • 关注10
  • 积分1316分
  • 威望2387点
  • 贡献值7点
  • 好评度321点
  • 原创分0分
  • 专家分0分
地下室#
发布于:2004-04-07 10:18
因为该地址无效,访问当然有问题
即使对某些程序有效,也不是对所有程序有效
你必须做地址转换才可以

这段代码运行后 必定死机 为什么?


#include "mem.h"
#include "debug.h"

#define  PROCESS_NAME_OFFSET  0x01234567


VOID
ReadMem()
{
    PVOID               ioBuffer[16];

RtlCopyMemory (ioBuffer, (char *)PROCESS_NAME_OFFSET, 16);

InterruptDrv_KDPRINT( ("ReadMem function x%n",ioBuffer) );
}

VOID
WriteMem()
{

}
1,承接Windows下驱动/应用开发 2,本人原创虚拟鼠标/键盘,触摸屏,虚拟显卡,Mirror驱动,XP无盘的SCSI虚拟磁盘驱动等 3,windows下有尝技术服务(包括BUG调试,员工培训等) 欢迎深圳和海外企业联系.msn:mfczmh@sina.com
xiangshifu
驱动小牛
驱动小牛
  • 注册日期2002-07-25
  • 最后登录2013-10-18
  • 粉丝1
  • 关注0
  • 积分5分
  • 威望20点
  • 贡献值0点
  • 好评度5点
  • 原创分0分
  • 专家分0分
5楼#
发布于:2004-04-07 11:03
是要对地址的有效性进行检测!
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
6楼#
发布于:2004-04-07 11:14
如果你在内核层的话,可以直接搜索页表,然后把不存在的地址指向一个存在的物理页,然后就可以往里面写了,当然你实际写的是另一个线性地址的物理地址,只不过欺骗了操作系统而已,嘿嘿......
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
yonghong204
驱动牛犊
驱动牛犊
  • 注册日期2003-12-10
  • 最后登录2010-12-22
  • 粉丝0
  • 关注0
  • 积分13分
  • 威望80点
  • 贡献值0点
  • 好评度7点
  • 原创分0分
  • 专家分0分
7楼#
发布于:2004-04-07 11:22
在windows 2000/xp下,对内存读写实施了更加有效的保护,直接利用线性地址在应用程序中读写内存将死机,而在驱动程序中,也只能对部分地址进行读写
游客

返回顶部