第二次鼓起勇气发帖子,不知道算不算原创,在这篇文章里,唯一算得上是我想出来的,就是这个思路了,其他代码都是从其他地方A过来的  ^.^

    一直都在沿着大哥哥的脚步前进,每当看到哥哥们精湛的代码,总是激动万分。今天在瞧着一篇文章“简单inline hook ObReferenceObjectByHandle保护进程和屏蔽文件执行 地址为:http://bbs.pediy.com/showthread.php?t=65731”的时候,突发灵感,得到以下思路:( 如果此思路已经被牛人提过的话,那么纯属巧合了 ^.^ )不管是在结束进程也好,读取写入进程内容也罢,在调用ObReferenceObjectByHandle后,会返回被操作的进程的一个PEPROCESS结构,如果挂钩ObReferenceObjectByHandle函数,把返回的PEPROCESS替换为其他进程的PEPROCESS,那么不就相当于操作其他进程了吗?进一步的假设,如果替换为IS的进程,那么就等于对IS进程进行操作了,当要结束被操作的进程,也就等于要结束IS进程,于是就有了下面的保护进程的办法:

NTSTATUS _stdcall MyObReferenceObjectByHandle(HANDLE Handle,ACCESS_MASK DesiredAccess,POBJECT_TYPE ObjectType,KPROCESSOR_MODE AccessMode,PVOID *Object,POBJECT_HANDLE_INFORMATION HandleInformation)
{
  NTSTATUS Status;
  PVOID TempPtr;
  PVOID ReferencedObject;

  Status = RealObReferenceObjectByHandle(Handle, DesiredAccess, ObjectType, AccessMode, &ReferencedObject, HandleInformation);     //先调用原始函数
  if (NT_SUCCESS(Status)) 
  {

    if (ReferencedObject==(PVOID)MyEPROCESS)     //MyEPROCESS为自己关心的进程的一个结构,这里是不是自己关心的进程
    {
      if (Object)
      {
        ReferencedObject = (PVOID)AvpEPROCESS;  //AvpEPROCESS是要替换的其他进程的PEPROCESS  
        *Object = ReferencedObject;        //返回的结果已经不是被操作的进程的PEPROCESS,而是另外被替换的结果 - -!
        DbgPrint("ReferencedObject :%X  (PVOID)AvpEPROCESS : %X",ReferencedObject,(PVOID)AvpEPROCESS);
      }
    }
    else              //如果不是自己关系你的进程,那么一切正常
    {
      if (Object)
      {
        //DbgPrint("ReferencedObject :%X",ReferencedObject);
        *Object = ReferencedObject;
      }
    }
  }
return Status;
}

上面代码执行后,显示结果说明已经被hook了:


lkd> u ObReferenceObjectByHandle
nt!ObReferenceObjectByHandle:
8056d559 8bff            mov     edi,edi
8056d55b 55              push    ebp
8056d55c 8bec            mov     ebp,esp
8056d55e 51              push    ecx
8056d55f 53              push    ebx
8056d560 56              push    esi
8056d561 57              push    edi
8056d562 64a124010000    mov     eax,dword ptr fs:[00000124h]

lkd> u ObReferenceObjectByHandle
nt!ObReferenceObjectByHandle:
8056d559 eafc38ff880800  jmp     0008:88FF38FC
8056d560 56              push    esi
8056d561 57              push    edi
8056d562 64a124010000    mov     eax,dword ptr fs:[00000124h]
8056d568 8b5d18          mov     ebx,dword ptr [ebp+18h]
8056d56b 33d2            xor     edx,edx
8056d56d 395508          cmp     dword ptr [ebp+8],edx
8056d570 8bf0            mov     esi,eax

lkd> u 88FF38FC
88ff38fc ea633e55b20800  jmp     0008:B2553E63
88ff3903 8bff            mov     edi,edi
88ff3905 55              push    ebp
88ff3906 8bec            mov     ebp,esp
88ff3908 51              push    ecx
88ff3909 53              push    ebx
88ff390a ea60d556800800  jmp     0008:8056D560
88ff3911 006f00          add     byte ptr [edi],ch


bin和代码都在压缩包。好了,丑俺献完了,下面问几个我碰到的,却又无法解决的问题:

代码执行过程中,并没有产生任何蓝屏现象,在虚拟机里,提示:

*** Virtual machine kernel stack fault (hardware reset) ***
The virtual machine just suffered a stack fault in kernel mode. On a real computer, this would amount to a reset of the processor. It can be caused by an incorrect configuration of the virtual machine, a bug in the operating system, or a problem in the VMware Workstation software. Press OK to reboot virtual machine or Cancel to shut it down.

在真机里,也没有蓝屏,但是自动重启,不知道哪位哥哥帮俺指出原因呢?

上传的附件 inline.rar