Advertisement
Guest User

Cristian Adam

a guest
Feb 24th, 2011
457
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.82 KB | None | 0 0
  1. // (c) 2011 Cristian Adam
  2.  
  3. #include <iostream>
  4. #include <ctime>
  5. #include <vector>
  6. #include <windows.h>
  7. #include "APIHook.h"
  8.  
  9. bool showCrashDialog = false;
  10.  
  11. BOOL WINAPI OurHeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem);
  12. typedef BOOL (WINAPI *OURHEAPFREEPROC)(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem);
  13.  
  14. CAPIHook g_heapFree("kernel32.dll", "HeapFree", (PROC)OurHeapFree);
  15.  
  16. BOOL WINAPI OurHeapFree(HANDLE hHeap, DWORD dwFlags, LPVOID lpMem)
  17. {
  18.     BOOL result = ((OURHEAPFREEPROC)(PROC)*g_heapFree)(hHeap, dwFlags, lpMem);
  19.  
  20.     if (!result)
  21.     {
  22.         std::cout << __FUNCTION__ << " Error: 0x" << std::hex << ::GetLastError() << std::endl;
  23.         throw 0;
  24.     }
  25.  
  26.     return result;
  27. }
  28.  
  29. LONG WINAPI RedirectedSetUnhandledExceptionFilter(EXCEPTION_POINTERS * /*ExceptionInfo*/)
  30. {
  31.     // When the CRT calls SetUnhandledExceptionFilter with NULL parameter
  32.     // our handler will not get removed.
  33.     return 0;
  34. }
  35.  
  36. LONG WINAPI OurSetUnhandledExceptionFilter(EXCEPTION_POINTERS * /*ExceptionInfo*/)
  37. {
  38.     std::cout << "Gotcha!" << std::endl;
  39.  
  40.     return showCrashDialog ? EXCEPTION_CONTINUE_SEARCH : EXCEPTION_EXECUTE_HANDLER;
  41. }
  42.  
  43. void MemoryAccessCrash()
  44. {
  45.     std::cout << "Normal null pointer crash" << std::endl;
  46.  
  47.     char *p = 0;
  48.     *p = 5;
  49. }
  50.  
  51. void OutOfBoundsVectorCrash()
  52. {
  53.     std::cout << "std::vector out of bounds crash!" << std::endl;
  54.  
  55.     std::vector<int> v;
  56.     v[0] = 5;
  57. }
  58.  
  59. void AbortCrash()
  60. {
  61.     std::cout << "Calling Abort" << std::endl;
  62.     abort();
  63. }
  64.  
  65. void VirtualFunctionCallCrash()
  66. {
  67.     struct B
  68.     {
  69.         B()
  70.         {
  71.             std::cout << "Pure Virtual Function Call crash!" << std::endl;
  72.             Bar();
  73.         }
  74.  
  75.         virtual void Foo() = 0;
  76.  
  77.         void Bar()
  78.         {
  79.             Foo();
  80.         }
  81.     };
  82.  
  83.     struct D: public B
  84.     {
  85.         void Foo()
  86.         {
  87.         }
  88.     };
  89.  
  90.     B* b = new D;
  91.     // Just to silence the warning C4101: 'VirtualFunctionCallCrash::B::Foo' : unreferenced local variable
  92.     b->Foo();
  93. }
  94.  
  95. void DoubleDeleteCrash()
  96. {
  97.     std::cout << "Double delete" << std::endl;
  98.     char * buf = new char [10000];
  99.     delete [] buf;
  100.     delete [] buf;
  101. }
  102.  
  103. int main()
  104. {
  105.     ::SetUnhandledExceptionFilter(OurSetUnhandledExceptionFilter);
  106.  
  107.     CAPIHook apiHook("kernel32.dll", "SetUnhandledExceptionFilter", (PROC)RedirectedSetUnhandledExceptionFilter);
  108.  
  109.     srand(static_cast<unsigned int>(std::time(0)));
  110.     //int option = rand() % 5;
  111.     int option = 4;
  112.  
  113.     switch (option)
  114.     {
  115.     case 0:
  116.         MemoryAccessCrash();
  117.         break;
  118.     case 1:
  119.         OutOfBoundsVectorCrash();
  120.         break;
  121.     case 2:
  122.         AbortCrash();
  123.         break;
  124.     case 3:
  125.         VirtualFunctionCallCrash();
  126.         break;
  127.     case 4:
  128.         DoubleDeleteCrash();
  129.         break;
  130.     }
  131.  
  132.     return 0;
  133. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement