日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

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

编程问答

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

發布時間:2025/6/17 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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.强制结束进程的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。