免责声明:内容仅供学习参考,请合法利用知识,禁止进行违法犯罪活动!
上一个内容:52.通过劫持主线程获取目标断点寄存器(调试寄存器)
以 52.通过劫持主线程获取目标断点寄存器(调试寄存器) 它的代码为基础进行修改
处理器异常码说明:
https://learn.microsoft.com/zh-cn/windows-hardware/drivers/debugger/specific-exceptions
htdHook2.cpp文件做出了修改:
LONG _stdcall PvectoredExceptionHandler(PEXCEPTION_POINTERS val) {
// 处理器异常编码,用 val->ExceptionRecord->ExceptionCode; 这个获取
/**
异常码说明:
https://learn.microsoft.com/zh-cn/windows-hardware/drivers/debugger/specific-exceptions
*/
if (val->ExceptionRecord->ExceptionCode == STATUS_BREAKPOINT) {
/**
call指令执行时会让eip指向下一条指令的位置,
这里减去0x5是让他回到call的位置,也就是得到从哪来的
*/
unsigned _eip = val->ContextRecord->Eip;
PHOOKPOINT point = htdHook2Ptr->Points.FindPoint((LPVOID)_eip);
if (point) {
if (point->GetHookBack2()(val->ContextRecord)) {
// 继续执行原有代码
val->ContextRecord->Eip = (unsigned)point->CodeFix;
}
else {
// 调转到指定位置执行
val->ContextRecord->Eip = (unsigned)point->AddressRet;
}
// 拦截异常不让当前异常往后传递
return EXCEPTION_CONTINUE_EXECUTION;
}
// 拦截异常让当前异常往后传递(表示当前异常不是我们要拦截的异常)
else return EXCEPTION_CONTINUE_SEARCH;
}
if (val->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP) {
AfxMessageBox(L"TXT");
// 如果没有这一句它会无限弹框,原因是没有好好的处理异常导致的
val->ContextRecord->Dr7 = 0b00001010100;
// 处理器错误别人处理不了,这里只能返回 EXCEPTION_CONTINUE_EXECUTION,返回别的也行但是没有人能处理
return EXCEPTION_CONTINUE_EXECUTION;
}
}
文章评论