You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用NtTerminateThread终止自身线程返回STATUS_INVALID_HANDLE求助

问题解决:NtTerminateThread返回STATUS_INVALID_HANDLE

核心问题

你通过GetCurrentThread()拿到的0xfffffffffffffffe是伪句柄,不是真正的内核线程句柄。伪句柄只是系统定义的特殊标记,用来指代当前线程,但内核不接受它作为NtTerminateThread的句柄参数,直接传递就会返回STATUS_INVALID_HANDLE。

两种可行解决方案

方案1:将伪句柄转换为真实内核句柄

使用NtDuplicateHandle把伪句柄复制为系统调用可识别的真实句柄,再传给NtTerminateThread。示例汇编代码:

; 调用NtDuplicateHandle转换伪句柄
mov rcx, -1                    ; 源进程句柄:-1代表当前进程
mov rdx, 0xfffffffffffffffe    ; 源句柄:GetCurrentThread返回的伪句柄
mov r8, -1                     ; 目标进程句柄:当前进程
lea r9, [rsp-8]                ; 输出参数:接收转换后的真实句柄
mov qword ptr [rsp+0x28], 0    ; 期望权限:传0即可,复制时会保留原权限
mov qword ptr [rsp+0x30], 0    ; 对象属性:传NULL
mov qword ptr [rsp+0x38], 1    ; 选项:DUPLICATE_SAME_ACCESS
mov eax, 0x26                  ; NtDuplicateHandle的系统调用号(注意:不同Windows版本可能不同)
syscall

; 用真实句柄调用NtTerminateThread
mov rcx, [rsp-8]               ; 转换后的真实线程句柄
mov rdx, 0x0                   ; 退出状态:STATUS_SUCCESS
mov eax, 0x53                  ; NtTerminateThread的系统调用号
syscall

; 可选:关闭真实句柄(线程终止后句柄失效,但显式关闭是好习惯)
mov rcx, [rsp-8]
mov eax, 0x01                  ; NtClose的系统调用号
syscall

方案2:直接调用NtTerminateCurrentThread

如果只是要终止当前线程,无需额外转换,直接使用NtTerminateCurrentThread——这个系统调用不需要线程句柄,仅需传入退出状态:

mov rcx, 0x0                   ; 退出状态:STATUS_SUCCESS
mov eax, 0x52                  ; NtTerminateCurrentThread的系统调用号(不同版本可能有变化)
syscall

注意事项

  • Windows不同版本的系统调用号可能存在差异,需确认当前系统的正确编号。
  • 伪句柄仅能指代调用它的线程,无法用于操作其他线程,必须转换为真实句柄才能在其他上下文使用。

内容的提问来源于stack exchange,提问作者user24684540

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.16 02:48:18