|
| 1 | +#include "FAllocHook.h" |
| 2 | +#include <containers.hpp> |
| 3 | +#include "AdapterTracy.hpp" |
| 4 | +extern std::shared_ptr<ProfilerAdapter> GProfilerAdapter; |
| 5 | +#include <Tracy.hpp> |
| 6 | +using namespace std::string_view_literals; |
| 7 | + |
| 8 | +FAllocHook::FAllocHook() |
| 9 | +{ |
| 10 | +} |
| 11 | + |
| 12 | + |
| 13 | +FAllocHook::~FAllocHook() |
| 14 | +{ |
| 15 | +} |
| 16 | + |
| 17 | + |
| 18 | +extern "C" { |
| 19 | + uintptr_t engineAlloc; |
| 20 | + uintptr_t engineFree; |
| 21 | + intercept::types::rv_pool_allocator* freealloctmp; |
| 22 | + intercept::types::rv_pool_allocator* allocalloctmp; |
| 23 | + |
| 24 | + void afterAlloc() { |
| 25 | + auto tracyProf = std::reinterpret_pointer_cast<AdapterTracy>(GProfilerAdapter); |
| 26 | + tracyProf->setCounter(allocalloctmp->_allocName, allocalloctmp->allocated_count); |
| 27 | + } |
| 28 | + |
| 29 | + void afterFree() { |
| 30 | + auto tracyProf = std::reinterpret_pointer_cast<AdapterTracy>(GProfilerAdapter); |
| 31 | + tracyProf->setCounter(freealloctmp->_allocName, freealloctmp->allocated_count); |
| 32 | + } |
| 33 | + |
| 34 | + |
| 35 | + void engineAllocRedir(); |
| 36 | + void engineFreeRedir(); |
| 37 | +} |
| 38 | + |
| 39 | + |
| 40 | +HookManager::Pattern pat_allocReg{ // "Out of FastCAlloc slots" |
| 41 | + "xxxxxxxxxxxxxxx?????x????xxx????xx????xxxxx????xxxxxxxxxxx????xxxxxxxxx????x????xxxxxxxxx"sv, |
| 42 | + "\x40\x53\x48\x83\xEC\x30\x45\x33\xC9\x48\x8B\xD9\xC7\x44\x24\x00\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x48\x63\x15\x00\x00\x00\x00\x81\xFA\x00\x00\x00\x00\x7D\x1C\x48\x8D\x0D\x00\x00\x00\x00\x48\x8B\xC3\x48\x89\x1C\xD1\xFF\xC2\x89\x15\x00\x00\x00\x00\x48\x83\xC4\x30\x5B\xC3\x48\x8D\x0D\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x48\x8B\xC3\x48\x83\xC4\x30\x5B\xC3"sv |
| 43 | +}; |
| 44 | + |
| 45 | +HookManager::Pattern pat_allocC{ |
| 46 | + "xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx????xxxx????xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx????xxxxxxxxxxx"sv, |
| 47 | + "\x40\x53\x48\x83\xEC\x20\xFF\x41\x60\x48\x8B\x41\x08\x48\x8B\xD9\x48\x3B\xC1\x74\x0B\x48\x85\xC0\x74\x06\x48\x83\xC0\xE0\x75\x2B\x48\x8D\x41\x18\x48\x8B\x49\x20\x48\x3B\xC8\x74\x0E\x48\x85\xC9\x74\x09\x48\x8D\x41\xE0\x48\x85\xC0\x75\x10\x48\x8B\xCB\xE8\x00\x00\x00\x00\x84\xC0\x0F\x84\x00\x00\x00\x00\x4C\x8B\x43\x08\x32\xC9\x45\x33\xD2\x4C\x3B\xC3\x74\x0B\x4D\x85\xC0\x74\x06\x49\x83\xC0\xE0\x75\x2A\x4C\x8B\x43\x20\x48\x8D\x43\x18\x4C\x3B\xC0\x0F\x84\x00\x00\x00\x00\x4D\x85\xC0\x74\x06\x49\x83\xC0\xE0\xEB\x03"sv |
| 48 | +}; |
| 49 | + |
| 50 | +HookManager::Pattern pat_freeC{ |
| 51 | + "xxxxx????xxxxxxxxxxxxx?xxxxxxxxxxxxxxxxxxxxxxx????x????xxxxxx????xxxxxxx?xxxxxx????xxxxxxxxxx??xxxxxxxxxxx"sv, |
| 52 | + "\x48\x85\xD2\x0F\x84\x00\x00\x00\x00\x53\x48\x83\xEC\x20\x48\x63\x41\x58\x48\x89\x7C\x24\x00\x48\x8B\xFA\x48\xFF\xC8\x48\x8B\xD9\x48\x23\xC2\x48\x2B\xF8\x83\x3F\x00\x74\x28\x48\x8D\x0D\x00\x00\x00\x00\xE8\x00\x00\x00\x00\x44\x8B\x07\x48\x8D\x0D\x00\x00\x00\x00\x48\x8B\xD7\x48\x8B\x7C\x24\x00\x48\x83\xC4\x20\x5B\xE9\x00\x00\x00\x00\x48\x8B\x47\x18\x48\x89\x02\x48\x83\x7F\x00\x00\x48\x89\x57\x18\x0F\x94\xC0\x48\x89\x7A\x08"sv |
| 53 | +}; |
| 54 | + |
| 55 | +void FAllocHook::init() { |
| 56 | + |
| 57 | + auto found = hooks.findPattern(pat_allocReg, 0x0); |
| 58 | + |
| 59 | + |
| 60 | + |
| 61 | + auto aicp = *reinterpret_cast<uint32_t*>(found + 0x1C); |
| 62 | + auto rip = found + 0x20; |
| 63 | + auto aic = *reinterpret_cast<int32_t*>(rip + aicp); |
| 64 | + |
| 65 | + //+1C |
| 66 | + //70 C4 4C 01 |
| 67 | + //014cc470 |
| 68 | + //0002932C90 |
| 69 | + |
| 70 | + |
| 71 | + auto aidp = *reinterpret_cast<uint32_t*>(found + 0x2B); |
| 72 | + rip = found + 0x2F; |
| 73 | + auto aid = reinterpret_cast<intercept::types::rv_pool_allocator**>(rip + aidp); |
| 74 | + //71 C4 4C 01 |
| 75 | + |
| 76 | + |
| 77 | + auto allocF = hooks.findPattern(pat_allocC); |
| 78 | + engineAlloc = hooks.placeHookTotalOffs(allocF, reinterpret_cast<uintptr_t>(engineAllocRedir))+2; |
| 79 | + |
| 80 | + auto FreeF = hooks.findPattern(pat_freeC); |
| 81 | + engineFree = hooks.placeHookTotalOffs(FreeF + 0x9, reinterpret_cast<uintptr_t>(engineFreeRedir)); |
| 82 | + // |
| 83 | + //__debugbreak(); |
| 84 | + |
| 85 | +} |
0 commit comments