MemoryBackup.cpp
1 #include "MemoryBackup.hpp" 2 3 MemoryBackup::MemoryBackup() 4 { 5 _pMem = nullptr; 6 _address = 0; 7 _size = 0; 8 _orig_code.clear(); 9 } 10 11 MemoryBackup::~MemoryBackup() 12 { 13 // clean up 14 _orig_code.clear(); 15 _orig_code.shrink_to_fit(); 16 } 17 18 MemoryBackup::MemoryBackup(IKittyMemOp *pMem, uintptr_t absolute_address, size_t backup_size) 19 { 20 _pMem = nullptr; 21 _address = 0; 22 _size = 0; 23 _orig_code.clear(); 24 25 if (!pMem || !absolute_address || !backup_size) 26 return; 27 28 _pMem = pMem; 29 _address = absolute_address; 30 _size = backup_size; 31 _orig_code.resize(backup_size); 32 33 // backup current content 34 _pMem->Read(_address, &_orig_code[0], _size); 35 } 36 37 bool MemoryBackup::isValid() const 38 { 39 return (_pMem && _address && _size && _orig_code.size() == _size); 40 } 41 42 size_t MemoryBackup::get_BackupSize() const 43 { 44 return _size; 45 } 46 47 uintptr_t MemoryBackup::get_TargetAddress() const 48 { 49 return _address; 50 } 51 52 bool MemoryBackup::Restore() 53 { 54 if (!isValid()) 55 return false; 56 57 return _pMem->Write(_address, &_orig_code[0], _size); 58 } 59 60 std::string MemoryBackup::get_CurrBytes() const 61 { 62 if (!isValid()) 63 return ""; 64 65 std::vector<uint8_t> buffer(_size); 66 _pMem->Read(_address, &buffer[0], _size); 67 68 return KittyUtils::Data::toHex(&buffer[0], _size); 69 } 70 71 std::string MemoryBackup::get_OrigBytes() const 72 { 73 if (!isValid()) 74 return ""; 75 76 return KittyUtils::Data::toHex(&_orig_code[0], _orig_code.size()); 77 } 78 79 /* ============================== MemoryBackupMgr ============================== */ 80 81 MemoryBackup MemoryBackupMgr::createBackup(uintptr_t absolute_address, size_t backup_size) 82 { 83 return MemoryBackup(_pMem, absolute_address, backup_size); 84 }