znsoft
管理员
管理员
  • 注册日期2001-03-23
  • 最后登录2023-10-25
  • 粉丝300
  • 关注6
  • 积分910分
  • 威望14796点
  • 贡献值7点
  • 好评度2410点
  • 原创分5分
  • 专家分100分
  • 社区居民
  • 最爱沙发
  • 社区明星
阅读:2253回复:1

PspTerminateThreadByPointer 函数的实现 [zt]

楼主#
更多 发布于:2008-04-09 11:34
[note]嗯,PspTerminateThreadByPointer没有改变2008/02/02 13:06用Windbg看了遍PspTerminateThreadByPointer,发现和WRK上的一样.哈哈,没有任何出入.这样自己实现起来就方便咯.

btw: XP SP2下是2个参数

NTSTATUS
PspTerminateThreadByPointer(
     IN PETHREAD Thread,
     IN NTSTATUS ExitStatus,
     IN BOOLEAN DirectTerminate
     )
{
     NTSTATUS Status;
     PKAPC     ExitApc=NULL;
    ULONG     OldMask;

     PAGED_CODE();

    if (Thread->CrossThreadFlags
     & PS_CROSS_THREAD_FLAGS_BREAK_ON_TERMINATION) {
       PspCatchCriticalBreak("Terminating critical thread 0x%p (in %s)\n",
                 Thread,
                 THREAD_TO_PROCESS(Thread)->ImageFileName);
     }

    if (DirectTerminate && Thread == PsGetCurrentThread()) {

        ASSERT (KeGetCurrentIrql() < APC_LEVEL);

         PS_SET_BITS (&Thread->CrossThreadFlags, PS_CROSS_THREAD_FLAGS_TERMINATED);

        PspExitThread (ExitStatus);

     } else {
        // 10h
        // 嘿嘿,若thread的flag中有PS_CROSS_THREAD_FLAGS_SYSTEM, 就pass了. =。=||
        if (IS_SYSTEM_THREAD (Thread)) {
            return STATUS_ACCESS_DENIED;
         }

         Status = STATUS_SUCCESS;

        while (1) {
             ExitApc = (PKAPC) ExAllocatePoolWithTag (NonPagedPool,
                                                     sizeof(KAPC),
                                                      'xEsP');
            if (ExitApc != NULL) {
                break;
             }
             KeDelayExecutionThread(KernelMode, FALSE, &ShortTime);
         }

        // Mark the thread as terminating and call the exit function.
        OldMask = PS_TEST_SET_BITS (&Thread->CrossThreadFlags, PS_CROSS_THREAD_FLAGS_TERMINATED);// 01h

        // 若之前没有设置过关闭标志,那就插个APC
        if ((OldMask & PS_CROSS_THREAD_FLAGS_TERMINATED) == 0) {

             KeInitializeApc (ExitApc,
                              PsGetKernelThread (Thread),
                              OriginalApcEnvironment,
                              PsExitSpecialApc,
                              PspExitApcRundown,
                              PspExitNormalApc,
                              KernelMode,
                              ULongToPtr (ExitStatus));

            if (!KeInsertQueueApc (ExitApc, ExitApc, NULL, 2)) {
                // 看来可以在KeInsertQueueApc上做手脚啦。
                 ExFreePool (ExitApc);
                 Status = STATUS_UNSUCCESSFUL;
             } else {
      
                KeForceResumeThread (&Thread->Tcb);
             }
         } else {
             ExFreePool (ExitApc);
         }
     }

    return Status;
}


是自身线程就直接调用PspExitThread,其他情况就插APC。。。

btw:炉子半年前就把这些弄透了,俺现在才开始学习。差距啊
 
http://www.zndev.com 免费源码交换网 ----------------------------- 软件创造价值,驱动提供力量! 淡泊以明志,宁静以致远。 ---------------------------------- 勤用搜索,多查资料,先搜再问。
wowocock
VIP专家组
VIP专家组
  • 注册日期2002-04-08
  • 最后登录2016-01-09
  • 粉丝16
  • 关注2
  • 积分601分
  • 威望1651点
  • 贡献值1点
  • 好评度1227点
  • 原创分1分
  • 专家分0分
沙发#
发布于:2008-04-09 12:13
实现一个函数不难,难的是实现所有的函数.32位下HOOK无极限,随便一个HOOK,都够你从WRK里CTRL C ,CTRL V 半天的了.
花开了,然后又会凋零,星星是璀璨的,可那光芒也会消失。在这样 一瞬间,人降生了,笑者,哭着,战斗,伤害,喜悦,悲伤憎恶,爱。一切都只是刹那间的邂逅,而最后都要归入死亡的永眠
游客

返回顶部