/ deps / KittyMemoryEx / MemoryBackup.cpp
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  }