備忘録

備忘録

Windowsでプロセスを終了する方法

Ⅰ. はじめに

タイトルの通り「Windowsでプロセスを終了する方法」です。

Ⅱ. 方法

1. msvcrt.abort
#include <Windows.h>

int main() {
  abort();
  return 0;
}
2. msvcrt.exit
#include <Windows.h>

int main() {
  exit(0);
  return 0;
}
3. kernel32.ExitProcess
#include <Windows.h>

int main() {
  ExitProcess(0);
  return 0;
}
4. ntdll.RtlExitUserProcess
#include <Windows.h>
#pragma comment(lib, "ntdll.lib")

// https://doxygen.reactos.org/d6/d9e/include_2reactos_2wine_2winternl_8h.html#ac53be5d52ae8419ef124f65379e4d35b
extern "C" NTSYSAPI void DECLSPEC_NORETURN WINAPI RtlExitUserProcess(ULONG);

int main() {
  RtlExitUserProcess(0);
  return 0;
}
5. ntdll.NtTerminateProcess (ZwTerminateProcess)
#include <Windows.h>
#pragma comment(lib, "ntdll.lib")

// https://undocumented.ntinternals.net/index.html?page=UserMode%2FUndocumented%20Functions%2FNT%20Objects%2FProcess%2FNtTerminateProcess.html
extern "C" NTSYSAPI NTSTATUS NTAPI NtTerminateProcess(IN HANDLE ProcessHandle OPTIONAL, IN NTSTATUS ExitStatus);

int main() {
  NtTerminateProcess(GetCurrentProcess(), 0);
  return 0;
}
6. syscall

Native.asm

.code

NtTerminateProcess proc
  mov r10, rcx
  mov eax, 2Ch
  syscall
  ret
NtTerminateProcess endp

end

Source.cpp

#include <Windows.h>

// https://undocumented.ntinternals.net/index.html?page=UserMode%2FUndocumented%20Functions%2FNT%20Objects%2FProcess%2FNtTerminateProcess.html
extern "C" NTSYSAPI NTSTATUS NTAPI NtTerminateProcess(IN HANDLE ProcessHandle OPTIONAL, IN NTSTATUS ExitStatus);

int main() {
  NtTerminateProcess(GetCurrentProcess(), 0);
  return 0;
}

Ⅲ. 方法(ウィンドウ系)

1. user32.PostQuitMessage
#include <Windows.h>

int main() {
  PostQuitMessage(0);
  return 0;
}
2. win32u.NtUserCallOneParam
#include <Windows.h>
#pragma comment(lib, "win32k.lib")

// ライブラリディレクトリに以下を追記する
// $(WindowsSDK_LibraryPath)\..\km\x64

extern "C" DWORD NTAPI __win32kstub_NtUserCallOneParam(DWORD Param, DWORD Routine);

int main() {
  __win32kstub_NtUserCallOneParam(0, 0);
  return 0;
}
3. syscall
  • syscall番号 0x1002(OSバージョンに依存します)
  • プログラム省略

Ⅳ. その他

1. 呼び出しツリー

msvcrt.abort → msvcrt.exit → kernel32.ExitProcess → ntdll.RtlExitUserPRocess → ntdll.NtTerminateProcess (ZwTerminateProcess) → syscall

2. 呼び出しツリー(ウィンドウ系)

user32.PostQuitMessage → win32u.NtUserCallOneParam → syscall