硬件断点能够写入内存吗?

时间:2014-05-08 05:08:19

标签: 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;
}

2 个答案:

答案 0 :(得分:4)

我非常熟悉x86硬件断点的实现方式(从“它对处理器的作用” - 而不是它在内部实际设计的方式),并且已经阅读了其他几个断点的描述。

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

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

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

答案 1 :(得分:0)

我想知道这与硬件断点有什么关系。

据我所知,您希望在停止时修改Windows程序吗?

要做到这一点,你应该使用" WriteProcessMemory()" API函数。