您的位置:首页 > 编程语言

ProcessHacker工具中对于进程结束的具体实现代码:

2012-07-27 21:56 2281 查看
Process Hacker工程下面Process Hacker目录下面termator.c文件里面。

ProcessHacker工具中对于进程结束的具体实现代码:

static NTSTATUS NTAPI TerminatorTP1(

__in HANDLE ProcessId

)

{

NTSTATUS status;

HANDLE processHandle;

if (NT_SUCCESS(status = PhOpenProcess(

&processHandle,

PROCESS_TERMINATE,

ProcessId

)))

{

// Don't use KPH.

status = NtTerminateProcess(processHandle, STATUS_SUCCESS);

NtClose(processHandle);

}

return status;

}

static NTSTATUS NTAPI TerminatorTP2(

__in HANDLE ProcessId

)

{

NTSTATUS status;

HANDLE processHandle;

if (NT_SUCCESS(status = PhOpenProcess(

&processHandle,

PROCESS_CREATE_THREAD | PROCESS_VM_OPERATION | PROCESS_VM_WRITE,

ProcessId

)))

{

status = RtlCreateUserThread(

processHandle,

NULL,

FALSE,

0,

0,

0,

(PUSER_THREAD_START_ROUTINE)GetExitProcessFunction(),

NULL,

NULL,

NULL

);

NtClose(processHandle);

}

return status;

}

static NTSTATUS NTAPI TerminatorTTGeneric(

__in HANDLE ProcessId,

__in BOOLEAN UseKph,

__in BOOLEAN UseKphDangerous

)

{

NTSTATUS status;

PVOID processes;

PSYSTEM_PROCESS_INFORMATION process;

ULONG i;

if ((UseKph || UseKphDangerous) && !KphIsConnected())

return STATUS_NOT_SUPPORTED;

if (!NT_SUCCESS(status = PhEnumProcesses(&processes)))

return status;

process = PhFindProcessInformation(processes, ProcessId);

if (!process)

{

PhFree(processes);

return STATUS_INVALID_CID;

}

for (i = 0; i < process->NumberOfThreads; i++)

{

HANDLE threadHandle;

if (NT_SUCCESS(PhOpenThread(

&threadHandle,

THREAD_TERMINATE,

process->Threads[i].ClientId.UniqueThread

)))

{

if (UseKphDangerous)

KphTerminateThreadUnsafe(threadHandle, STATUS_SUCCESS);

else if (UseKph)

KphTerminateThread(threadHandle, STATUS_SUCCESS);

else

NtTerminateThread(threadHandle, STATUS_SUCCESS);

NtClose(threadHandle);

}

}

PhFree(processes);

return STATUS_SUCCESS;

}

static NTSTATUS NTAPI TerminatorTT1(

__in HANDLE ProcessId

)

{

return TerminatorTTGeneric(ProcessId, FALSE, FALSE);

}

static NTSTATUS NTAPI TerminatorTT2(

__in HANDLE ProcessId

)

{

NTSTATUS status;

PVOID processes;

PSYSTEM_PROCESS_INFORMATION process;

ULONG i;

CONTEXT context;

PVOID exitProcess;

exitProcess = GetExitProcessFunction();

if (!NT_SUCCESS(status = PhEnumProcesses(&processes)))

return status;

process = PhFindProcessInformation(processes, ProcessId);

if (!process)

{

PhFree(processes);

return STATUS_INVALID_CID;

}

for (i = 0; i < process->NumberOfThreads; i++)

{

HANDLE threadHandle;

if (NT_SUCCESS(PhOpenThread(

&threadHandle,

THREAD_GET_CONTEXT | THREAD_SET_CONTEXT,

process->Threads[i].ClientId.UniqueThread

)))

{

#ifdef _M_IX86

context.ContextFlags = CONTEXT_CONTROL;

PhGetThreadContext(threadHandle, &context);

context.Eip = (ULONG)exitProcess;

PhSetThreadContext(threadHandle, &context);

#else

context.ContextFlags = CONTEXT_CONTROL;

PhGetThreadContext(threadHandle, &context);

context.Rip = (ULONG64)exitProcess;

PhSetThreadContext(threadHandle, &context);

#endif

NtClose(threadHandle);

}

}

PhFree(processes);

return STATUS_SUCCESS;

}

static NTSTATUS NTAPI TerminatorTP1a(

__in HANDLE ProcessId

)

