我有这个 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 等现代操作系统中不可写)。
当然,您可以在调试中断的异常处理程序中,将内存映射为可写(如果需要),并将不同的值写入您关心的代码部分(如果它在另一个进程中,您需要使用 OpenProcess
和 WriteProcessMemory
) - 同样,这与硬件断点没有直接关系,但与结果执行的代码有关,并且仍将遵循通常的规则关于您可以读写哪些内存的操作系统。
关于c++ - 硬件断点可以写内存吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23533158/