Advertisement
Guest User

Untitled

a guest
Aug 23rd, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 12.04 KB | None | 0 0
  1.  
  2. LONG __stdcall ExceptionFilter(EXCEPTION_POINTERS* pep)
  3. {
  4.     _EXCEPTION_RECORD * per = pep->ExceptionRecord;
  5.     bool cont = per->ExceptionCode != EXCEPTION_BREAKPOINT && per->ExceptionCode != EXCEPTION_SINGLE_STEP;
  6.  
  7.     //  if(per->ExceptionFlags or !cont)
  8.     {
  9.         logger.error() << "Runtime exception ";
  10.         for (; per != 0; per = per->ExceptionRecord)
  11.         {
  12.             switch (per->ExceptionCode)
  13.             {
  14. #define __tmp_(n) case n : logger << #n; break;
  15.                 __tmp_(EXCEPTION_ACCESS_VIOLATION);
  16.                 __tmp_(EXCEPTION_ARRAY_BOUNDS_EXCEEDED);
  17.                 __tmp_(EXCEPTION_BREAKPOINT);
  18.                 __tmp_(EXCEPTION_DATATYPE_MISALIGNMENT);
  19.                 __tmp_(EXCEPTION_FLT_DENORMAL_OPERAND);
  20.                 __tmp_(EXCEPTION_FLT_DIVIDE_BY_ZERO);
  21.                 __tmp_(EXCEPTION_FLT_INEXACT_RESULT);
  22.                 __tmp_(EXCEPTION_FLT_INVALID_OPERATION);
  23.                 __tmp_(EXCEPTION_FLT_OVERFLOW);
  24.                 __tmp_(EXCEPTION_FLT_STACK_CHECK);
  25.                 __tmp_(EXCEPTION_FLT_UNDERFLOW);
  26.                 __tmp_(EXCEPTION_ILLEGAL_INSTRUCTION);
  27.                 __tmp_(EXCEPTION_IN_PAGE_ERROR);
  28.                 __tmp_(EXCEPTION_INT_DIVIDE_BY_ZERO);
  29.                 __tmp_(EXCEPTION_INT_OVERFLOW);
  30.                 __tmp_(EXCEPTION_INVALID_DISPOSITION);
  31.                 __tmp_(EXCEPTION_NONCONTINUABLE_EXCEPTION);
  32.                 __tmp_(EXCEPTION_PRIV_INSTRUCTION);
  33.                 __tmp_(EXCEPTION_SINGLE_STEP);
  34.                 __tmp_(EXCEPTION_STACK_OVERFLOW);
  35. #undef __tmp_
  36.             default:
  37.                 logger << "Unknown exception code: " << hex << per->ExceptionCode;
  38.             }
  39.             logger << endl;
  40.  
  41.             logger << "Address: " << hex << setw(8) << setfill('0') << per->ExceptionAddress << endl;
  42.             logger << "Flags: 0x" << hex << setw(8) << setfill('0') << per->ExceptionFlags << endl;
  43.  
  44.             switch (per->ExceptionCode)
  45.             {
  46.             case EXCEPTION_ACCESS_VIOLATION:
  47.                 if (per->NumberParameters > 0)
  48.                 {
  49.                     logger << "Cause: ";
  50.                     switch (per->ExceptionInformation[0])
  51.                     {
  52.                     case 0:
  53.                         logger << "read";
  54.                         break;
  55.                     case 1:
  56.                         logger << "write";
  57.                         break;
  58.                     case 8:
  59.                         logger << "dep";
  60.                         break;
  61.                     default:
  62.                         logger << "flag(" << per->ExceptionInformation[0] << ')';
  63.                     }
  64.                     if (per->NumberParameters > 1)
  65.                         logger << " 0x" << hex << setw(8) << setfill('0') << per->ExceptionInformation[1];
  66.                     logger << endl;
  67.                 }
  68.                 break;
  69.             case EXCEPTION_IN_PAGE_ERROR:
  70.                 if (per->NumberParameters > 0)
  71.                 {
  72.                     logger << "Cause: ";
  73.                     switch (per->ExceptionInformation[0])
  74.                     {
  75.                     case 0:
  76.                         logger << "read";
  77.                         break;
  78.                     case 1:
  79.                         logger << "write";
  80.                         break;
  81.                     case 8:
  82.                         logger << "dep";
  83.                         break;
  84.                     default:
  85.                         logger << "flag(" << per->ExceptionInformation[0] << ')';
  86.                     }
  87.                     if (per->NumberParameters > 1)
  88.                     {
  89.                         logger << " 0x" << hex << setw(8) << setfill('0') << per->ExceptionInformation[1];
  90.  
  91.                         logger << " NSTATUS = " << per->ExceptionInformation[2];
  92.                     }
  93.  
  94.                     logger << endl;
  95.                 }
  96.                 break;
  97.             }
  98.         }
  99.  
  100. #ifdef ENVIRONMENT32
  101.         logger << "Context: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->ContextFlags << std::endl;
  102.         logger << "CPU:" << std::endl;
  103.         logger << '\t' << "EAX: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Eax;
  104.         logger << '\t' << "EBX: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Ebx;
  105.         logger << '\t' << "ECX: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Ecx;
  106.         logger << '\t' << "EDX: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Edx;
  107.         logger << std::endl;
  108.         logger << '\t' << "ESI: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Esi;
  109.         logger << '\t' << "EDI: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Edi;
  110.         logger << '\t' << "ESP: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Esp;
  111.         logger << '\t' << "EBP: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Ebp;
  112.         logger << std::endl << std::endl;
  113.         logger << '\t' << "EIP: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Eip;
  114.         logger << '\t' << "EFLAGS: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->EFlags;
  115.         logger << std::endl << std::endl;
  116.         logger << '\t' << "CS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegCs;
  117.         logger << '\t' << "DS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegDs;
  118.         logger << '\t' << "ES: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegEs;
  119.         logger << '\t' << "SS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegSs;
  120.         logger << std::endl;
  121.         logger << '\t' << "FS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegFs;
  122.         logger << '\t' << "GS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegGs;
  123.         logger << std::endl << std::endl;
  124.         logger << '\t' << "DR0: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr0;
  125.         logger << '\t' << "DR1: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr1;
  126.         logger << '\t' << "DR2: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr2;
  127.         logger << '\t' << "DR3: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr3;
  128.         logger << std::endl;
  129.         logger << '\t' << "DR6: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr6;
  130.         logger << '\t' << "DR7: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr7;
  131.         logger << std::endl << std::endl;
  132.         logger << "FPU:" << std::endl;
  133.         logger << '\t' << "ControlWord: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->FloatSave.ControlWord << std::endl;
  134.         logger << '\t' << "StatusWord: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->FloatSave.StatusWord << std::endl;
  135.         logger << '\t' << "TagWord: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->FloatSave.TagWord << std::endl;
  136.         logger << '\t' << "ErrorOffset: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->FloatSave.ErrorOffset << std::endl;
  137.         logger << '\t' << "ErrorSelector: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->FloatSave.ErrorSelector << std::endl;
  138.         logger << '\t' << "DataOffset: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->FloatSave.DataOffset << std::endl;
  139.         logger << '\t' << "DataSelector: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->FloatSave.DataSelector << std::endl;
  140. //      logger << '\t' << "Cr0NpxState: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->FloatSave.Cr0NpxState << std::endl;
  141.  
  142.         unsigned i = 0;
  143.         unsigned char ch;
  144.         /*
  145.         for (unsigned j = 0; j < 10; ++j)
  146.         {
  147.             logger << '\t' << "ST(" << j << "): ";
  148.             for (; i < (j + 1) * 10; ++i)
  149.             {
  150.                 ch = pep->ContextRecord->FloatSave.RegisterArea[i];
  151.                 logger << hex_nums[ch >> 4] << hex_nums[ch & 0xf] << ' ';
  152.             }
  153.             logger << std::endl;
  154.         }
  155.  
  156.         logger << std::endl;
  157. //      logger.flush();
  158.         */
  159.  
  160.         char const * p = (char const *)pep->ContextRecord->Eip;
  161.         char const * end = (char const *)(pep->ContextRecord->Eip + 4096 - pep->ContextRecord->Eip % 4096);
  162.         if (end > p + 256)
  163.             end = p + 256;
  164.  
  165.         {
  166.             auto l = (logger << "Bytes at EIP:\r\n\t");
  167.  
  168.             for (i = 0; p < end; ++p, ++i)
  169.             {
  170.                 ch = *p;
  171.                 l << hex_nums[ch >> 4] << hex_nums[ch & 0xf] << ' ';
  172.                 if (i == 7)
  173.                     l << "  ";
  174.                 else if (i == 15)
  175.                 {
  176.                     l << "\r\n\t";
  177.                     i = ~0;
  178.                 }
  179.             }
  180.         }
  181.  
  182.  
  183.         logger << std::dec;
  184.  
  185. //      CreateMiniDump(pep);
  186. #else
  187.         logger << "Context: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->ContextFlags << std::endl;
  188.         logger << "CPU:" << std::endl;
  189.         logger << '\t' << "RAX: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->Rax;
  190.         logger << '\t' << "RBX: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->Rbx;
  191.         logger << std::endl;
  192.         logger << '\t' << "RCX: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->Rcx;
  193.         logger << '\t' << "RDX: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->Rdx;
  194.         logger << std::endl;
  195.         logger << '\t' << "RSI: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->Rsi;
  196.         logger << '\t' << "RDI: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->Rdi;
  197.         logger << std::endl;
  198.         logger << '\t' << "RSP: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->Rsp;
  199.         logger << '\t' << "RBP: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->Rbp;
  200.         logger << std::endl;
  201.         logger << '\t' << "R8:  0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->R8;
  202.         logger << '\t' << "R9:  0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->R9;
  203.         logger << std::endl;
  204.         logger << '\t' << "R10: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->R10;
  205.         logger << '\t' << "R11: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->R11;
  206.         logger << std::endl;
  207.         logger << '\t' << "R12: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->R12;
  208.         logger << '\t' << "R13: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->R13;
  209.         logger << std::endl;
  210.         logger << '\t' << "R14: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->R14;
  211.         logger << '\t' << "R15: 0x" << std::hex << std::setw(16) << std::setfill('0') << pep->ContextRecord->R15;
  212.         logger << std::endl;
  213.  
  214.         logger << std::endl;
  215.         logger << '\t' << "RIP: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Rip;
  216.         logger << '\t' << "EFLAGS: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->EFlags;
  217.         logger << std::endl << std::endl;
  218.         logger << '\t' << "CS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegCs;
  219.         logger << '\t' << "DS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegDs;
  220.         logger << '\t' << "ES: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegEs;
  221.         logger << '\t' << "SS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegSs;
  222.         logger << std::endl;
  223.         logger << '\t' << "FS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegFs;
  224.         logger << '\t' << "GS: 0x" << std::hex << std::setw(4) << std::setfill('0') << pep->ContextRecord->SegGs;
  225.         logger << std::endl << std::endl;
  226.         logger << '\t' << "DR0: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr0;
  227.         logger << '\t' << "DR1: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr1;
  228.         logger << '\t' << "DR2: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr2;
  229.         logger << '\t' << "DR3: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr3;
  230.         logger << std::endl;
  231.         logger << '\t' << "DR6: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr6;
  232.         logger << '\t' << "DR7: 0x" << std::hex << std::setw(8) << std::setfill('0') << pep->ContextRecord->Dr7;
  233.         logger << std::endl << std::endl;
  234.  
  235.         unsigned i = 0;
  236.         unsigned char ch;
  237.  
  238.         char const * p = (char const *)pep->ContextRecord->Rip;
  239.         char const * end = (char const *)(pep->ContextRecord->Rip + 4096 - pep->ContextRecord->Rip % 4096);
  240.         if (end > p + 256)
  241.             end = p + 256;
  242.  
  243.         {
  244.             auto l = (logger << "Bytes at RIP:\r\n\t");
  245.  
  246.             for (i = 0; p < end; ++p, ++i)
  247.             {
  248.                 ch = *p;
  249.                 l << hex_nums[ch >> 4] << hex_nums[ch & 0xf] << ' ';
  250.                 if (i == 7)
  251.                     l << "  ";
  252.                 else if (i == 15)
  253.                 {
  254.                     l << "\r\n\t";
  255.                     i = ~0;
  256.                 }
  257.             }
  258.         }
  259.  
  260.  
  261.         logger << std::dec;
  262. #endif
  263.  
  264.         std::cerr.flush();
  265.         std::cout.flush();
  266.         std::clog.flush();
  267.  
  268.     }
  269.  
  270.     return cont ? EXCEPTION_EXECUTE_HANDLER : EXCEPTION_CONTINUE_SEARCH;
  271. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement