ywledoc 发表于 2011-3-21 21:25:46

果断被hook KiSwapContext打败了

   if (*NtBuildNumber <= 2195)
   Status = PsLookupThreadByThreadId((PVOID)4, &(PETHREAD)Thread);
   else
   Status = PsLookupThreadByThreadId((PVOID)8, &(PETHREAD)Thread);

   if (NT_SUCCESS(Status))
   {
   if (MmIsAddressValid(Thread))
   {
       res = (PCHAR)(Thread->Tcb.KernelStack);

   }
   if (MmIsAddressValid(res+8))
   {
       _asm
       {
         mov eax,res
         add eax,8
         mov eax,
         mov res,eax
       }
   }
   else
   {
       res = 0;
       return NULL;
   }
   }
   _asm
   {
   mov eax,res
       sub eax,5
       mov ChangAddr,eax
       mov edx,
       mov CallContextOffset,edx
       add eax,edx
       add eax,5
       mov GoBackAddr,eax
       mov res,eax
   }
总之我不知道网上怎么能成功运行,反正我的电脑在红色那行,BSOD~KernelStack根本不可读~

Tesla.Angela 发表于 2011-3-21 21:43:06

我记得论坛以前有人发过hook KiSwapContext的完整代码,我以前也有,前段时间下游戏时空间不够,一怒之下把收集的驱动代码都TMD删除了,估计hook KiSwapContext的完整代码也永远消失了。
另外我依稀记得,hook KiSwapContext对系统的依赖是很大的。

ywledoc 发表于 2011-3-21 22:29:37

回复 Tesla.Angela 的帖子

1.完整代码我也有啊。我先是自己写,得不到正确地址。然后再用网上给的完整代码,还是不行~
2.对系统依赖性?根据网上的原理来说,得到KiSwapContext的地址是无关依赖性的,因为是从KernelStack中得到。
3.什么游戏啊???这么大?

ywledoc 发表于 2011-3-22 18:58:26

找到原因了,PsLookupThreadByThreadId不能成功调用。

ywledoc 发表于 2011-3-23 13:14:14


#include <ntddk.h>

NTSTATUS
DriverEntry(        PDRIVER_OBJECT        DriverObject,
                PUNICODE_STRING        RegistryPath
        );

NTSTATUS
PsLookupThreadByThreadId(
    __in HANDLE ThreadId,
    __deref_out PETHREAD *Thread
    );

#pragma alloc_text(INIT, DriverEntry)

/*
kd> dt _ethread
nt!_ETHREAD
   +0x000 Tcb            : _KTHREAD
        ...
   +0x220 ThreadsProcess   : Ptr32 _EPROCESS

kd> dt _KTHREAD
nt!_KTHREAD
   +0x000 Header         : _DISPATCHER_HEADER
        ...
   +0x020 Teb            : Ptr32 Void
        ...
   +0x028 KernelStack      : Ptr32 Void
*/



ULONG        GoBackAddr;
ULONG        CallContextOffset;
ULONG        ChangAddr;


PCHAR GetSwapAddr()
{
        NTSTATUS        Status;
        PVOID                Thread;
        PCHAR                 res = 0;
       
        Status = PsLookupThreadByThreadId((PVOID)8, &Thread);
        KdBreakPoint();

        if (NT_SUCCESS(Status))
        {
                if (MmIsAddressValid(Thread))
                        res = (PCHAR)(*(ULONG*)((ULONG)(Thread)+0x28));
                if (MmIsAddressValid(res+8))
                        res = (PCHAR)*(ULONG*)(res+8);
                else
                res = 0;
        }

        return res;
}


VOID
DriverUnload()
{}


NTSTATUS
DriverEntry(        PDRIVER_OBJECT        DriverObject,
                PUNICODE_STRING        RegistryPath
        )
{
        NTSTATUS        ntStatus;
        HANDLE                hThread;
        PCHAR                ret;
       
        DriverObject->DriverUnload = DriverUnload;
       
        ret = GetSwapAddr();-------ret == 0x80541c02----指向下方红色那行代码------->
nt!KiSwapContext:
80541bd4 83ec10          sub   esp,10h
80541bd7 895c240c      mov   dword ptr ,ebx
80541bdb 89742408      mov   dword ptr ,esi
80541bdf 897c2404      mov   dword ptr ,edi
80541be3 892c24          mov   dword ptr ,ebp
80541be6 8b1d1cf0dfff    mov   ebx,dword ptr ds:
80541bec 8bf1            mov   esi,ecx
80541bee 8bbb24010000    mov   edi,dword ptr
80541bf4 89b324010000    mov   dword ptr ,esi
80541bfa 8a4f58          mov   cl,byte ptr
80541bfd e8ce000000      call    nt!SwapContext (80541cd0)
80541c02 8b2c24          mov   ebp,dword ptr
80541c05 8b7c2404      mov   edi,dword ptr
80541c09 8b742408      mov   esi,dword ptr
80541c0d 8b5c240c      mov   ebx,dword ptr
80541c11 83c410          add   esp,10h
80541c14 c3            ret
/*以下省略*/
}

Tesla.Angela 发表于 2011-3-23 18:18:44

恭喜楼主自行解决问题。

Tesla.Angela 发表于 2011-4-2 23:09:27

回复 ywledoc 的帖子

他是说你能自行解决问题很强大。

ywledoc 发表于 2011-4-2 23:16:22

回复 Tesla.Angela 的帖子

it's a question~~~

Tesla.Angela 发表于 2011-4-3 10:23:47

回复 ywledoc 的帖子

神马question?

kk1025 发表于 2013-4-10 21:22:51

ywledoc 发表于 2011-3-23 13:14 static/image/common/back.gif
#include

NTSTATUS


收藏
页: [1]
查看完整版本: 果断被hook KiSwapContext打败了