我有这个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;
}
答案 0 :(得分:4)
我非常熟悉x86硬件断点的实现方式(从“它对处理器的作用” - 而不是它在内部实际设计的方式),并且已经阅读了其他几个断点的描述。
硬件断点不对所讨论的代码做任何事情 - 它是一组特殊寄存器,可以给出一种模式(“地址X,写入时触发”,“地址Y,执行时触发”),在执行代码期间检查,如果匹配(例如“正在写入地址X”或“正在执行地址Y”),则处理器将停止执行并进入异常处理程序 - 在此处指出异常处理程序中的软件接管,通常是通过移交给调试器来说“你的代码写了一个写入地址X,这里是你在哪里”或“你的代码执行地址Y,这里是我们停止的地方”。
硬件brekapoints不能直接用于读取,写入或执行任何东西 - 它只是一种“匹配+异常”机制。从技术上讲,可以让异常处理程序执行类似写入正在执行的地址的操作,但这不会是“硬件断点”,它仍然会像处理器上执行的任何其他代码一样对待,这意味着内存必须以可写入的方式映射(代码通常在现代操作系统中不可写,例如Windows和Linux)。
当然,您可以在调试中断的异常处理程序中将内存映射为可写(如果需要),并将不同的值写入您关心的代码部分(如果它在另一个进程中,则需要使用OpenProcess
和WriteProcessMemory
) - 再次,这与硬件断点没有直接关系,而是与执行的代码有关,并且仍将遵循操作系统的常规规则关于什么内存你可以读写。
答案 1 :(得分:0)
我想知道这与硬件断点有什么关系。
据我所知,您希望在停止时修改Windows程序吗?
要做到这一点,你应该使用" WriteProcessMemory()" API函数。