阅读:1113回复:1
关于\"写内核只读页面\"
看下面:
由于新版本的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; } 哪位能解释一下这段程序?? |
|
最新喜欢:![]() |
沙发#
发布于:2002-06-22 19:38
一段内存是否可写,只和描述这段内存的描述符有关。
如果你要写一段只读内存,可以重新建立一个可写的描述符 使它们指向同一段内存就可以了。 |
|
|