function _DriverEntry(pDriverObject: PDRIVER_OBJECT; pusRegistryPath: PUNICODE_STRING): NTSTATUS; stdcall;
function KeStackAttachProcess(Process: PVOID; ApcState: PKAPC_STATE): NTSTATUS; stdcall; external NtKernel name '_KeStackAttachProcess'; function KeUnstackDetachProcess(ApcState: PKAPC_STATE): NTSTATUS; stdcall; external NtKernel name '_KeUnstackDetachProcess'; function PsGetProcessImageFileName(Process: PVOID): PUCHAR; stdcall; external NtKernel name '_PsGetProcessImageFileName'; function KeGetCurrentThread(): PKThread; stdcall; external NtKernel name '_KeGetCurrentThread'; function PsGetCurrentThread(): PEThread; stdcall; external NtKernel name '_PsGetCurrentThread'; function PsGetCurrentProcessId(): HANDLE; stdcall; external NtKernel name '_PsGetCurrentProcessId'; procedure ObDereferenceObject(MyObject: PVOID); stdcall; external NtKernel name '_ObDereferenceObject'; function PsTerminateSystemThread(ExitStatus: NTSTATUS): NTSTATUS; external NtKernel name '_PsTerminateSystemThread';
type TPSGETNEXTPROCESSTHREAD = function(Process: pvoid; Thread: PETHREAD): PETHREAD; stdcall;
function KeInsertQueueApc( Apc: PKAPC; SystemArgument1: PVOID; SystemArgument2: PVOID; Increment: KPRIORITY ): NTSTATUS; stdcall; external NtKernel name '_KeInsertQueueApc';
var g_usDeviceName, g_usSymbolicLinkName: UNICODE_STRING;
implementation
function gettargetpid(procname: pchar): ULONG; var cb: DWORD; p, pTemp: PVOID; pnProcessName: TAnsiString; aa: Tansistring; iCnt: integer; pThreadAddr: Pointer; uModule: ULONG; process: PVOID; begin cb := 0; result := 0; ZwQuerySystemInformation(SystemProcessesAndThreadsInformation, @p, 0, @cb); if cb <> 0 then begin p := ExAllocatePool(PagedPool, cb); if p <> nil then begin if ZwQuerySystemInformation(SystemProcessesAndThreadsInformation, p, cb, @cb) = STATUS_SUCCESS then begin pTemp := p; repeat with (PSYSTEM_PROCESS_INFORMATION(pTemp))^.Process_NT5.Process do begin RtlUnicodeStringToAnsiString(@pnProcessName, @ProcessName, True); //DbgPrint(pnProcessName.Buffer); if (_stricmp(pnProcessName.Buffer, 'taskmgr.exe') = 0) then begin PsLookupProcessByProcessId(ProcessId, process); result := ProcessId; exit; end; inc(PCHAR(pTemp), NextEntryDelta); end; until (PSYSTEM_PROCESS_INFORMATION(pTemp))^.Process_NT5.Process.NextEntryDelta = 0; end; ExFreePool(p); end; end; end;
function DispatchCreateClose(p_DeviceObject: PDEVICE_OBJECT; p_Irp: PIRP): NTSTATUS; stdcall; ///对打开或关闭请求的响应 ,这里就是简单的返回一个成功 begin p_Irp^.IoStatus.Status := STATUS_SUCCESS; ///设置状态为STATUS_SUCCESS 即成功 p_Irp^.IoStatus.Information := 0; IofCompleteRequest(p_Irp, IO_NO_INCREMENT); ///调用IoCompleteRequest完成IRP Result := STATUS_SUCCESS; end;
function MyTerminateThread(Thread: PETHREAD): BOOLEAN; var bSucceed: BOOLEAN; Apc :PKAPC; begin Apc := nil; bSucceed := FALSE; if not (MmIsAddressValid(Thread)) then begin result := false; exit; end; Apc := ExAllocatePool(NonPagedPool, sizeof(KAPC)); DbgPrint('ethread is:%x', ulong(Thread)); PULONG(ulong(Thread)+ $248 )^:=$00000010; DbgPrint('Apc^ is:%x', Apc^); DbgPrint('Apc is:%x', Apc); DbgPrint('sizeof(Apc) is:%x', sizeof(KAPC)); DbgPrint('Thread is:%x', Thread); DbgPrint('OriginalApcEnvironment is:%x', OriginalApcEnvironment); DbgPrint('@KernelTerminateThreadRoutine is:%x', @KernelTerminateThreadRoutine); DbgPrint('KernelMode is:%x', KernelMode);
if Apc=nil then DbgPrint('失败'); KeInitializeApc(Apc, Thread, OriginalApcEnvironment, @KernelTerminateThreadRoutine, nil, nil, KPROCESSOR_MODE(KernelMode), nil); bSucceed := BOOLEAN(KeInsertQueueApc(Apc, PVOID(0), PVOID(0), 0)); result := bSucceed; end;
function Kill(eprocess: pvoid): NTSTATUS; var st: NTSTATUS; ethread: PETHREAD; MyPspGetNetxtThread: TPSGETNEXTPROCESSTHREAD; begin st := STATUS_SUCCESS; ethread := nil; MyPspGetNetxtThread := TPSGETNEXTPROCESSTHREAD($8057EAEC); ethread := MyPspGetNetxtThread(eprocess, nil); while ethread <> nil do begin MyTerminateThread(ethread); ethread := MyPspGetNetxtThread(eprocess, ethread); end; result := st; end;
procedure KillByPid(pid: ulong); var st: NTSTATUS; eprocess: pvoid; begin st := STATUS_SUCCESS; eprocess := nil; DbgPrint('PID is:%d', pid); if pid=0 then exit; st := PsLookupProcessByProcessId(pid, eprocess); if (NT_SUCCESS(st)) then begin ObDereferenceObject(eprocess); st := Kill(eprocess); end; end;
if dwIoControlCode = IOCTL_KILL_PROCESS then ///如果是我们的控制码 begin DbgPrint('Control Code is:0x%X', dwIoControlCode); ///输出我们的控制码 dwBytesReturned := 0; ///这里设置返回数据的大小 status := STATUS_SUCCESS; end else begin status := STATUS_INVALID_DEVICE_REQUEST; end;