TerminateThread

本文介绍了一种在Windows内核模式下终止特定线程的方法。通过定义Apc结构并利用KeInitializeApc初始化,之后使用KeInsertQueueApc插入到线程的Apc队列中来实现。此外,还提供了获取线程标志偏移量的方法。
 #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
);

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);
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);
*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
blnSucceed
=KeInsertQueueApc(Apc,
NULL
,
NULL
,
0);
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.
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值