网管联盟 | 网管论坛 | 网管u家 | 网管博客 | 网管软件 | 网管求职 | 小游戏 | 网管搜索 | 网管原创 | 网管聚合 | 网管读摘 | 网管焦点 | 世界素材 | 会员投稿 | 会员中心 
中国网管联盟
Windows Linux Cisco 网络技术 数据库 黑客攻防 DotNet Java PHP 认证 新闻资讯 服务器 存储资讯 网络设备 网管学堂 技术专题 焦点 网吧频道
 当前位置: > bitsCN.com > 网络攻防 > 安全文摘 > 共享杀线程的代码  

共享杀线程的代码

2008-04-17  作者:bitsCN整理  来源:中国网管联盟  点评 投稿 收藏

/*
        TerminateThread.c
               
*/

#include "ntddk.h"
#include "LDasm.h" //网上很多的,自己找一个好了。

typedef enum _KAPC_ENVIRONMENT {
  originalApcEnvironment,
  AttachedApcEnvironment,
  CurrentApcEnvironment,
  InsertApcEnvironment
} KAPC_ENVIRONMENT;

NTKERNELAPI
VOID
KeInitializeApc (
         PKAPC Apc,
         PETHREAD Thread,
         KAPC_ENVIRONMENT Environment,
         PKKERNEL_ROUTINE KernelRoutine,
         PKRUNDOWN_ROUTINE RundownRoutine,
         PKNORMAL_ROUTINE NormalRoutine,
         KPROCESSOR_MODE ProcessorMode,
         PVOID NormalContext 网管bitscn_com
         );

NTKERNELAPI
BOOLEAN
KeInsertQueueApc (
         PKAPC Apc,
         PVOID SystemArgument1,
         PVOID SystemArgument2,
         KPRIORITY Increment
         );  

#define PS_CROSS_THREAD_FLAGS_SYSTEM 0x00000010UL

ULONG GetThreadFlagsOffset()
{
  UCHAR *cPtr, *pOpcode;
  ULONG Length;
  USHORT Offset;

  for (cPtr = (PUCHAR)PsTerminateSystemThread;
    cPtr < (PUCHAR)PsTerminateSystemThread + 0x100;
    cPtr += Length)
  {
    Length = SizeOfCode(cPtr, &pOpcode);

    if (!Length) break;  
    if (*(USHORT *)pOpcode == 0x80F6) //f6804802000010 test byte ptr [eax+248h],10h
    {
      Offset=*(USHORT *)((ULONG)pOpcode+2);

网管联盟bitsCN@com


      return Offset;
      //break;
    }
  }
  return 0;
}

VOID KernelTerminateThreadRoutine(
                 IN PKAPC Apc,
                 IN OUT PKNORMAL_ROUTINE *NormalRoutine,
                 IN OUT PVOID *NormalContext,
                 IN OUT PVOID *SystemArgument1,
                 IN OUT PVOID *SystemArgument2
                 )
{
  ULONG ThreadFlagsOffset=GetThreadFlagsOffset();
  PULONG ThreadFlags;
  DbgPrint("[TerminateThread] KernelTerminateThreadRoutine.\n");
  ExFreePool(Apc);
  if (ThreadFlagsOffset)
  {
    ThreadFlags=(ULONG *)((ULONG)(PsGetCurrentThread())+ThreadFlagsOffset);

网管网www.bitscn.com


    *ThreadFlags=(*ThreadFlags)|PS_CROSS_THREAD_FLAGS_SYSTEM;
    PsTerminateSystemThread(STATUS_SUCCESS); //o(∩_∩)o
  }
  else
  {
    //failed
  }
  return; //never be here
}

BOOLEAN TerminateThread(PETHREAD Thread)
{
  PKAPC Apc=NULL;
  BOOLEAN blnSucceed=FALSE;
  if (!MmIsAddressValid(Thread)) return FALSE; //error.
  Apc=ExAllocatePool(NonPagedPool,sizeof(KAPC));
  KeInitializeApc(Apc,
    Thread,
    originalApcEnvironment,
    KernelTerminateThreadRoutine,
    NULL,
    NULL,
    KernelMode,
    NULL); //special apc - whether alertable or not makes no difference..
  blnSucceed=KeInsertQueueApc(Apc,
    NULL,
    NULL,
    0);
  //add some code works like KeForceResumeThread here. 网管论坛bbs_bitsCN_com
  return blnSucceed;
}

VOID DriverUnload(PDRIVER_OBJECT pDriverObj)
{  
  DbgPrint("[TerminateThread] Unloaded\n");
}

NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString)
{
  DbgPrint("[TerminateThread] DriverEntry.\n");
  TerminateThread((PETHREAD)0xff6f3c70); // for test
  pDriverObj->DriverUnload = DriverUnload;
  return STATUS_SUCCESS; //do NOT return an unsuccessful value here, or you need to wait for apc routine return.
}

TAGs   代码   共享       Apc   return   PVOID   ULONG   NULL   "      
 上一篇:IE8测试版不能升级的解决技巧   下一篇:介绍系统自带的超强杀毒工具
共享杀线程的代码 评论:
loading.. 评论加载中…
评论:请自觉遵守互联网相关政策法规,评论不得超过250字。

验证码: 注册用户
本类热门排行:
最新推荐文章:
网管论坛交流: