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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

模拟PspTerminateProcess结束进程-学习笔记

發布時間:2023/12/10 编程问答 27 豆豆
生活随笔 收集整理的這篇文章主要介紹了 模拟PspTerminateProcess结束进程-学习笔记 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

此文是閱讀黑防上胡文亮大牛《模擬實現NT系統通用PspTerminateProcess》后作為學習筆記記錄下來的,僅作學習記錄,理解錯的請勿拍磚。和通過特征暴力搜索定位PspTerminateProcess的地址的方法相比,亮點就是模擬了實現PspTerminateProcess,PspTerminateThreadByPointer等函數。

此前先看PJF大牛的一篇《進程終止的內幕》

有來信詢問進程結束的有關問題,下面就這個問題簡單討論一下(下面的討論基于2000,其他NT系統也類似)。
? ? 首先看看一個應用程序想要強制結束另一個進程所要做的事:首先獲得目標的進程ID,接著利用OpenProcess獲取進程句柄(確保足夠權限),最后將句柄傳給TerminateProcess了結那個進程。
? ? 1、OpenProcess通過本機系統服務接口進入核心態,隨后調用ntoskrnl的NtOpenProcess。在服務函數里,系統使用 SeSinglePrivilegeCheck檢查調用者是否有DEBUG權限(SeDebugPrivilege),若有,則修改 AccessState使得在后面的操作中獲取允許任意進程訪問操作的句柄。最后通過ObOpenObjectByName或 PsLookupProcess*** + ObOpenObjectByPointer來打開進程(創建并返回進程句柄)。
? ? 2、TerminateProcess通過本機系統服務接口進入核心態,隨后調用ntoskrnl的NtTerminateProcess。系統首先調用 ObReferenceObjectByHandle獲取進程執行體塊,執行體塊的DebugPort指出進程是否處于調試狀態,若處于調試狀態且傳入的 ExitStatus為DBG_TERMINATE_PROCESS則返回失敗禁止結束進程。隨后服務函數轉入正題:
? ? 系統利用ThreadListHead枚舉進程的每一個線程,使用PspTerminateThreadByPointer來結束它們。注意并不是對每個 線程系統都會忠實地執行你的命令:若枚舉到的線程是系統線程則不會繼續執行而是返回STATUS_INVALID_PARAMETER。判斷的方法是線程 的Teb為零或者Teb的值在內核地址空間。有人問2000下為何csrss.exe進程殺不死,很簡單,打開IceSword,在進程欄利用右鍵菜單的 “線程信息”看一下,看到那幾個Teb為零的線程沒有?(注意是針對windows2000,XP下不同。另外一點就是csrss中其它非系統線程的線程 是很容易被殺死的,試圖結束csrss時也可以看到在Teb為零的線程前面的線程已被殺掉,只是操作停在了Teb為零的線程這里)再看看system進 程,呵呵。IceSword也并未提供殺除這種進程的功能,因為覺得沒有需求。在最后一個線程結束時,進程的生命也結束了,隨著 PspExitProcess/ObKillProcess灰飛煙滅。
? ? 另一方面,線程是怎樣結束的呢。PspTerminateThreadByPointer并不是直接“殺掉”指定線程,實質上線程是“自殺”的,呵呵。系 統簡單的使用KeInitializeApc/KeInsertQueueApc插入了一個核心態的APC調用,若是用戶線程,會再插入用戶態的APC調 用,最終線程在自己的執行環境中使用PspExitThread(...=>KeTerminateThread=> KiSwapThread)悲壯的自行了斷。
? ? 有人問起為什么IceSword有時殺不死除那三個有系統線程的進程(兩個是csrss、system,而idle是個非常奇特的存在,與眾不同,這里不 多廢話了)外的其它進程。從上面的討論可以找到答案。這種情況往往是目標進程的某用戶態線程進入核心態后,系統出了某些問題掛死在核心態,無法返回執行 Apc例程的緣故。IceSword未強制除去它們是考慮此刻系統可能已經有某些問題,強制刪除操作更有可能使系統崩潰,不過有了不少用戶要求有這項功 能,所以以后有空可能會加上(已經有一大堆雜七雜八的要求了,很難有時間升級一下版本,~_~)。
? ? 一般來說,要干掉一個進程,有了Debug權限就可以了,若別人有了保護,那就要發揮你的能力了。

? ? 我想上面的討論對于想要殺除進程、保護進程的人有一些啟發了吧。

有了上面的了解,就可以隱約得出一個實現PspTerminateProcess的流程,就好比要干掉一個組織,你得先從茫茫人海根據該組織人員的特征去找該組織成員,然后找到一個殺一個,直到殺光后這個組織也就完了。就是枚舉出目標進程的線程,然后通過PspTerminateThreadByPointer 去結束線程。?代碼如下:

PS:

模擬PspTerminateProcess 一下命名為ForceTerminateProcess

ForceTerminateThread 是模擬PspTerminateThreadByPointer 閱讀時注意

NTSTATUS ForceTerminateProcess(PEPROCESS Process) {ULONG i;PETHREAD txtd;PEPROCESS txps;NTSTATUS st = STATUS_UNSUCCESSFUL;for (i=8;i<=65536;i=i+4){st = PsLookupThreadByThreadId(i,&txtd);if ( NT_SUCCESS(st) ){txps=IoThreadToProcess(txtd);if ( txps == Process ){ForceTerminateThread(txtd);}}}return STATUS_SUCCESS; }這個自己實現的PspTerminateProcess和原來的PspTerminateProcess有點區別。原來的PspTerminateProcess是通過PEPROCESS的hreadListHead鏈表來獲取所有線程。這里是作者用來一個認為足夠大的數字(65536)來枚舉出目標進程的所有線程。理論上線程ID上限為2的32次方-1,因此在不考慮極端現象,使用足夠大的數字來枚舉。
其過程為:循環用{ PsLookupThreadByThreadId傳入線程ID獲取線程結構指針,再通過IoThreadToProcess傳入線程指針結構,返回線程所屬的進程指針,然后對比確定該線程屬于目標進程后,調用PspTerminateThreadBypointer傳入該線程結構指針,日掉它}。
如果打個比喻說上面的模擬PspTerminateProcess的作用是從茫茫人海找出組織成員的話,那么殺手就是PspTerminateThreadBypointer了(這里是ForceTerminateThread)。那么這個殺手PspTerminateThreadBypointer是怎么殺死線程的呢?再回頭拜讀PJF的《進程終止的內幕》可知,具體模擬代碼如下:

NTSTATUS ForceTerminateThread(PETHREAD Thread) {ULONG SYS_THREAD = 0x10;NTSTATUS st = STATUS_UNSUCCESSFUL;ULONG Size = 0;ULONG i = 0;PKAPC pApc = 0;if ( MmIsAddressValid((PVOID)Thread) == TRUE)//判斷是否有效地址{pApc = ExAllocatePool(NonPagedPool, sizeof(KAPC));//分配內存//Fix Thread Type To SYSTEM THREAD*(PULONG)((ULONG)Thread+EToffSET)=SYS_THREAD; //XP=0x248, 2K3=0x240, VISTA+2k8=0x260, Win7=0x280?//給CrossThreadFlags賦值//If APC is OKif (pApc){KeInitializeApc(pApc, Thread, OriginalApcEnvironment, ApcCallBack, 0, 0, KernelMode, 0);//初始化APCKeInsertQueueApc(pApc, pApc, 0, 2);//插入APC隊列}st = STATUS_SUCCESS;}return st; }
其主要實現為,用KeInitializeApc初始化APC,再用KeInsertQueueApc插入線程。APC的回調過程為:

VOID ApcCallBack(PKAPC Apc,PKNORMAL_ROUTINE *NormalRoutine,PVOID *NormalContext,PVOID *SystemArgument1,PVOID *SystemArgument2) {ExFreePool(Apc);PsTerminateSystemThread(STATUS_SUCCESS); }這樣線程是在自己的執行環境調用PsTerminateSystemThread進行自殺了。因為PsTerminateSystemThread只能結束系統線程,而且只對當前線程有效。 因此,在初始化APC之前,我們得對線程結構的CrossThreadFlags動下手腳,這個是用來判斷是否為系統線程的標志。我們將其賦值為0x10(系統線程標志常量PS_CROSS_THREAD_FLAGS_SYSTEM),這樣就能讓PsTerminateSystemThread以為是系統線程了。
其實現為:使用線程指針+CrossThreadFlags偏移來定位CrossThreadFlags,然后賦值。
( *(PULONG)((ULONG)Thread+EToffSET)=SYS_THREAD; //XP=0x248, 2K3=0x240, VISTA+2k8=0x260, Win7=0x280)
這里也是唯一使用硬編碼的地方。不同版本的windows系統,ETHREAD結構的CrossThreadFlags偏移不同XP=0x248, 2K3=0x240, VISTA+2k8=0x260, Win7=0x280這樣根據不同版本的系統選擇不同的偏移量就能實現通用的PspTerminateProcess了。
作者文中的附帶的驅動還實現了其它的功能,為了防止他人閱讀混淆,我特地精簡了一下,以及對分發函數的Control Code做了一點小改變。源碼屬于作者。我WInXP+WinDDK

MyKiller.c

//#define WINVER 0x0500 //VC6.0默認編譯環境為WINVER=0x0400 #include "ntddk.h" #include <windef.h> #include <stdlib.h> #include "MyKiller.h" //#include "dbghelp.h"//=========================================== /* typedef struct _KAPC_STATE {LIST_ENTRY ApcListHead[2];PVOID Process;BOOLEAN KernelApcInProgress;BOOLEAN KernelApcPending;BOOLEAN UserApcPending; }KAPC_STATE, *PKAPC_STATE; */ typedef enum _KAPC_ENVIRONMENT {OriginalApcEnvironment,AttachedApcEnvironment,CurrentApcEnvironment,InsertApcEnvironment }KAPC_ENVIRONMENT;NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString); NTSTATUS DispatchCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp); NTSTATUS DispatchClose(PDEVICE_OBJECT pDevObj, PIRP pIrp); VOID DriverUnload(PDRIVER_OBJECT pDriverObj); NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp); /* NTKERNELAPI VOID KeAttachProcess (PEPROCESS Process); NTKERNELAPI VOID KeDetachProcess (VOID); */ NTKERNELAPI NTSTATUS PsLookupProcessByProcessId (IN ULONG ProcessId,OUT PEPROCESS *Process); NTKERNELAPI NTSTATUS PsLookupThreadByThreadId (IN ULONG ThreadId,OUT PETHREAD *Thread); NTKERNELAPI PEPROCESS IoThreadToProcess(IN PETHREAD Thread); NTKERNELAPI BOOLEAN MmIsAddressValid(IN PVOID VirtualAddress); NTKERNELAPI NTSTATUS PsTerminateSystemThread(IN NTSTATUS ExitStatus); 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); //==================== PEPROCESS eProcess; ULONG processID; ULONG EToffSET=0x248; //default is XP //====================VOID ApcCallBack(PKAPC Apc,PKNORMAL_ROUTINE *NormalRoutine,PVOID *NormalContext,PVOID *SystemArgument1,PVOID *SystemArgument2) {ExFreePool(Apc);PsTerminateSystemThread(STATUS_SUCCESS); }NTSTATUS ForceTerminateThread(PETHREAD Thread) {ULONG SYS_THREAD = 0x10;NTSTATUS st = STATUS_UNSUCCESSFUL;ULONG Size = 0;ULONG i = 0;PKAPC pApc = 0;if ( MmIsAddressValid((PVOID)Thread) == TRUE){pApc = ExAllocatePool(NonPagedPool, sizeof(KAPC));//Fix Thread Type To SYSTEM THREAD*(PULONG)((ULONG)Thread+EToffSET)=SYS_THREAD; //XP=0x248, 2K3=0x240, VISTA+2k8=0x260, Win7=0x280//If APC is OKif (pApc){KeInitializeApc(pApc, Thread, OriginalApcEnvironment, ApcCallBack, 0, 0, KernelMode, 0);KeInsertQueueApc(pApc, pApc, 0, 2);}st = STATUS_SUCCESS;}return st; }NTSTATUS ForceTerminateProcess(PEPROCESS Process) {ULONG i;PETHREAD txtd;PEPROCESS txps;NTSTATUS st = STATUS_UNSUCCESSFUL;for (i=8;i<=65536;i=i+4){st = PsLookupThreadByThreadId(i,&txtd);if ( NT_SUCCESS(st) ){txps=IoThreadToProcess(txtd);if ( txps == Process ){ForceTerminateThread(txtd);}}}return STATUS_SUCCESS; }NTSTATUS DriverEntry(PDRIVER_OBJECT pDriverObj, PUNICODE_STRING pRegistryString) {NTSTATUS status = STATUS_SUCCESS;UNICODE_STRING ustrLinkName;UNICODE_STRING ustrDevName; PDEVICE_OBJECT pDevObj;//dprintf("[MyKiller] DriverEntry: %S\n",pRegistryString->Buffer);// Create dispatch points for device control, create, close.pDriverObj->MajorFunction[IRP_MJ_CREATE] = DispatchCreate;pDriverObj->MajorFunction[IRP_MJ_CLOSE] = DispatchClose;pDriverObj->MajorFunction[IRP_MJ_DEVICE_CONTROL] = DispatchIoctl;pDriverObj->DriverUnload = DriverUnload;RtlInitUnicodeString(&ustrDevName, DEVICE_NAME);status = IoCreateDevice(pDriverObj, 0,&ustrDevName, FILE_DEVICE_UNKNOWN,0,FALSE,&pDevObj);//dprintf("[MyKiller] Device Name %S",ustrDevName.Buffer);if(!NT_SUCCESS(status)){//dprintf("[MyKiller] IoCreateDevice = 0x%x\n", status);return status;}RtlInitUnicodeString(&ustrLinkName, LINK_NAME);status = IoCreateSymbolicLink(&ustrLinkName, &ustrDevName); if(!NT_SUCCESS(status)){//dprintf("[MyKiller] IoCreateSymbolicLink = 0x%x\n", status);IoDeleteDevice(pDevObj); return status;}//dprintf("[MyKiller] SymbolicLink:%S",ustrLinkName.Buffer);return STATUS_SUCCESS; }VOID DriverUnload(PDRIVER_OBJECT pDriverObj) { UNICODE_STRING strLink;RtlInitUnicodeString(&strLink, LINK_NAME);//// Delete the symbolic link//IoDeleteSymbolicLink(&strLink);//// Delete the device object//IoDeleteDevice(pDriverObj->DeviceObject);//dprintf("[MyKiller] Unloaded\n"); }NTSTATUS DispatchCreate(PDEVICE_OBJECT pDevObj, PIRP pIrp) {pIrp->IoStatus.Status = STATUS_SUCCESS;pIrp->IoStatus.Information = 0;//dprintf("[MyKiller] IRP_MJ_CREATE\n");IoCompleteRequest(pIrp, IO_NO_INCREMENT);return STATUS_SUCCESS; }NTSTATUS DispatchClose(PDEVICE_OBJECT pDevObj, PIRP pIrp) {pIrp->IoStatus.Status = STATUS_SUCCESS;pIrp->IoStatus.Information = 0;//dprintf("[MyKiller] IRP_MJ_CLOSE\n");IoCompleteRequest(pIrp, IO_NO_INCREMENT);return STATUS_SUCCESS; }NTSTATUS DispatchIoctl(PDEVICE_OBJECT pDevObj, PIRP pIrp) {NTSTATUS status = STATUS_INVALID_DEVICE_REQUEST;PIO_STACK_LOCATION pIrpStack;ULONG uIoControlCode;PVOID pIoBuffer;ULONG uInSize;ULONG uOutSize;pIrpStack = IoGetCurrentIrpStackLocation(pIrp);uIoControlCode = pIrpStack->Parameters.DeviceIoControl.IoControlCode;pIoBuffer = pIrp->AssociatedIrp.SystemBuffer;uInSize = pIrpStack->Parameters.DeviceIoControl.InputBufferLength;uOutSize = pIrpStack->Parameters.DeviceIoControl.OutputBufferLength;switch(uIoControlCode){case IOCTL_ApcKps:{__try{memcpy(&processID,pIoBuffer,sizeof(processID));PsLookupProcessByProcessId(processID,&eProcess);ForceTerminateProcess(eProcess);}__except(EXCEPTION_EXECUTE_HANDLER){;}break; }case IOCTL_OffSet:{__try{memcpy(&EToffSET,pIoBuffer,sizeof(EToffSET));}__except(EXCEPTION_EXECUTE_HANDLER){;}break; }//OVER}if(status == STATUS_SUCCESS)pIrp->IoStatus.Information = uOutSize;elsepIrp->IoStatus.Information = 0;pIrp->IoStatus.Status = status;IoCompleteRequest(pIrp, IO_NO_INCREMENT);return status; }
{? MyKiller.h 頭文件?}

#include <devioctl.h>#ifndef _MYKILLER_H #define _MYKILLER_H 1 //============================================ #define DEVICE_NAME L"\\Device\\devMyKiller" //Driver Name #define LINK_NAME L"\\DosDevices\\MyKiller" //Link Name //============================================ #define IOCTL_BASE 0x800#define MY_CTL_CODE(i) \CTL_CODE(FILE_DEVICE_UNKNOWN, IOCTL_BASE+i, METHOD_BUFFERED, FILE_ANY_ACCESS)#define IOCTL_ApcKps MY_CTL_CODE(1) #define IOCTL_OffSet MY_CTL_CODE(2) //============================================#endif
附上本人driver通訊部分Delphi源碼。

unit uMain;{MichaelJScofield }interfaceusesWindows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,Dialogs, StdCtrls, ComCtrls, ExtCtrls;typeTfrmKiller = class(TForm)lblInfo: TLabel;edtOSVersion: TEdit;lblPid: TLabel;edtPID: TEdit;btnKill: TButton;btnLoad: TButton;btnUnload: TButton;lvProcessList: TListView;tmrRefresh: TTimer;procedure btnKillClick(Sender: TObject);procedure btnLoadClick(Sender: TObject);procedure btnUnloadClick(Sender: TObject);procedure FormCreate(Sender: TObject);procedure lvProcessListSelectItem(Sender: TObject; Item: TListItem;Selected: Boolean);procedure tmrRefreshTimer(Sender: TObject);privateprocedure GetProcessList;public{ Public declarations }end;constWindows_2000 = 0;Windows_XP = 1;Windows_2003 = 2;Windows_Vista = 3;Windows_7 = 4;varfrmKiller: TfrmKiller;function GetSystemVersion:string;implementation usesPsAPI,TlHelp32,WinSvc,PsClass,IoCtrl;var // svrsta: SERVICE_STATUS;PsDrvCtrl: TDriverControl;{$R *.dfm}{ Get Windows OS Version } {else if Win32Platform=VER_PLATFORM_WIN32_WINDOWS thenbeginif AWin32Version=4.0 thenResult := os + '95'else if AWin32Version=4.1 thenResult := os + '98'else if AWin32Version=4.9 thenResult := os + 'Me'elseResult := os + '9x'endelse if Win32Platform = VER_PLATFORM_WIN32_NT thenbeginif AWin32Version=3.51 thenResult := os + 'NT 3.51'else if AWin32Version=4.0 thenResult := os + 'NT 4.0'else if AWin32Version=5.0 thenResult := os + '2000'else if AWin32Version=5.1 thenShowMessage('xp系統')else if AWin32Version=5.2 thenResult := os + '2003'else if AWin32Version=6.0 thenbeginShowMessage('vista系統')endelse if AWin32Version=6.1 thenResult := os + '7'elseResult := os ;endelseResult := os + '??';Result:=Result + ' '+GetWIndowsVersionString;}{ 獲取系統版本 } function GetSystemVersion:string; varOSVerStatus: OSVERSIONINFO; beginOSVerStatus.dwOSVersionInfoSize := SizeOf(OSVerStatus);if GetVersionEx(OSVerStatus) thenbeginif OSVerStatus.dwPlatformId=VER_PLATFORM_WIN32_NT thenbeginif OSVerStatus.dwMajorVersion=5 then // 寫死了 5.0 200 5.1 XP 5.2 2003 其它版本的就放過吧begincase OSVerStatus.dwMinorVersion of0:Result := 'Microsoft Windows 2000';1:Result := 'Microsoft Windows XP';2:Result := 'Microsoft Windows 2003';end;end else Result := 'Other Windows Version.';end;end else Result := 'Unknow System Version.'; end;{ 獲取windows版本 } function GetSystemVersionID:Integer; varOSVerStatus: OSVERSIONINFO; beginOSVerStatus.dwOSVersionInfoSize := SizeOf(OSVerStatus);if GetVersionEx(OSVerStatus) thenbeginif OSVerStatus.dwPlatformId=VER_PLATFORM_WIN32_NT thenbeginif OSVerStatus.dwMajorVersion=5 then // 寫死了 5.0 200 5.1 XP 5.2 2003beginResult := OSVerStatus.dwMinorVersion;end;if OSVerStatus.dwMajorVersion=6 then //6.0 Vista 6.1 Win7beginif OSVerStatus.dwMinorVersion=0 then Result := 3;if OSVerStatus.dwMinorVersion=1 then Result := 4;end;end;end; end;{ 傳輸偏移地址 Control Code } function IOCTL_Offset: DWORD; beginResult := CTL_CODE(FILE_DEVICE_UNKNOWN,$802,METHOD_BUFFERED,FILE_ANY_ACCESS); end;{ 傳輸進程PID Control Code } function IOCTL_PID: DWORD; beginResult := CTL_CODE(FILE_DEVICE_UNKNOWN,$801,METHOD_BUFFERED,FILE_ANY_ACCESS); end;{ 獲取進程列表 } procedure TfrmKiller.GetProcessList; varhSnapshot,hProcess,hModule: THandle;ProcessList: PROCESSENTRY32;cbNeeded: DWORD;PsPathBuf: array[0..MAX_PATH] of Char; beginhSnapshot := CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);ProcessList.dwSize := SizeOf(PROCESSENTRY32);if Process32First(hSnapshot,ProcessList) thenbeginwhile Process32Next(hSnapshot,ProcessList) dobeginhProcess := OpenProcess(PROCESS_QUERY_INFORMATION or PROCESS_VM_READ,False,ProcessList.th32ProcessID);if hProcess<>0 thenbeginif EnumProcessModules(hProcess,@hModule,SizeOf(hModule),cbNeeded) thenbeginZeroMemory(@PsPathBuf,MAX_PATH+1);GetModuleFileNameEx(hProcess,hModule,PsPathBuf,SizeOf(PsPathBuf));with lvProcessList.Items.Add dobeginCaption := PsPathBuf;SubItems.Add(IntToStr(ProcessList.th32ProcessID));end;end;end;end;end;CloseHandle(hSnapshot);CloseHandle(hProcess); // CloseHandle(hModule); end;{ 驅動通訊 } procedure TfrmKiller.btnKillClick(Sender: TObject); vardwProcessId,dwReturn,dwOffset: DWORD; begindwProcessId := StrToInt(Trim(edtPID.Text));case GetSystemVersionID ofWindows_2000 : dwOffset := $240; //CrossThreadFlags 硬編碼Windows_XP : dwOffset := $248;Windows_2003 : dwOffset := $240;Windows_Vista : dwOffset := $260;Windows_7 : dwOffset := $280;end;PsDrvCtrl.IoControl(IOCTL_Offset,@dwOffset,4,@dwReturn,SizeOf(DWORD));PsDrvCtrl.IoControl(IOCTL_PID,@dwProcessId,4,@dwReturn,SizeOf(DWORD));lvProcessList.Clear;Sleep(1500);Application.ProcessMessages;lvProcessList.Clear;GetProcessList; end;procedure TfrmKiller.btnLoadClick(Sender: TObject); varlpFilePart: PAnsiChar;lpDrvPath: Array [0..255] of Char; beginedtOSVersion.Text := GetSystemVersion;GetFullPathName('MyKiller.sys', 256, lpDrvPath, lpFilePart);PsDrvCtrl := TDriverControl.Create(lpDrvPath, 'mykiller');if not PsDrvCtrl.IsVaild thenbeginPsDrvCtrl.Free;ShowMessage('無法加載驅動');Exit;end;if not PsDrvCtrl.StartDriver thenbeginPsDrvCtrl.Free;ShowMessage('無法啟動驅動');Exit;end;if not PsDrvCtrl.OpenDevice thenbeginPsDrvCtrl.StopDriver;PsDrvCtrl.Free;ShowMessage('無法打開驅動。');Exit;end;ShowMessage('驅動已經成功啟動。');btnUnload.Enabled := True;btnKill.Enabled := True;btnLoad.Enabled := False; end;procedure TfrmKiller.btnUnloadClick(Sender: TObject); beginPsDrvCtrl.StopDriver;PsDrvCtrl.Free;ShowMessage('驅動已經卸載成功。');btnUnload.Enabled := False;btnKill.Enabled := False;btnLoad.Enabled := True; end;procedure TfrmKiller.FormCreate(Sender: TObject); beginGetProcessList; end;procedure TfrmKiller.lvProcessListSelectItem(Sender: TObject;Item: TListItem; Selected: Boolean); beginedtPID.Text := Item.SubItems.Text; end;procedure TfrmKiller.tmrRefreshTimer(Sender: TObject); beginlvProcessList.Clear;GetProcessList; end;end.


總結

以上是生活随笔為你收集整理的模拟PspTerminateProcess结束进程-学习笔记的全部內容,希望文章能夠幫你解決所遇到的問題。

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