欢迎访问 生活随笔!

生活随笔

当前位置: 首页 > 编程资源 > 编程问答 >内容正文

编程问答

Win64 驱动内核编程-26.强制结束进程

发布时间:2025/6/17 编程问答 9 豆豆
生活随笔 收集整理的这篇文章主要介绍了 Win64 驱动内核编程-26.强制结束进程 小编觉得挺不错的,现在分享给大家,帮大家做个参考.

强制结束进程

    依然已经走到驱动这一层了,那么通常结束掉一个进程不是什么难的事情。同时因为win64 位的各种保护,导致大家慢慢的已经不敢HOOK了,当然这指的是产品。作为学习和破解的话当然可以尝试各种hook。目前来说很多杀软进程保护都是通过回调了保护的,简单,稳定,安全。So,强制结束进程会比当年简单很多。

首先就是上一个最基本的驱动里结束进程的方法:

 

1.直接调用ZwTerminateProcess去结束进程,这个是公开导出的函数,也就是说它很稳定。不要小看这个东西,我测试过很多杀软。目前停不掉的只有国外的 某伞,可能有人会关心国内的各种卫士能不能停掉!我觉得可以尝试一下,通常不会失望。OK不废话,上代码:

TerminateProcess ->NtTerminateProcess ->ZwTerminateProcessvoid ZwKillProcess(HANDLE hdPid) { __try {HANDLE hProcess = NULL;CLIENT_ID ClientId = {0};OBJECT_ATTRIBUTES oa = {0};ClientId.UniqueProcess = (HANDLE)hdPid; ClientId.UniqueThread = 0;oa.Length = sizeof(oa);oa.RootDirectory = 0;oa.ObjectName = 0;oa.Attributes = 0;oa.SecurityDescriptor = 0;oa.SecurityQualityOfService = 0;ZwOpenProcess(&hProcess, 1, &oa, &ClientId);if (hProcess){ZwTerminateProcess(hProcess, 0);ZwClose(hProcess);};}__except (EXCEPTION_EXECUTE_HANDLER){;}}

2.方法2就是通过PsTerminateSystemThread找到PspTerminateThreadByPointer

 

下面是Win7 64 双机调试 windbg获取的信息


    然后要找到Win7 64PspTerminateThreadByPointer结构(注意下面的是win7 64每个系统要单独去找):

typedef NTSTATUS (__fastcall *PSPTERMINATETHREADBYPOINTER) ( IN PETHREAD Thread, IN NTSTATUS ExitStatus, IN BOOLEAN DirectTerminate );

    然后就是定位一个特征码,从PsTerminateSystemThread开始往下找,直接把学习资料的代码拿过来吧,作者是定位了01e8也就是两条汇编指令相关的部分。然后自定义了一个计算公式hash这个特征码,代码如下(这个地方不固定,定位的越长,越准确):

if(PspTerminateThreadByPointer==NULL) {AddressOfPsTST=(ULONG64)GetFunctionAddr(L"PsTerminateSystemThread");if(AddressOfPsTST==0)return STATUS_UNSUCCESSFUL;for(i=1;i<0xff;i++){if(MmIsAddressValid((PVOID)(AddressOfPsTST+i))!=FALSE){if(*(BYTE*)(AddressOfPsTST+i)==0x01&&*(BYTE*)(AddressOfPsTST+i+1)==0xe8) //目标地址-原始地址-5=机器码 ==> 目标地址=机器码+5+原始地址{RtlMoveMemory(&callcode,(PVOID)(AddressOfPsTST+i+2),4);AddressOfPspTTBP=(ULONG64)callcode + 5 + AddressOfPsTST+i+1;}}} PspTerminateThreadByPointer=(PSPTERMINATETHREADBYPOINTER)AddressOfPspTTBP;}

    找到函数位置之后,剩下的可以直接枚举线程id,找到进程id,通过进程id进行对比之后决定是否结束掉这个线程。

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);} }

3.第三种方式就是强行切到对方内存里,然后直接 进程虚拟内存擦除(这个自己也会退出,但是可以继续打开新进程链接服务干活,或者擦除的时候就直接启动一个擦除进程):

BOOLEAN ZeroKill(ULONG PID) //X32 X64 {NTSTATUS ntStatus = STATUS_SUCCESS;int i = 0;PVOID handle;PEPROCESS Eprocess;ntStatus = PsLookupProcessByProcessId(PID, &Eprocess);if (NT_SUCCESS(ntStatus)){PKAPC_STATEpKs=(PKAPC_STATE)ExAllocatePool(NonPagedPool, sizeof(PKAPC_STATE));KeStackAttachProcess(Eprocess , pKs);//Attach进程虚拟空间for (i = 0; i <= 0x7fffffff; i += 0x1000){if (MmIsAddressValid((PVOID)i)){_try{ProbeForWrite((PVOID)i,0x1000,sizeof(ULONG));memset((PVOID)i,0xcc,0x1000);}_except(1){continue;}}else{if (i>0x1000000) //填这么多足够破坏进程数据了 break;}}KeUnstackDetachProcess(pKs);if (ObOpenObjectByPointer((PVOID)Eprocess, 0, NULL, 0, NULL, KernelMode, &handle) != STATUS_SUCCESS)return FALSE;ZwTerminateProcess((HANDLE)handle, STATUS_SUCCESS);ZwClose((HANDLE)handle);return TRUE;}return FALSE; }

总结

以上是生活随笔为你收集整理的Win64 驱动内核编程-26.强制结束进程的全部内容,希望文章能够帮你解决所遇到的问题。

如果觉得生活随笔网站内容还不错,欢迎将生活随笔推荐给好友。