其他说您不能在 Windows 中使用中断的答案是完全错误的。如果你真的想要,你可以(不推荐)。至少在 32 位 x86 Windows 上存在int 2Eh
基于 legacy 的系统调用接口。有关 x86 和 x86_64 Windows 上的系统调用机制的一些讨论,请参见此页面。
这是一个非常简单的程序示例(使用 FASM 编译),该程序在 Windows 7 上使用int 0x2e
(并在大多数其他版本上崩溃)立即退出:
format PE
NtTerminateProcess_Wind7=0x172
entry $
; First call terminates all threads except caller thread, see for details:
; http://www.rohitab.com/discuss/topic/41523-windows-process-termination/
mov eax, NtTerminateProcess_Wind7
mov edx, terminateParams
int 0x2e
; Second call terminates current process
mov eax, NtTerminateProcess_Wind7
mov edx, terminateParams
int 0x2e
ud2 ; crash if we failed to terminate
terminateParams:
dd 0, 0 ; processHandle, exitStatus
但请注意,这是使用 Windows 的一种不受支持的方式:系统调用号经常更改,通常不能依赖。在此页面上,您可以看到例如NtCreateFile
在 Windows XP 上调用系统调用号0x25
,而在 Windows Server 2003 上已经对应于NtCreateEvent
,而在 Vista 上它是NtAlpcRevokeSecurityContext
。
进行系统调用的受支持(尽管文档不多)方式是通过Native API库的函数,ntdll.dll
.
But even if you use the Native API, "printing things" is still very version-dependent. Namely, if you have a redirect to file, you must use NtWriteFile
, but when writing to a true console window, you have to use LPC, where the target process depends on Windows version.