{

NTSTATUS status;

HANDLE processHandle = NtCurrentProcess();

ULONG i;

if (!NtGetNextProcess)

return STATUS_NOT_SUPPORTED;

if (!NT_SUCCESS(status = NtGetNextProcess(

NtCurrentProcess(),

ProcessQueryAccess | PROCESS_TERMINATE,

0,

0,

&processHandle

)))

return status;

for (i = 0; i < 1000; i++) // make sure we don't go into an infinite loop or something

{

HANDLE newProcessHandle;

PROCESS_BASIC_INFORMATION basicInfo;

if (NT_SUCCESS(PhGetProcessBasicInformation(processHandle, &basicInfo)))

{

if (basicInfo.UniqueProcessId == ProcessId)

{

PhTerminateProcess(processHandle, STATUS_SUCCESS);

break;

}

}

if (NT_SUCCESS(status = NtGetNextProcess(

processHandle,

ProcessQueryAccess | PROCESS_TERMINATE,

0,

0,

&newProcessHandle

)))

{

NtClose(processHandle);

processHandle = newProcessHandle;

}

else

{

NtClose(processHandle);

break;

}

}

return status;

}

static NTSTATUS NTAPI TerminatorTT1a(

__in HANDLE ProcessId

)

{

NTSTATUS status;

HANDLE processHandle;

HANDLE threadHandle;

ULONG i;

if (!NtGetNextThread)

return STATUS_NOT_SUPPORTED;

if (NT_SUCCESS(status = PhOpenProcess(

&processHandle,

PROCESS_QUERY_INFORMATION, // NtGetNextThread actually requires this access for some reason

ProcessId

)))

{

if (!NT_SUCCESS(status = NtGetNextThread(

processHandle,

NULL,

THREAD_TERMINATE,

0,

0,

&threadHandle

)))

{

NtClose(processHandle);

return status;

}

for (i = 0; i < 1000; i++)

{

HANDLE newThreadHandle;

PhTerminateThread(threadHandle, STATUS_SUCCESS);

if (NT_SUCCESS(NtGetNextThread(

processHandle,

threadHandle,

THREAD_TERMINATE,

0,

0,

&newThreadHandle

)))

{

NtClose(threadHandle);

threadHandle = newThreadHandle;

}

else

{

NtClose(threadHandle);

break;

}

}

NtClose(processHandle);

}

return status;

}

static NTSTATUS NTAPI TerminatorCH1(

__in HANDLE ProcessId

)

{

NTSTATUS status;

HANDLE processHandle;

if (NT_SUCCESS(status = PhOpenProcess(

&processHandle,

PROCESS_DUP_HANDLE,

ProcessId

)))

{

ULONG i;

for (i = 0; i < 0x1000; i += 4)

{

PhDuplicateObject(

processHandle,

(HANDLE)i,

NULL,

NULL,

0,

0,

DUPLICATE_CLOSE_SOURCE

);

}

NtClose(processHandle);

}

return status;

}

static BOOL CALLBACK DestroyProcessWindowsProc(

__in HWND hwnd,

__in LPARAM lParam

)

{

ULONG processId;

GetWindowThreadProcessId(hwnd, &processId);

if (processId == (ULONG)lParam)

{

PostMessage(hwnd, WM_DESTROY, 0, 0);

}

return TRUE;

}

static NTSTATUS NTAPI TerminatorW1(

__in HANDLE ProcessId

)

{

EnumWindows(DestroyProcessWindowsProc, (LPARAM)ProcessId);

return STATUS_SUCCESS;

}

static BOOL CALLBACK QuitProcessWindowsProc(

__in HWND hwnd,

__in LPARAM lParam

)

{

ULONG processId;

GetWindowThreadProcessId(hwnd, &processId);

if (processId == (ULONG)lParam)

{

PostMessage(hwnd, WM_QUIT, 0, 0);

}

return TRUE;

}

static NTSTATUS NTAPI TerminatorW2(

__in HANDLE ProcessId

)

{

EnumWindows(QuitProcessWindowsProc, (LPARAM)ProcessId);

return STATUS_SUCCESS;

}

static BOOL CALLBACK CloseProcessWindowsProc(

__in HWND hwnd,

__in LPARAM lParam

)

{

ULONG processId;

GetWindowThreadProcessId(hwnd, &processId);

if (processId == (ULONG)lParam)

{

PostMessage(hwnd, WM_CLOSE, 0, 0);

}

return TRUE;

}

static NTSTATUS NTAPI TerminatorW3(

__in HANDLE ProcessId

)

{

EnumWindows(CloseProcessWindowsProc, (LPARAM)ProcessId);

return STATUS_SUCCESS;

}

static NTSTATUS NTAPI TerminatorTJ1(

__in HANDLE ProcessId

)

{

NTSTATUS status;

HANDLE processHandle;

// TODO: Check if the process is already in a job.

if (NT_SUCCESS(status = PhOpenProcess(

&processHandle,

PROCESS_SET_QUOTA | PROCESS_TERMINATE,

ProcessId

)))

{

HANDLE jobHandle;

status = NtCreateJobObject(&jobHandle, JOB_OBJECT_ALL_ACCESS, NULL);

if (NT_SUCCESS(status))

{

status = NtAssignProcessToJobObject(jobHandle, processHandle);

if (NT_SUCCESS(status))

status = NtTerminateJobObject(jobHandle, STATUS_SUCCESS);

NtClose(jobHandle);

}

NtClose(processHandle);

}

return status;

}

