Win 10 1909( 18363.1198) ,x32 dbg, NoSEH.exe
程序进入后对栈进行安全操作和局部变量存储后:
需要注意的是,ntdll 似乎总是占据用户态的最高地址。
__safe_se_handler_table:
函数地址表中全是 RVA,前面几个 RVA + ntdll 基址后得到的函数对应分别是
75220 ——> KiUserApcExceptionHandler 752B0 ——> KiUserCallBackExceptionHandler
77440 ——> UnWind_Handler4 7B130 ——> __Except_handler4
7BC40 ——> UnWind_handler 89F80 ——> Exceptionhandler
89FB0 ——> UnWindhandler 8A0B0 ~ 8A0EF ——> FinalExceptionHandlerPad0 ~ 63
经历 jmp 后,执行对取得值的检验
接下来计算得到传入参数的 RVA 地址(前面经过检验该函数地址在 ntdll 内)
接下来进入一个循环,该循环将会通过对 ecx(0x47) 值的计算,得到不同函数的 RVA。将取得的 RVA 与早已存储在局部函数中的 _excpet_handler 的 RVA 作比较,若相符则表明该函数位于异常处理函数地址表中,说明是合法有效的。
若在 ecx 为 1 前找到函数,则会跳出循环、退出函数并返回 1
否则程序将调用 memset 函数情况栈中的数据和记录异常的函数,然后退出并返回值 0
原文:https://www.cnblogs.com/Rev-omi/p/14048008.html