能力值:
( LV3,RANK:20 )
|
-
-
2 楼
挂起线程。类似于“挂起进程”,唯一的差别是没有导出函数可用了。可以自行定位 PsSuspendThread,它的原型如下NTSTATUS PsSuspendThread (IN PETHREAD Thread, //线程 ETHREAD OUT PULONG PreviousSuspendCount OPTIONAL) //挂起的次数,每挂起一次此值增 1
结束线程。结束线程的标准方法是 ZwOpenThread+ZwTerminateThread+ZwClose,暴力方法 是直接调用 PspTerminateThreadByPointer。暴力方法在后面的课程里讲,这里先讲标准方法。 由于 ZwTerminateThread 没有导出,所以只能先硬编码了(在 WINDBG 里使用 x 命令获得地 址:x nt!ZwTerminateThread): typedef NTSTATUS (__fastcall *ZWTERMINATETHREAD)(HANDLE hThread, ULONG uExitCode); ZWTERMINATETHREAD ZwTerminateThread=0Xfffff80012345678; //要修改这个值 //正规方法结束线程 void ZwKillThread() { HANDLE hThread = NULL; CLIENT_ID ClientId; OBJECT_ATTRIBUTES oa; //填充 CID ClientId.UniqueProcess =0; ClientId.UniqueThread = (HANDLE)1234; //这里修改为你要的 TID //填充 OA oa.Length = sizeof(oa); oa.RootDirectory = 0; oa.ObjectName = 0; oa.Attributes = 0; oa.SecurityDescriptor = 0; oa.SecurityQualityOfService = 0; //打开进程,如果句柄有效,则结束进程 ZwOpenProcess(&hThread,1,&oa,&ClientId); if(hThread) { ZwTerminateThread(hThread,0); ZwClose(hThread); }; }
//根据线程 ID 返回线程 ETHREAD,失败返回 NULL PETHREAD LookupThread(HANDLE Tid) { PETHREAD ethread; if( NT_SUCCESS(PsLookupThreadByThreadId(Tid, ðread)) ) return ethread; else }
|
能力值:
( LV1,RANK:0 )
|
-
-
3 楼
_DriverEntry
挂起线程。类似于“挂起进程”,唯一的差别是没有导出函数可用了。可以自行定位 PsSuspendThread,它的原型如下NTSTATUS PsSuspendThread
(IN PETHREAD T ...
测试过了 蓝屏
|
能力值:
( LV1,RANK:0 )
|
-
-
4 楼
搞定了 IDA 载入NTOSKRNL.EXE 查找PsSuspendProcess找到PsSuspendThread地址即可暂停.
|
能力值:
( LV1,RANK:0 )
|
-
-
5 楼
是哪个驱动又惨遭暂停线程的祸害了
|
|
|