diff --git a/src/logger/exception_handler.cpp b/src/logger/exception_handler.cpp index 99d6aaa5..f2496b7a 100644 --- a/src/logger/exception_handler.cpp +++ b/src/logger/exception_handler.cpp @@ -22,13 +22,17 @@ namespace big exception_code == DBG_PRINTEXCEPTION_WIDE_C) return EXCEPTION_CONTINUE_SEARCH; - LOG(FATAL) << stack_trace(exception_info); + stack_trace stack_trace(exception_info); + LOG(FATAL) << stack_trace; ZyanU64 opcode_address = exception_info->ContextRecord->Rip; ZydisDisassembledInstruction instruction; ZydisDisassembleIntel(ZYDIS_MACHINE_MODE_LONG_64, opcode_address, reinterpret_cast(opcode_address), 32, &instruction); - exception_info->ContextRecord->Rip += instruction.info.length; + if(stack_trace.m_ret_context.Rip) + *exception_info->ContextRecord = stack_trace.m_ret_context; + else + exception_info->ContextRecord->Rip += instruction.info.length; return EXCEPTION_CONTINUE_EXECUTION; } diff --git a/src/logger/stack_trace.cpp b/src/logger/stack_trace.cpp index 9228cfe9..ce016c4c 100644 --- a/src/logger/stack_trace.cpp +++ b/src/logger/stack_trace.cpp @@ -172,6 +172,9 @@ namespace big break; } m_frame_pointers[i] = frame.AddrPC.Offset; + + if (i == 1) + m_ret_context = context; } } diff --git a/src/logger/stack_trace.hpp b/src/logger/stack_trace.hpp index aa7582e9..308e94c1 100644 --- a/src/logger/stack_trace.hpp +++ b/src/logger/stack_trace.hpp @@ -9,9 +9,12 @@ namespace big stack_trace(EXCEPTION_POINTERS* exception_info); virtual ~stack_trace(); + CONTEXT m_ret_context{}; + std::string str() const; friend std::ostream& operator<< (std::ostream& os, const stack_trace& st); + friend std::ostream& operator<< (std::ostream& os, const stack_trace* st); private: struct module_info @@ -57,4 +60,11 @@ namespace big return os; } + + inline std::ostream& operator<< (std::ostream& os, const stack_trace* st) + { + os << st->str(); + + return os; + } } \ No newline at end of file