Ⅰ. はじめに
タイトルの通り「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
- https://kagasu.hatenablog.com/entry/2018/01/03/200337
- syscall番号 0x2C(OSバージョンに依存します)
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