static NTSTATUS NTAPI TerminatorTD1(

__in HANDLE ProcessId

)

{

NTSTATUS status;

HANDLE processHandle;

if (NT_SUCCESS(status = PhOpenProcess(

&processHandle,

PROCESS_SUSPEND_RESUME,

ProcessId

)))

{

HANDLE debugObjectHandle;

OBJECT_ATTRIBUTES objectAttributes;

InitializeObjectAttributes(

&objectAttributes,

NULL,

0,

NULL,

NULL

);

if (NT_SUCCESS(NtCreateDebugObject(

&debugObjectHandle,

DEBUG_PROCESS_ASSIGN,

&objectAttributes,

DEBUG_KILL_ON_CLOSE

)))

{

NtDebugActiveProcess(processHandle, debugObjectHandle);

NtClose(debugObjectHandle);

}

NtClose(processHandle);

}

return status;

}

static NTSTATUS NTAPI TerminatorTP3(

__in HANDLE ProcessId

)

{

NTSTATUS status;

HANDLE processHandle;

if (!KphIsConnected())

return STATUS_NOT_SUPPORTED;

if (NT_SUCCESS(status = PhOpenProcess(

&processHandle,

SYNCHRONIZE, // KPH doesn't require any access for this operation

ProcessId

)))

{

status = KphTerminateProcess(processHandle, STATUS_SUCCESS);

NtClose(processHandle);

}

return status;

}

static NTSTATUS NTAPI TerminatorTT3(

__in HANDLE ProcessId

)

{

return TerminatorTTGeneric(ProcessId, TRUE, FALSE);

}

static NTSTATUS NTAPI TerminatorTT4(

__in HANDLE ProcessId

)

{

return TerminatorTTGeneric(ProcessId, FALSE, TRUE);

}

static NTSTATUS NTAPI TerminatorM1(

__in HANDLE ProcessId

)

{

NTSTATUS status;

HANDLE processHandle;

if (NT_SUCCESS(status = PhOpenProcess(

&processHandle,

PROCESS_QUERY_INFORMATION | PROCESS_VM_WRITE,

ProcessId

)))

{

PVOID pageOfGarbage;

SIZE_T pageSize;

PVOID baseAddress;

MEMORY_BASIC_INFORMATION basicInfo;

pageOfGarbage = NULL;

pageSize = PAGE_SIZE;

if (!NT_SUCCESS(NtAllocateVirtualMemory(

NtCurrentProcess(),

&pageOfGarbage,

0,

&pageSize,

MEM_COMMIT,

PAGE_READONLY

)))

{

NtClose(processHandle);

return STATUS_NO_MEMORY;

}

baseAddress = (PVOID)0;

while (NT_SUCCESS(NtQueryVirtualMemory(

processHandle,

baseAddress,

MemoryBasicInformation,

&basicInfo,

sizeof(MEMORY_BASIC_INFORMATION),

NULL

)))

{

ULONG i;

// Make sure we don't write to views of mapped files. That

// could possibly corrupt files!

if (basicInfo.Type == MEM_PRIVATE)

{

for (i = 0; i < basicInfo.RegionSize; i += PAGE_SIZE)

{

PhWriteVirtualMemory(

processHandle,

PTR_ADD_OFFSET(baseAddress, i),

pageOfGarbage,

PAGE_SIZE,

NULL

);

}

}

baseAddress = PTR_ADD_OFFSET(baseAddress, basicInfo.RegionSize);

}

// Size needs to be zero if we're freeing.

pageSize = 0;

NtFreeVirtualMemory(

NtCurrentProcess(),

&pageOfGarbage,

&pageSize,

MEM_RELEASE

);

NtClose(processHandle);

}

return status;

}

static NTSTATUS NTAPI TerminatorM2(

__in HANDLE ProcessId

)

{

NTSTATUS status;

HANDLE processHandle;

if (NT_SUCCESS(status = PhOpenProcess(

&processHandle,

PROCESS_QUERY_INFORMATION | PROCESS_VM_OPERATION,

ProcessId

)))

{

PVOID baseAddress;

MEMORY_BASIC_INFORMATION basicInfo;

ULONG oldProtect;

baseAddress = (PVOID)0;

while (NT_SUCCESS(NtQueryVirtualMemory(

processHandle,

baseAddress,

MemoryBasicInformation,

&basicInfo,

sizeof(MEMORY_BASIC_INFORMATION),

NULL

)))

{

SIZE_T regionSize;

regionSize = basicInfo.RegionSize;

NtProtectVirtualMemory(

processHandle,

&basicInfo.BaseAddress,

®ionSize,

PAGE_NOACCESS,

&oldProtect

);

baseAddress = PTR_ADD_OFFSET(baseAddress, basicInfo.RegionSize);

}

NtClose(processHandle);

}

return status;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: