调用 NtContinue() 后,我无法在 RIP + N 字节上设置硬件断点

逆向工程 视窗 C++ x64dbg 例外
2021-06-22 23:09:22
#include <Windows.h>

int handle_exception (EXCEPTION_POINTERS *exception_pointers) {
    exception_pointers->ContextRecord->Rip += 4;
    return EXCEPTION_CONTINUE_EXECUTION;
}

int main () {
    __try {
        int number = 0;

        number = 1 / number; // generate EXCEPTION_INT_DIVIDE_BY_ZERO
    }
    __except (handle_exception(GetExceptionInformation())) { }
    return 0;
}

我构建了源代码,并通过 x64dbg 打开它。并设置硬件断点。

在此处输入图片说明

IDIV指令出现异常,运行调试器。它总是在下一个指令之后停止。

在此处输入图片说明

在此处输入图片说明

我预计它会停在 0x0000000140001056 地址处,因为它距离 RIP 4 个字节。但事实并非如此。

我想在幕后有一些我不知道的事情。只是出于好奇,为什么它会这样工作?如果你有机会,请告诉我。谢谢。:D

附加附件

在 handle_exception() 中修改 RIP 时

NtContinue() 的 ThreadContext 参数的新 RIP 是 0x0000000140001056。

在此处输入图片说明

当 handle_exception() 中未修改 RIP 时

NtContinue() 的 ThreadContext 参数的 RIP 是 0x0000000140001032。(总的来说,地址已更改,因为源代码也已更改。那是 IDIV 指令的地址。)

在此处输入图片说明

1个回答

只是稍微修改了您的源代码以在处理程序中打印 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

:\>