我有这个ASM代码,我想在它上做一个硬件断点,但是我想知道我是否可以使用硬件断点来编写内存。有人能给我建议吗?
[ASM]
41A8BA - 68 12345678 [PUSH 78563412]我是否可以在硬件断点上将其写成"68 00000000“,例如在C++上?
[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;
}发布于 2014-05-08 07:27:01
我非常熟悉x86的硬件断点实现是如何工作的(从“它对处理器做了什么”,而不是它实际上是如何内部设计的),并阅读了其他几个方面的描述。
硬件断点对代码没有任何作用--它是一组特殊寄存器,可以给出一个模式(“地址X,写入时的触发器”,“地址Y,执行时的触发器”),这些模式在代码执行过程中被检查,如果有匹配(例如:“地址X正在写入”或“地址Y正在执行”),然后处理器将停止执行并输入异常处理程序--这时异常处理程序中的软件将接管,通常是通过向调试器传递“您的代码编写了地址X,这里是您所在的位置”或“您的代码执行的地址Y,这里是我们停止的位置”。
硬件brekapoint不能直接用于读取、写入或执行任何东西--它只是一种“匹配+异常”机制。从技术上讲,我们可以让异常处理程序执行一些类似于写入正在执行的地址的操作,但这并不是“硬件断点”,而且它仍然被像在处理器上执行的任何其他代码一样对待,这意味着内存必须以一种可以编写的方式进行映射(通常,在现代操作系统(如Windows和Linux)中,代码是不可写的)。
当然,在调试中断的异常处理程序中,可以将内存映射为可写的(如果需要的话),并将不同的值写入您所关心的代码部分(如果在另一个进程中,则需要使用OpenProcess和WriteProcessMemory) --同样,这与硬件断点没有直接关系,而是与因此执行的代码有关,并且仍然将遵循操作系统中有关可以读写哪些内存的常规规则。
发布于 2014-05-08 05:33:29
我想知道这与硬件断点有什么关系。
据我所知,您想在Windows程序停止时修改它吗?
为此,您应该使用"WriteProcessMemory()“API函数。
https://stackoverflow.com/questions/23533158
复制相似问题