看雪上有人发了篇《驱动级读写内存》,以为是代码,下回来却发现是PE,而且还要去个头才行,大概看了下驱动,底下调的还是KeStackAttachProcess。而一般的游戏保护都会这类函数Hook掉。
先前看到网上的一段切换cr3的代码,自己整理了一下,有需要的可以借鉴。
//在调试此函数后调用DetachProcessMemory前,不能单步调用,可能是因为windbg会记下Cr3并恢复
BOOLEAN AttachProcessMemory(PEPROCESS pEProcess,OUT ULONG *pOldCR3)
{
BOOLEAN retval=FALSE;
ULONG OldCR3;
KSPIN_LOCK Locker;
KIRQL Irql;
KeInitializeSpinLock(&Locker);
KeAcquireSpinLock(&Locker,&Irql);//提升到DPC
__asm
{
push eax;
mov eax,cr3;
mov OldCR3,eax;
mov eax,pEProcess;
add eax,g_DirectoryTableBaseOffset;
mov eax,[eax];//得到新的CR3
mov cr3,eax;
pop eax;
}
KeReleaseSpinLock(&Locker,Irql);
retval=TRUE;
if(retval)
{
*pOldCR3=OldCR3;
}
return retval;
}
BOOLEAN DetachProcessMemory(ULONG OldCR3)
{
KSPIN_LOCK Locker;
KIRQL Irql;
KeInitializeSpinLock(&Locker);
KeAcquireSpinLock(&Locker,&Irql);
__asm
{
push eax;
mov eax,OldCR3;
mov cr3,eax;
pop eax;
}
KeReleaseSpinLock(&Locker,Irql);
return TRUE;
}