Songzh
驱动牛犊
驱动牛犊
  • 注册日期2001-12-29
  • 最后登录2011-03-29
  • 粉丝0
  • 关注0
  • 积分1分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
阅读:1113回复:1

关于\"写内核只读页面\"

楼主#
更多 发布于:2002-06-22 18:51
看下面:

由于新版本的Windows 2k/xp对一些重要的数据结构,和一些只读的image页面,设置cr0的wp位,这样即使在ring0写这些只读页面,都会出现bugcheck(Bug Check 0xBE: ATTEMPTED_WRITE_TO_READONLY_MEMORY)。当然解决办法有两种:
1、清除cr0的wp位。
2、windows在注册表中有一表项:
HKEY_LOCAL_MACHINE\\SYSTEM\\CurrentControlSet\\Control\\Session Manager\\Memory Management下将EnforceWriteProtection设成0,即可默认取消这一了限制。
softice使用第二种方法。当然这样做的话对于system service以外的所有readonly区域os都将不能做到保护这些只读页面。当然这是softice运行所必须的。因为softice不知道我们的断点(通过写入0xcc int 3)设在哪等等。

但是mark通过一个非常聪明的办法来实现这一功能。他这样做将只影响到他自己对system service table的修改,他通过建立一个mdl,来实现。对这个mdl有write access。这是一个极其聪明的办法,非对windows nt/2000有极深入研究的人可以想到的办法(特别是mm子系统)。

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;
}

哪位能解释一下这段程序??

最新喜欢:

xiangshifuxiangs...
zsb9527
驱动小牛
驱动小牛
  • 注册日期2002-05-31
  • 最后登录2018-05-29
  • 粉丝0
  • 关注0
  • 积分2分
  • 威望10点
  • 贡献值0点
  • 好评度0点
  • 原创分0分
  • 专家分0分
沙发#
发布于:2002-06-22 19:38
一段内存是否可写,只和描述这段内存的描述符有关。
如果你要写一段只读内存,可以重新建立一个可写的描述符
使它们指向同一段内存就可以了。
小子,从今天开始,你就是华府的低等下人,9527就是你的终身代号。 [img]http://www.driverdevelop.com/forum/upload/zsb9527/2002-06-25_6.jpg[/img]
游客

返回顶部