« 某邻居画的图,挺搞笑巨盾网游安全盾 »

我也来发强制进程内存读写

看雪上有人发了篇《驱动级读写内存》,以为是代码,下回来却发现是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;
}

  • quote 1.flyingkisser
  • 多核同台难以同步
    langouster2 于 2009-08-05 22:47:24 回复
    经过实验证明应该是比较稳定的,至今没出现过蓝屏。
  • 2009-8-5 18:31:41 回复该留言
  • quote 2.残猫
  • g_DirectoryTableBaseOffset这是什么变量呢?
    langouster2 于 2010-7-22 23:32:41 回复
    lkd> dt _KPROCESS
    nt!_KPROCESS
    +0x000 Header : _DISPATCHER_HEADER
    +0x010 ProfileListHead : _LIST_ENTRY
    +0x018 DirectoryTableBase : [2] Uint4B
    +0x020 LdtDescriptor : _KGDTENTRY
    +0x028 Int21Descriptor : _KIDTENTRY
    +0x030 IopmOffset : Uint2B
    ....

    上面那项的偏移,在我的系统里是0x18
  • 2010-7-22 09:35:24 回复该留言

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

日历

最新评论及回复

最近发表

Powered By Z-Blog 2.0 bate Build Theme by toboku

Copyright langouster. Some Rights Reserved.   苏ICP备06046736号