diff options
Diffstat (limited to 'Source/Memory.h')
-rw-r--r-- | Source/Memory.h | 132 |
1 files changed, 66 insertions, 66 deletions
diff --git a/Source/Memory.h b/Source/Memory.h index af4f0ae..70a271e 100644 --- a/Source/Memory.h +++ b/Source/Memory.h | |||
@@ -19,103 +19,103 @@ enum class ProcStatus { | |||
19 | // http://stackoverflow.com/q/32798185 | 19 | // http://stackoverflow.com/q/32798185 |
20 | // http://stackoverflow.com/q/36018838 | 20 | // http://stackoverflow.com/q/36018838 |
21 | // http://stackoverflow.com/q/1387064 | 21 | // http://stackoverflow.com/q/1387064 |
22 | // https://github.com/fkloiber/witness-trainer/blob/master/source/foreign_process_memory.cpp | ||
22 | class Memory final : public std::enable_shared_from_this<Memory> { | 23 | class Memory final : public std::enable_shared_from_this<Memory> { |
23 | public: | 24 | public: |
24 | Memory(const std::wstring& processName); | 25 | Memory(const std::wstring& processName); |
25 | ~Memory(); | 26 | ~Memory(); |
26 | void StartHeartbeat(HWND window, std::chrono::milliseconds beat = std::chrono::milliseconds(1000)); | 27 | void StartHeartbeat(HWND window, std::chrono::milliseconds beat = std::chrono::milliseconds(1000)); |
27 | 28 | ||
28 | Memory(const Memory& memory) = delete; | 29 | Memory(const Memory& memory) = delete; |
29 | Memory& operator=(const Memory& other) = delete; | 30 | Memory& operator=(const Memory& other) = delete; |
30 | 31 | ||
31 | template <class T> | 32 | template <class T> |
32 | std::vector<T> ReadArray(int panel, int offset, int size) { | 33 | std::vector<T> ReadArray(int id, int offset, int size) { |
33 | return ReadData<T>({GLOBALS, 0x18, panel*8, offset, 0}, size); | 34 | return ReadData<T>({GLOBALS, 0x18, id*8, offset, 0}, size); |
34 | } | 35 | } |
35 | 36 | ||
36 | template <class T> | 37 | template <class T> |
37 | void WriteArray(int panel, int offset, const std::vector<T>& data) { | 38 | void WriteArray(int id, int offset, const std::vector<T>& data) { |
38 | WriteData({GLOBALS, 0x18, panel*8, offset, 0}, data); | 39 | WriteData({GLOBALS, 0x18, id*8, offset, 0}, data); |
39 | } | 40 | } |
40 | 41 | ||
41 | template <class T> | 42 | template <class T> |
42 | void WriteNewArray(int panel, int offset, const std::vector<T>& data) { | 43 | void WriteNewArray(int id, int offset, const std::vector<T>& data) { |
43 | std::vector<uintptr_t> newAddr = {Allocate(data.size() * sizeof(T))}; | 44 | uintptr_t addr = VirtualAllocEx(_handle, nullptr, data.size() * sizeof(T), MEM_RESERVE | MEM_COMMIT, MEM_READWRITE); |
44 | WritePanelData(panel, offset, newAddr); | 45 | _allocations.emplace_back(addr); |
45 | WriteArray(panel, offset, data); | 46 | WriteEntityData(id, offset, addr); |
46 | } | 47 | WriteArray(id, offset, data); |
48 | } | ||
47 | 49 | ||
48 | template <class T> | 50 | template <class T> |
49 | std::vector<T> ReadPanelData(int panel, int offset, size_t size) { | 51 | std::vector<T> ReadEntityData(int id, int offset, size_t size) { |
50 | return ReadData<T>({GLOBALS, 0x18, panel*8, offset}, size); | 52 | return ReadData<T>({GLOBALS, 0x18, id*8, offset}, size); |
51 | } | 53 | } |
52 | 54 | ||
53 | template <class T> | 55 | template <class T> |
54 | void WritePanelData(int panel, int offset, const std::vector<T>& data) { | 56 | void WriteEntityData(int id, int offset, const std::vector<T>& data) { |
55 | WriteData({GLOBALS, 0x18, panel*8, offset}, data); | 57 | WriteData({GLOBALS, 0x18, id*8, offset}, data); |
56 | } | 58 | } |
57 | 59 | ||
58 | void AddSigScan(const std::vector<byte>& scanBytes, const std::function<void(int index)>& scanFunc); | 60 | void AddSigScan(const std::vector<byte>& scanBytes, const std::function<void(int index)>& scanFunc); |
59 | int ExecuteSigScans(); | 61 | int ExecuteSigScans(); |
60 | 62 | ||
61 | private: | 63 | private: |
62 | template<class T> | 64 | template<class T> |
63 | std::vector<T> ReadData(const std::vector<int>& offsets, size_t numItems) { | 65 | std::vector<T> ReadData(const std::vector<int>& offsets, size_t numItems) { |
64 | if (numItems == 0) return {}; | 66 | if (numItems == 0) return {}; |
65 | std::vector<T> data; | 67 | std::vector<T> data; |
66 | data.resize(numItems); | 68 | data.resize(numItems); |
67 | void* computedOffset = ComputeOffset(offsets); | 69 | void* computedOffset = ComputeOffset(offsets); |
68 | for (int i=0; i<5; i++) { | 70 | for (int i=0; i<5; i++) { |
69 | if (ReadProcessMemory(_handle, computedOffset, &data[0], sizeof(T) * numItems, nullptr)) { | 71 | if (ReadProcessMemory(_handle, computedOffset, &data[0], sizeof(T) * numItems, nullptr)) { |
70 | if (i != 0) { | 72 | if (i != 0) { |
71 | int k = 0; | 73 | int k = 0; |
72 | } | 74 | } |
73 | return data; | 75 | return data; |
74 | } | 76 | } |
75 | } | 77 | } |
76 | ThrowError(); | 78 | ThrowError(); |
77 | return {}; | 79 | return {}; |
78 | } | 80 | } |
79 | 81 | ||
80 | template <class T> | 82 | template <class T> |
81 | void WriteData(const std::vector<int>& offsets, const std::vector<T>& data) { | 83 | void WriteData(const std::vector<int>& offsets, const std::vector<T>& data) { |
82 | if (data.empty()) return; | 84 | if (data.empty()) return; |
83 | void* computedOffset = ComputeOffset(offsets); | 85 | void* computedOffset = ComputeOffset(offsets); |
84 | for (int i=0; i<5; i++) { | 86 | for (int i=0; i<5; i++) { |
85 | if (WriteProcessMemory(_handle, computedOffset, &data[0], sizeof(T) * data.size(), nullptr)) { | 87 | if (WriteProcessMemory(_handle, computedOffset, &data[0], sizeof(T) * data.size(), nullptr)) { |
86 | if (i != 0) { | 88 | if (i != 0) { |
87 | int k = 0; | 89 | int k = 0; |
88 | } | 90 | } |
89 | return; | 91 | return; |
90 | } | 92 | } |
91 | } | 93 | } |
92 | ThrowError(); | 94 | ThrowError(); |
93 | } | 95 | } |
94 | 96 | ||
95 | void Heartbeat(HWND window); | 97 | void Heartbeat(HWND window); |
96 | bool Initialize(); | 98 | bool Initialize(); |
97 | void ThrowError(); | 99 | void ThrowError(); |
98 | void* ComputeOffset(std::vector<int> offsets); | 100 | void* ComputeOffset(std::vector<int> offsets); |
99 | uintptr_t Allocate(size_t bytes); | ||
100 | 101 | ||
101 | int _previousFrame = 0; | 102 | int _previousFrame = 0; |
102 | bool _threadActive = false; | 103 | bool _threadActive = false; |
103 | std::thread _thread; | 104 | std::thread _thread; |
104 | std::wstring _processName; | 105 | std::wstring _processName; |
105 | std::map<uintptr_t, uintptr_t> _computedAddresses; | 106 | std::map<uintptr_t, uintptr_t> _computedAddresses; |
106 | uintptr_t _baseAddress = 0; | 107 | uintptr_t _baseAddress = 0; |
107 | HANDLE _handle = nullptr; | 108 | HANDLE _handle = nullptr; |
108 | uintptr_t _freeMem = 0; | 109 | std::vector<uintptr_t> _allocations; |
109 | uintptr_t _freeMemEnd = 0; | 110 | struct SigScan { |
110 | struct SigScan { | 111 | std::function<void(int)> scanFunc; |
111 | std::function<void(int)> scanFunc; | 112 | bool found; |
112 | bool found; | 113 | }; |
113 | }; | 114 | std::map<std::vector<byte>, SigScan> _sigScans; |
114 | std::map<std::vector<byte>, SigScan> _sigScans; | ||
115 | 115 | ||
116 | friend class Temp; | 116 | friend class Temp; |
117 | friend class ChallengeRandomizer; | 117 | friend class ChallengeRandomizer; |
118 | friend class Randomizer; | 118 | friend class Randomizer; |
119 | }; | 119 | }; |
120 | 120 | ||
121 | #if GLOBALS == 0x5B28C0 | 121 | #if GLOBALS == 0x5B28C0 |