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

关于ntdll!ExecuteHandler2中push edx指令的技术疑问

关于ntdll!ExecuteHandler2中push edx指令的分析

问题背景

在Windows 7环境下使用WinDbg调试ntdll!ExecuteHandler2函数时,对指令775c7199 52 push edx存在疑问:当前执行该指令时edx的值为775c71cd,对应函数内的一段代码,需要明确该指令的含义及设计原因。

相关汇编代码

ntdll!ExecuteHandler2:
775c7193 55              push    ebp
775c7194 8bec            mov     ebp,esp
775c7196 ff750c          push    dword ptr [ebp+0Ch]
775c7199 52              push    edx
775c719a 64ff3500000000  push    dword ptr fs:[0]
775c71a1 64892500000000  mov     dword ptr fs:[0],esp
775c71a8 ff7514          push    dword ptr [ebp+14h]
775c71ab ff7510          push    dword ptr [ebp+10h]
775c71ae ff750c          push    dword ptr [ebp+0Ch]
775c71b1 ff7508          push    dword ptr [ebp+8]
775c71b4 8b4d18          mov     ecx,dword ptr [ebp+18h]
775c71b7 ffd1            call    ecx
775c71b9 648b2500000000  mov     esp,dword ptr fs:[0]
775c71c0 648f0500000000  pop     dword ptr fs:[0]
775c71c7 8be5            mov     esp,ebp
775c71c9 5d              pop     ebp
775c71ca c21400          ret     14h

调试寄存器及反汇编信息

0:010> t
eax=00000000 ebx=00000000 ecx=77e15aed edx=775c71cd esi=00000000 edi=00000000
eip=775c7199 esp=01d1f5e4 ebp=01d1f5e8 iopl=0         nv up ei pl zr na pe nc
cs=001b  ss=0023  ds=0023  es=0023  fs=003b  gs=0000             efl=00010246
ntdll!ExecuteHandler2+0x6:
775c7199 52              push    edx

0:010> u @edx
ntdll!ExecuteHandler2+0x3a:
775c71cd 8b4c2404        mov     ecx,dword ptr [esp+4]
775c71d1 f7410406000000  test    dword ptr [ecx+4],6
775c71d8 b801000000      mov     eax,1
775c71dd 7512            jne     ntdll!ExecuteHandler2+0x5e (775c71f1)
775c71df 8b4c2408        mov     ecx,dword ptr [esp+8]
775c71e3 8b542410        mov     edx,dword ptr [esp+10h]
775c71e7 8b4108          mov     eax,dword ptr [ecx+8]
775c71ea 8902            mov     dword ptr [edx],eax

指令含义与设计原因

  1. push edx的直接含义
    edx中存储的775c71cd是ntdll!ExecuteHandler2函数内部的代码地址(偏移+0x3a),这条指令的作用是将该地址压入栈中,作为**结构化异常处理(SEH)**回调函数的入口。

  2. SEH链的构建逻辑
    紧随其后的push dword ptr fs:[0]和mov dword ptr fs:[0],esp是标准的SEH注册流程:

    • fs:[0]指向当前线程TEB(线程环境块)中的异常链表头
    • 先将旧的链表头压栈,再把当前栈顶(包含刚压入的回调地址和旧链表头)设为新的链表头,完成异常处理函数的注册。
  3. 为什么要这么做
    ntdll!ExecuteHandler2是Windows异常处理体系中的核心函数,负责调用用户或系统的异常处理例程。为了保证自身执行过程中出现异常时能被正确处理,函数内部需要注册一个专属的异常回调:

    • 775c71cd开始的代码会检查异常记录的标志位(test dword ptr [ecx+4],6),判断异常类型
    • 根据判断结果执行内存拷贝操作,最后返回1表示异常已处理,确保异常处理机制本身的健壮性,避免因自身异常导致整个系统崩溃。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.24 09:35:24