Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- LONG __stdcall ExceptionFilter(EXCEPTION_POINTERS* pep)
- {
- _EXCEPTION_RECORD * per = pep->ExceptionRecord;
- bool cont = per->ExceptionCode != EXCEPTION_BREAKPOINT && per->ExceptionCode != EXCEPTION_SINGLE_STEP;
- // if(per->ExceptionFlags or !cont)
- {
- logger.error() << "Runtime exception ";
- for (; per != 0; per = per->ExceptionRecord)
- {
- switch (per->ExceptionCode)
- {
- #define __tmp_(n) case n : logger << #n; break;
- __tmp_(EXCEPTION_ACCESS_VIOLATION);
- __tmp_(EXCEPTION_ARRAY_BOUNDS_EXCEEDED);
- __tmp_(EXCEPTION_BREAKPOINT);
- __tmp_(EXCEPTION_DATATYPE_MISALIGNMENT);
- __tmp_(EXCEPTION_FLT_DENORMAL_OPERAND);
- __tmp_(EXCEPTION_FLT_DIVIDE_BY_ZERO);
- __tmp_(EXCEPTION_FLT_INEXACT_RESULT);
- __tmp_(EXCEPTION_FLT_INVALID_OPERATION);
- __tmp_(EXCEPTION_FLT_OVERFLOW);
- __tmp_(EXCEPTION_FLT_STACK_CHECK);
- __tmp_(EXCEPTION_FLT_UNDERFLOW);
- __tmp_(EXCEPTION_ILLEGAL_INSTRUCTION);
- __tmp_(EXCEPTION_IN_PAGE_ERROR);
- __tmp_(EXCEPTION_INT_DIVIDE_BY_ZERO);
- __tmp_(EXCEPTION_INT_OVERFLOW);
- __tmp_(EXCEPTION_INVALID_DISPOSITION);
- __tmp_(EXCEPTION_NONCONTINUABLE_EXCEPTION);
- __tmp_(EXCEPTION_PRIV_INSTRUCTION);
- __tmp_(EXCEPTION_SINGLE_STEP);
- __tmp_(EXCEPTION_STACK_OVERFLOW);
- #undef __tmp_
- default:
- logger << "Unknown exception code: " << hex << per->ExceptionCode;
- }
- logger << endl;
- logger << "Address: " << hex << setw(8) << setfill('0') << per->ExceptionAddress << endl;
- logger << "Flags: 0x" << hex << setw(8) << setfill('0') << per->ExceptionFlags << endl;
- switch (per->ExceptionCode)
- {
- case EXCEPTION_ACCESS_VIOLATION:
- if (per->NumberParameters > 0)
- {
- logger << "Cause: ";
- switch (per->ExceptionInformation[0])
- {
- case 0:
- logger << "read";
- break;
- case 1:
- logger << "write";
- break;
- case 8:
- logger << "dep";
- break;
- default:
- logger << "flag(" << per->ExceptionInformation[0] << ')';
- }
- if (per->NumberParameters > 1)
- logger << " 0x" << hex << setw(8) << setfill('0') << per->ExceptionInformation[1];
- logger << endl;
- }
- break;
- case EXCEPTION_IN_PAGE_ERROR:
- if (per->NumberParameters > 0)
- {
- logger << "Cause: ";
- switch (per->ExceptionInformation[0])
- {
- case 0:
- logger << "read";
- break;
- case 1:
- logger << "write";
- break;
- case 8:
- logger << "dep";
- break;
- default:
- logger << "flag(" << per->ExceptionInformation[0] << ')';
- }
- if (per->NumberParameters > 1)
- {
- logger << " 0x" << hex << setw(8) << setfill('0') << per->ExceptionInformation[1];
- logger << " NSTATUS = " << per->ExceptionInformation[2];
- }
- logger << endl;
- }
- break;
- }
- }
- #ifdef ENVIRONMENT32
- logger << "Context: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->ContextFlags << std::endl;
- logger << "CPU:" << std::endl;
- logger << '\t' << "EAX: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Eax;
- logger << '\t' << "EBX: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Ebx;
- logger << '\t' << "ECX: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Ecx;
- logger << '\t' << "EDX: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Edx;
- logger << std::endl;
- logger << '\t' << "ESI: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Esi;
- logger << '\t' << "EDI: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Edi;
- logger << '\t' << "ESP: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Esp;
- logger << '\t' << "EBP: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Ebp;
- logger << std::endl << std::endl;
- logger << '\t' << "EIP: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Eip;
- logger << '\t' << "EFLAGS: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->EFlags;
- logger << std::endl << std::endl;
- logger << '\t' << "CS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegCs;
- logger << '\t' << "DS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegDs;
- logger << '\t' << "ES: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegEs;
- logger << '\t' << "SS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegSs;
- logger << std::endl;
- logger << '\t' << "FS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegFs;
- logger << '\t' << "GS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegGs;
- logger << std::endl << std::endl;
- logger << '\t' << "DR0: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr0;
- logger << '\t' << "DR1: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr1;
- logger << '\t' << "DR2: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr2;
- logger << '\t' << "DR3: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr3;
- logger << std::endl;
- logger << '\t' << "DR6: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr6;
- logger << '\t' << "DR7: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr7;
- logger << std::endl << std::endl;
- logger << "FPU:" << std::endl;
- logger << '\t' << "ControlWord: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->FloatSave.ControlWord << std::endl;
- logger << '\t' << "StatusWord: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->FloatSave.StatusWord << std::endl;
- logger << '\t' << "TagWord: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->FloatSave.TagWord << std::endl;
- logger << '\t' << "ErrorOffset: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->FloatSave.ErrorOffset << std::endl;
- logger << '\t' << "ErrorSelector: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->FloatSave.ErrorSelector << std::endl;
- logger << '\t' << "DataOffset: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->FloatSave.DataOffset << std::endl;
- logger << '\t' << "DataSelector: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->FloatSave.DataSelector << std::endl;
- // logger << '\t' << "Cr0NpxState: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->FloatSave.Cr0NpxState << std::endl;
- unsigned i = 0;
- unsigned char ch;
- /*
- for (unsigned j = 0; j < 10; ++j)
- {
- logger << '\t' << "ST(" << j << "): ";
- for (; i < (j + 1) * 10; ++i)
- {
- ch = pep->ContextRecord->FloatSave.RegisterArea[i];
- logger << hex_nums[ch >> 4] << hex_nums[ch & 0xf] << ' ';
- }
- logger << std::endl;
- }
- logger << std::endl;
- // logger.flush();
- */
- char const * p = (char const *)pep->ContextRecord->Eip;
- char const * end = (char const *)(pep->ContextRecord->Eip + 4096 - pep->ContextRecord->Eip % 4096);
- if (end > p + 256)
- end = p + 256;
- {
- auto l = (logger << "Bytes at EIP:\r\n\t");
- for (i = 0; p < end; ++p, ++i)
- {
- ch = *p;
- l << hex_nums[ch >> 4] << hex_nums[ch & 0xf] << ' ';
- if (i == 7)
- l << " ";
- else if (i == 15)
- {
- l << "\r\n\t";
- i = ~0;
- }
- }
- }
- logger << std::dec;
- // CreateMiniDump(pep);
- #else
- logger << "Context: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->ContextFlags << std::endl;
- logger << "CPU:" << std::endl;
- logger << '\t' << "RAX: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->Rax;
- logger << '\t' << "RBX: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->Rbx;
- logger << std::endl;
- logger << '\t' << "RCX: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->Rcx;
- logger << '\t' << "RDX: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->Rdx;
- logger << std::endl;
- logger << '\t' << "RSI: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->Rsi;
- logger << '\t' << "RDI: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->Rdi;
- logger << std::endl;
- logger << '\t' << "RSP: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->Rsp;
- logger << '\t' << "RBP: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->Rbp;
- logger << std::endl;
- logger << '\t' << "R8: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->R8;
- logger << '\t' << "R9: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->R9;
- logger << std::endl;
- logger << '\t' << "R10: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->R10;
- logger << '\t' << "R11: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->R11;
- logger << std::endl;
- logger << '\t' << "R12: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->R12;
- logger << '\t' << "R13: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->R13;
- logger << std::endl;
- logger << '\t' << "R14: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->R14;
- logger << '\t' << "R15: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->R15;
- logger << std::endl;
- logger << std::endl;
- logger << '\t' << "RIP: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Rip;
- logger << '\t' << "EFLAGS: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->EFlags;
- logger << std::endl << std::endl;
- logger << '\t' << "CS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegCs;
- logger << '\t' << "DS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegDs;
- logger << '\t' << "ES: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegEs;
- logger << '\t' << "SS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegSs;
- logger << std::endl;
- logger << '\t' << "FS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegFs;
- logger << '\t' << "GS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegGs;
- logger << std::endl << std::endl;
- logger << '\t' << "DR0: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr0;
- logger << '\t' << "DR1: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr1;
- logger << '\t' << "DR2: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr2;
- logger << '\t' << "DR3: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr3;
- logger << std::endl;
- logger << '\t' << "DR6: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr6;
- logger << '\t' << "DR7: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr7;
- logger << std::endl << std::endl;
- unsigned i = 0;
- unsigned char ch;
- char const * p = (char const *)pep->ContextRecord->Rip;
- char const * end = (char const *)(pep->ContextRecord->Rip + 4096 - pep->ContextRecord->Rip % 4096);
- if (end > p + 256)
- end = p + 256;
- {
- auto l = (logger << "Bytes at RIP:\r\n\t");
- for (i = 0; p < end; ++p, ++i)
- {
- ch = *p;
- l << hex_nums[ch >> 4] << hex_nums[ch & 0xf] << ' ';
- if (i == 7)
- l << " ";
- else if (i == 15)
- {
- l << "\r\n\t";
- i = ~0;
- }
- }
- }
- logger << std::dec;
- #endif
- std::cerr.flush();
- std::cout.flush();
- std::clog.flush();
- }
- return cont ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement