c++ - 硬件断点可以写内存吗?

标签 c++ assembly hardware breakpoints

我有这个 ASM 代码,我想在上面做一个硬件断点,但是我想知道我是否可以使用硬件断点来写入内存。任何人都可以建议吗?

[ASM]
41A8BA - 68 12345678 [PUSH 78563412]

我是否可以在硬件断点上编写它,例如在 C++ 上使其成为“68 00000000”?

[C++ Code]
LONG WINAPI ExceptionFilter(PEXCEPTION_POINTERS ExceptionInfo)
{
    if(ExceptionInfo->ExceptionRecord->ExceptionCode == EXCEPTION_SINGLE_STEP)
    {
        if((DWORD)ExceptionInfo->ExceptionRecord->ExceptionAddress == 0x41A8BA)
        {
            //What do i write here?
            return EXCEPTION_CONTINUE_EXECUTION;
        }
    }
    return EXCEPTION_CONTINUE_SEARCH;
}

最佳答案

我非常熟悉 x86 的硬件断点实现是如何工作的(从“它对处理器做了什么”——而不是它实际上是如何在内部设计的),并且已经阅读了其他几个人的描述。

硬件断点不会对有问题的代码做任何事情——它是一组特殊的寄存器,可以给定一个模式(“地址 X,写入时触发”,“地址 Y,执行时触发”),它在代码执行期间进行检查,如果匹配(例如“地址 X 正在写入”或“地址 Y 正在执行”),则处理器将停止执行并进入异常处理程序 - 此时point 异常处理程序中的软件接管,通常是通过移交给调试器说“您的代码写入了地址 X,这是您所在的位置”或“您的代码执行了地址 Y,这是我们停止的位置”。

硬件断点不能直接用于读取、写入或执行任何东西——它只是一种“匹配+异常”机制。从技术上讲,可以让异常处理程序做一些事情,比如写入正在执行的地址,但这不是“硬件断点”,它仍然会像处理器上执行的任何其他代码一样被对待,这意味着内存必须以一种可以编写的方式进行映射(代码通常在 Windows 和 Linux 等现代操作系统中不可写)。

当然,您可以在调试中断的异常处理程序中,将内存映射为可写(如果需要),并将不同的值写入您关心的代码部分(如果它在另一个进程中,您需要使用 OpenProcessWriteProcessMemory) - 同样,这与硬件断点没有直接关系,但与结果执行的代码有关,并且仍将遵循通常的规则关于您可以读写哪些内存的操作系统。

关于c++ - 硬件断点可以写内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23533158/

相关文章:

c++ - 找不到包含文件 QtCore?

c++ - Borland C++ 内联 asm 问题与 WORD PTR 和字符串

assembly - X86 : What does `movsxd rdx,edx` instruction mean?

assembly - mov r64,m64是一个周期还是两个周期的延迟?

.net - 生成机器指纹的最佳方法?

c++ - 使用 openCV convertTo 来改变图像位深度似乎是 "corrupt"的图像?

c++ - boolean 值的排序

assembly - 如何在64位Linux系统上执行32位shellcode?

cryptography - 是否可以对英特尔的可信平台模块进行编程

android - 如何开始Android/iOS配件开发?