只是稍微修改了您的源代码以在处理程序中打印 Rip before 和 post
添加了另一个异常并消除了警告(空处理程序块)
并在处理程序上使用 +1,+2,+3 +4 +5 进行了测试硬件中断没有得到我没有在 RtlpExecuteHandlerForxxx 调用中单步检查
这是一个修改后的 src
#include <windows.h>
#include <stdio.h>
#include <intrin.h>
int handle_exception(ULONG ExceptionCode,EXCEPTION_POINTERS *exception_pointers)
{
printf("%x\n",ExceptionCode);
printf("%I64x\n",exception_pointers->ContextRecord->Rip);
exception_pointers->ContextRecord->Rip += 4;
printf("%I64x\n",exception_pointers->ContextRecord->Rip);
return EXCEPTION_CONTINUE_EXECUTION;
}
int main(void)
{
__try
{
int number = 0;
number = 1 / number; // generate EXCEPTION_INT_DIVIDE_BY_ZERO
__debugbreak();
}
__except (handle_exception(GetExceptionCode(),GetExceptionInformation()))
{
__nop();
}
return 0;
}
Rip 的结果 =Rip+ {1,2,3,4} _CONTEXT->Rip 已更改并正确执行
但是 hw Bp 没有被击中,所以是时候单步进入 ntdll/nt/xxxx
:\>grep -i += hwbp.cpp
exception_pointers->ContextRecord->Rip += 1;
:\>cl /Zi /W4 /Od /analyze /nologo /EHsc hwbp.cpp /link /release
hwbp.cpp
:\>hwbp.exe
c0000094
7ff7adf910a2
7ff7adf910a3
c0000005
7ff7adf910a5
7ff7adf910a6
80000003
7ff7adf910aa
7ff7adf910ab
:\>grep -i += hwbp.cpp
exception_pointers->ContextRecord->Rip += 2;
:\>cl /Zi /W4 /Od /analyze /nologo /EHsc hwbp.cpp /link /release
hwbp.cpp
:\>hwbp.exe
c0000094
7ff6696d10a2
7ff6696d10a4
80000003
7ff6696d10aa
7ff6696d10ac
c0000005
7ff6696d10ac
7ff6696d10ae
:\>grep -i += hwbp.cpp
exception_pointers->ContextRecord->Rip += 3;
:\>cl /Zi /W4 /Od /analyze /nologo /EHsc hwbp.cpp /link /release
hwbp.cpp
:\>hwbp.exe
c0000094
7ff788c510a2
7ff788c510a5
c0000005
7ff788c510a5
7ff788c510a8
80000003
7ff788c510aa
7ff788c510ad
:\>grep -i += hwbp.cpp
exception_pointers->ContextRecord->Rip += 4;
:\>cl /Zi /W4 /Od /analyze /nologo /EHsc hwbp.cpp /link /release
hwbp.cpp
:\>hwbp.exe
c0000094
7ff6f2be10a2
7ff6f2be10a6
80000003
7ff6f2be10aa
7ff6f2be10ae
:\>