summaryrefslogtreecommitdiff
path: root/src/plugins/HookSystem.hpp
blob: 004947330acfe3c5c24d3de8a408f4b2d6479b77 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
#pragma once

#include <string>
#include <vector>
#include <memory>

#define HANDLE void*

class CFunctionHook {
  public:
    CFunctionHook(HANDLE owner, void* source, void* destination);
    ~CFunctionHook();

    bool hook();
    bool unhook();

    CFunctionHook(const CFunctionHook&)            = delete;
    CFunctionHook(CFunctionHook&&)                 = delete;
    CFunctionHook& operator=(const CFunctionHook&) = delete;
    CFunctionHook& operator=(CFunctionHook&&)      = delete;

    void*          m_pOriginal = nullptr;

  private:
    void*                                       m_pSource         = nullptr;
    void*                                       m_pFunctionAddr   = nullptr;
    void*                                       m_pTrampolineAddr = nullptr;
    void*                                       m_pDestination    = nullptr;
    size_t                                      m_iHookLen        = 0;
    size_t                                      m_iTrampoLen      = 0;
    HANDLE                                      m_pOwner          = nullptr;
    bool                                        m_bActive         = false;

    std::vector<std::pair<size_t, std::string>> m_vTrampolineRIPUses;

    void*                                       m_pOriginalBytes = nullptr;

    size_t                                      probeMinimumJumpSize(void* start, size_t min);
    size_t                                      getInstructionLenAt(void* start);

    friend class CHookSystem;
};

class CHookSystem {
  public:
    CFunctionHook* initHook(HANDLE handle, void* source, void* destination);
    bool           removeHook(CFunctionHook* hook);

    void           removeAllHooksFrom(HANDLE handle);

  private:
    std::vector<std::unique_ptr<CFunctionHook>> m_vHooks;
};

inline std::unique_ptr<CHookSystem> g_pFunctionHookSystem;