diff options
| author | jbzdarkid <jbzdarkid@gmail.com> | 2019-11-16 10:27:06 -0800 |
|---|---|---|
| committer | jbzdarkid <jbzdarkid@gmail.com> | 2019-11-16 10:27:06 -0800 |
| commit | 0baa521ba34d2cd4e0f732f83d23b807605786a2 (patch) | |
| tree | dfb01163d291ee846c7a5840ffc08e089a7fb8e6 /Source/Memory.cpp | |
| parent | 0d0abe2ee56382c5751dd12fbca75af87773879f (diff) | |
| download | witness-tutorializer-0baa521ba34d2cd4e0f732f83d23b807605786a2.tar.gz witness-tutorializer-0baa521ba34d2cd4e0f732f83d23b807605786a2.tar.bz2 witness-tutorializer-0baa521ba34d2cd4e0f732f83d23b807605786a2.zip | |
More and more progress.
Split out functions in serializer Figured out how to allocate memory (for sequences)
Diffstat (limited to 'Source/Memory.cpp')
| -rw-r--r-- | Source/Memory.cpp | 25 |
1 files changed, 23 insertions, 2 deletions
| diff --git a/Source/Memory.cpp b/Source/Memory.cpp index 98b06f9..bc0725b 100644 --- a/Source/Memory.cpp +++ b/Source/Memory.cpp | |||
| @@ -70,7 +70,6 @@ void Memory::Heartbeat(HWND window) { | |||
| 70 | PostMessage(window, WM_COMMAND, HEARTBEAT, (LPARAM)ProcStatus::Running); | 70 | PostMessage(window, WM_COMMAND, HEARTBEAT, (LPARAM)ProcStatus::Running); |
| 71 | } | 71 | } |
| 72 | 72 | ||
| 73 | |||
| 74 | [[nodiscard]] | 73 | [[nodiscard]] |
| 75 | bool Memory::Initialize() { | 74 | bool Memory::Initialize() { |
| 76 | // First, get the handle of the process | 75 | // First, get the handle of the process |
| @@ -106,6 +105,7 @@ bool Memory::Initialize() { | |||
| 106 | std::cerr << "Couldn't locate base address" << std::endl; | 105 | std::cerr << "Couldn't locate base address" << std::endl; |
| 107 | return false; | 106 | return false; |
| 108 | } | 107 | } |
| 108 | |||
| 109 | return true; | 109 | return true; |
| 110 | } | 110 | } |
| 111 | 111 | ||
| @@ -161,7 +161,7 @@ void Memory::ThrowError() { | |||
| 161 | } | 161 | } |
| 162 | 162 | ||
| 163 | void* Memory::ComputeOffset(std::vector<int> offsets) { | 163 | void* Memory::ComputeOffset(std::vector<int> offsets) { |
| 164 | // Leave off the last offset, since it will be either read/write, and may not be of type unitptr_t. | 164 | // Leave off the last offset, since it will be either read/write, and may not be of type uintptr_t. |
| 165 | int final_offset = offsets.back(); | 165 | int final_offset = offsets.back(); |
| 166 | offsets.pop_back(); | 166 | offsets.pop_back(); |
| 167 | 167 | ||
| @@ -176,6 +176,9 @@ void* Memory::ComputeOffset(std::vector<int> offsets) { | |||
| 176 | if (bool result = !ReadProcessMemory(_handle, reinterpret_cast<LPVOID>(cumulativeAddress), &computedAddress, sizeof(uintptr_t), NULL)) { | 176 | if (bool result = !ReadProcessMemory(_handle, reinterpret_cast<LPVOID>(cumulativeAddress), &computedAddress, sizeof(uintptr_t), NULL)) { |
| 177 | ThrowError(); | 177 | ThrowError(); |
| 178 | } | 178 | } |
| 179 | if (computedAddress == 0) { // Attempting to dereference a nullptr | ||
| 180 | ThrowError(); | ||
| 181 | } | ||
| 179 | _computedAddresses[cumulativeAddress] = computedAddress; | 182 | _computedAddresses[cumulativeAddress] = computedAddress; |
| 180 | } | 183 | } |
| 181 | 184 | ||
| @@ -183,3 +186,21 @@ void* Memory::ComputeOffset(std::vector<int> offsets) { | |||
| 183 | } | 186 | } |
| 184 | return reinterpret_cast<void*>(cumulativeAddress + final_offset); | 187 | return reinterpret_cast<void*>(cumulativeAddress + final_offset); |
| 185 | } | 188 | } |
| 189 | |||
| 190 | uintptr_t Memory::Allocate(size_t bytes) { | ||
| 191 | uintptr_t current = _freeMem; | ||
| 192 | _freeMem += bytes; | ||
| 193 | |||
| 194 | if (_freeMem > _freeMemEnd) { | ||
| 195 | // If we don't have enough space at our current location, go allocate some more space. | ||
| 196 | // Note that the remaining space in our current page is unused. Oh well. | ||
| 197 | _freeMem = reinterpret_cast<uintptr_t>(::VirtualAllocEx(_handle, NULL, 0x1000, MEM_RESERVE | MEM_COMMIT, PAGE_READWRITE)); | ||
| 198 | _freeMemEnd = _freeMem + 0x1000; | ||
| 199 | |||
| 200 | current = _freeMem; | ||
| 201 | _freeMem += bytes; | ||
| 202 | assert(_freeMem <= _freeMemEnd); // Don't allocate data > 0x1000 at a time. Duh. | ||
| 203 | } | ||
| 204 | |||
| 205 | return current; | ||
| 206 | } | ||
