Advertisement
Guest User

Untitled

a guest
Apr 22nd, 2015
1,050
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.73 KB | None | 0 0
  1. #pragma once
  2. #include <Windows.h>
  3. class CVMTHookManager
  4. {
  5. public:
  6. CVMTHookManager()
  7. {
  8. memset(this, 0, sizeof(CVMTHookManager));
  9. }
  10.  
  11. CVMTHookManager(PDWORD64* ppdwClassBase)
  12. {
  13. bInitialize(ppdwClassBase);
  14. }
  15.  
  16. ~CVMTHookManager()
  17. {
  18. UnHook();
  19. }
  20. bool bInitialize(PDWORD64* ppdwClassBase)
  21. {
  22. m_ppdwClassBase = ppdwClassBase;
  23. m_pdwOldVMT = *ppdwClassBase;
  24. m_dwVMTSize = dwGetVMTCount(*ppdwClassBase);
  25. m_pdwNewVMT = new DWORD64[m_dwVMTSize];
  26. memcpy(m_pdwNewVMT, m_pdwOldVMT, sizeof(DWORD64) * m_dwVMTSize);
  27. *ppdwClassBase = m_pdwNewVMT;
  28. return true;
  29. }
  30. bool bInitialize(PDWORD64** pppdwClassBase) // fix for pp
  31. {
  32. return bInitialize(*pppdwClassBase);
  33. }
  34.  
  35. void UnHook()
  36. {
  37. if (m_ppdwClassBase)
  38. {
  39. *m_ppdwClassBase = m_pdwOldVMT;
  40. }
  41. }
  42.  
  43. void ReHook()
  44. {
  45. if (m_ppdwClassBase)
  46. {
  47. *m_ppdwClassBase = m_pdwNewVMT;
  48. }
  49. }
  50.  
  51. int iGetFuncCount()
  52. {
  53. return (int)m_dwVMTSize;
  54. }
  55.  
  56. DWORD64 dwGetMethodAddress(int Index)
  57. {
  58. if (Index >= 0 && Index <= (int)m_dwVMTSize && m_pdwOldVMT != NULL)
  59. {
  60. return m_pdwOldVMT[Index];
  61. }
  62. return NULL;
  63. }
  64.  
  65. PDWORD64 pdwGetOldVMT()
  66. {
  67. return m_pdwOldVMT;
  68. }
  69.  
  70. DWORD64 dwHookMethod(DWORD64 dwNewFunc, unsigned int iIndex)
  71. {
  72. if (m_pdwNewVMT && m_pdwOldVMT && iIndex <= m_dwVMTSize && iIndex >= 0)
  73. {
  74. m_pdwNewVMT[iIndex] = dwNewFunc;
  75. return m_pdwOldVMT[iIndex];
  76. }
  77.  
  78. return NULL;
  79. }
  80.  
  81. private:
  82. DWORD64 dwGetVMTCount(PDWORD64 pdwVMT)
  83. {
  84. DWORD64 dwIndex = 0;
  85.  
  86. for (dwIndex = 0; pdwVMT[dwIndex]; dwIndex++)
  87. {
  88. if (IsBadCodePtr((FARPROC)pdwVMT[dwIndex]))
  89. {
  90. break;
  91. }
  92. }
  93. return dwIndex;
  94. }
  95. PDWORD64* m_ppdwClassBase;
  96. PDWORD64 m_pdwNewVMT, m_pdwOldVMT;
  97. DWORD64 m_dwVMTSize;
  98. };
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement