Arion 1.0.2-alpha
A high-performance C++ framework for emulating executable binaries.
 
Loading...
Searching...
No Matches
memory_manager.hpp
Go to the documentation of this file.
1#ifndef ARION_MEMORY_MANAGER_HPP
2#define ARION_MEMORY_MANAGER_HPP
3
4#include <arion/capstone/capstone.h>
7#include <arion/unicorn/unicorn.h>
8#include <cstdint>
9#include <memory>
10#include <string>
11#include <vector>
12
13namespace arion
14{
15
16class Arion;
17
20{
28 std::string info;
30 BYTE *saved_data = nullptr;
42 ARION_MAPPING(ADDR start_addr, ADDR end_addr, PROT_FLAGS perms, std::string info = "")
43 : start_addr(start_addr), end_addr(end_addr), perms(perms), info(info) {};
49 : start_addr(arion_m->start_addr), end_addr(arion_m->end_addr), perms(arion_m->perms), info(arion_m->info),
50 saved_data(arion_m->saved_data) {};
55 {
56 if (saved_data)
57 free(saved_data);
58 saved_data = nullptr;
59 }
60};
61/*
62 * Serializes an ARION_MAPPING instance into a vector of bytes.
63 * @param[in] arion_m The ARION_MAPPING to be serialized.
64 * @return The serialized vector of bytes.
65 */
66std::vector<BYTE> serialize_arion_mapping(ARION_MAPPING *arion_m);
67/*
68 * Deserializes an ARION_MAPPING instance from a vector of bytes.
69 * @param[in] srz_file The serialized vector of bytes.
70 * @return The deserialized ARION_MAPPING.
71 */
72ARION_MAPPING *deserialize_arion_mapping(std::vector<BYTE> srz_mapping);
73
76{
80 size_t sz;
81
87 ARION_MEM_EDIT(ADDR addr, size_t sz) : addr(addr), sz(sz) {};
88};
89
92{
93 private:
95 std::weak_ptr<Arion> arion;
97 std::vector<std::shared_ptr<ARION_MEM_EDIT>> edits;
101 bool started = false;
111 static bool write_mem_hook(std::shared_ptr<Arion> arion, uc_mem_type type, uint64_t addr, int size, int64_t val,
112 void *user_data);
117 void add_edit(std::shared_ptr<ARION_MEM_EDIT> edit);
118
119 public:
124 MemoryRecorder(std::weak_ptr<Arion> arion) : arion(arion), started(false) {};
130 static std::unique_ptr<MemoryRecorder> initialize(std::weak_ptr<Arion> arion);
134 void clear();
138 void start();
142 void stop();
147 std::vector<std::shared_ptr<ARION_MEM_EDIT>> get_edits();
148};
149
153{
154 private:
156 std::weak_ptr<Arion> arion;
158 size_t page_sz;
160 ADDR brk = 0;
162 std::vector<std::shared_ptr<ARION_MAPPING>> mappings;
168 uint32_t to_uc_perms(PROT_FLAGS perms);
173 void insert_mapping(std::shared_ptr<ARION_MAPPING> mapping);
178 void remove_mapping(std::shared_ptr<ARION_MAPPING> mapping);
184 void merge_uc_mappings(ADDR start, ADDR end);
189
190 public:
192 std::unique_ptr<MemoryRecorder> recorder;
198 MemoryManager(std::weak_ptr<Arion> arion, size_t page_sz) : arion(arion), page_sz(page_sz) {};
204 static std::unique_ptr<MemoryManager> initialize(std::weak_ptr<Arion> arion);
222 bool ARION_EXPORT has_mapping(std::shared_ptr<ARION_MAPPING> mapping);
229 bool ARION_EXPORT can_map(ADDR addr, size_t sz);
235 bool ARION_EXPORT has_mapping_with_info(std::string info);
241 std::shared_ptr<ARION_MAPPING> ARION_EXPORT get_mapping_by_info(std::string info);
247 std::shared_ptr<ARION_MAPPING> ARION_EXPORT get_mapping_at(ADDR addr);
252 std::vector<std::shared_ptr<ARION_MAPPING>> ARION_EXPORT get_mappings();
266 ADDR ARION_EXPORT map(ADDR start_addr, size_t sz, PROT_FLAGS perms, std::string info = "");
276 ADDR ARION_EXPORT map_anywhere(ADDR addr, size_t sz, PROT_FLAGS perms, bool asc = true, std::string info = "");
285 ADDR ARION_EXPORT map_anywhere(size_t sz, PROT_FLAGS perms, bool asc = true, std::string info = "");
292 void ARION_EXPORT unmap(std::shared_ptr<ARION_MAPPING> mapping, ADDR start_addr, ADDR end_addr);
297 void ARION_EXPORT unmap(std::shared_ptr<ARION_MAPPING> mapping);
303 void ARION_EXPORT unmap(ADDR start_addr, ADDR end_addr);
308 void ARION_EXPORT unmap(ADDR seg_addr);
320 void ARION_EXPORT protect(std::shared_ptr<ARION_MAPPING> mapping, ADDR start_addr, ADDR end_addr, PROT_FLAGS perms);
326 void ARION_EXPORT protect(std::shared_ptr<ARION_MAPPING> mapping, PROT_FLAGS perms);
333 void ARION_EXPORT protect(ADDR start_addr, ADDR end_addr, PROT_FLAGS perms);
339 void ARION_EXPORT protect(ADDR seg_addr, PROT_FLAGS perms);
346 void ARION_EXPORT resize_mapping(std::shared_ptr<ARION_MAPPING> mapping, ADDR start_addr, ADDR end_addr);
353 void ARION_EXPORT resize_mapping(ADDR seg_addr, ADDR start_addr, ADDR end_addr);
360 std::vector<BYTE> ARION_EXPORT read(ADDR addr, size_t data_sz);
367 uint64_t ARION_EXPORT read_val(ADDR addr, uint8_t n);
393 std::string ARION_EXPORT read_hex(ADDR addr, size_t data_sz, char sep = 0);
400 std::string ARION_EXPORT read_ascii(ADDR addr, size_t data_sz);
406 std::string ARION_EXPORT read_c_string(ADDR addr);
412 std::vector<ADDR> ARION_EXPORT read_ptr_arr(ADDR addr);
419 std::vector<cs_insn> ARION_EXPORT read_instrs(ADDR addr, size_t count);
426 void ARION_EXPORT write(ADDR addr, BYTE *data, size_t data_sz);
432 void ARION_EXPORT write_string(ADDR addr, std::string data);
439 void ARION_EXPORT write_val(ADDR addr, uint64_t val, uint8_t n);
451 void ARION_EXPORT write_sz(ADDR addr, size_t sz);
457 void ARION_EXPORT write_fd(ADDR addr, int fd);
462 void ARION_EXPORT stack_push(uint64_t val);
468 void ARION_EXPORT stack_push_bytes(BYTE *data, size_t data_sz);
473 void ARION_EXPORT stack_push_string(std::string data);
493};
494
495}; // namespace arion
496
497#endif // ARION_MEMORY_MANAGER_HPP
Definition memory_manager.hpp:153
bool has_mapping(std::shared_ptr< ARION_MAPPING > mapping)
void unmap(ADDR start_addr, ADDR end_addr)
void set_brk(ADDR brk)
void merge_contiguous_uc_mappings()
size_t read_sz(ADDR addr)
void merge_uc_mappings(ADDR start, ADDR end)
bool can_map(ADDR addr, size_t sz)
bool is_mapped(ADDR addr)
ADDR map(ADDR start_addr, size_t sz, PROT_FLAGS perms, std::string info="")
void write_fd(ADDR addr, int fd)
ADDR read_ptr(ADDR addr)
void protect(ADDR seg_addr, PROT_FLAGS perms)
void stack_push_string(std::string data)
static std::unique_ptr< MemoryManager > initialize(std::weak_ptr< Arion > arion)
bool has_mapping_with_info(std::string info)
void remove_mapping(std::shared_ptr< ARION_MAPPING > mapping)
void protect(ADDR start_addr, ADDR end_addr, PROT_FLAGS perms)
void unmap(std::shared_ptr< ARION_MAPPING > mapping, ADDR start_addr, ADDR end_addr)
void insert_mapping(std::shared_ptr< ARION_MAPPING > mapping)
uint64_t read_val(ADDR addr, uint8_t n)
void write(ADDR addr, BYTE *data, size_t data_sz)
void unmap(std::shared_ptr< ARION_MAPPING > mapping)
void write_sz(ADDR addr, size_t sz)
void unmap(ADDR seg_addr)
void protect(std::shared_ptr< ARION_MAPPING > mapping, ADDR start_addr, ADDR end_addr, PROT_FLAGS perms)
void write_string(ADDR addr, std::string data)
std::vector< std::shared_ptr< ARION_MAPPING > > get_mappings()
void resize_mapping(std::shared_ptr< ARION_MAPPING > mapping, ADDR start_addr, ADDR end_addr)
std::string read_hex(ADDR addr, size_t data_sz, char sep=0)
std::vector< cs_insn > read_instrs(ADDR addr, size_t count)
std::vector< ADDR > read_ptr_arr(ADDR addr)
std::vector< BYTE > read(ADDR addr, size_t data_sz)
std::shared_ptr< ARION_MAPPING > get_mapping_at(ADDR addr)
size_t page_sz
The size of a memory page in bytes. Used when allocating new pages.
Definition memory_manager.hpp:158
std::vector< std::shared_ptr< ARION_MAPPING > > mappings
A vector of all mappings currently present within the Arion instance.
Definition memory_manager.hpp:162
uint32_t to_uc_perms(PROT_FLAGS perms)
std::string read_c_string(ADDR addr)
void write_ptr(ADDR addr, ADDR ptr)
void write_val(ADDR addr, uint64_t val, uint8_t n)
ADDR align_up(ADDR addr)
void resize_mapping(ADDR seg_addr, ADDR start_addr, ADDR end_addr)
std::string mappings_str()
void stack_push(uint64_t val)
ADDR map_anywhere(ADDR addr, size_t sz, PROT_FLAGS perms, bool asc=true, std::string info="")
std::shared_ptr< ARION_MAPPING > get_mapping_by_info(std::string info)
std::weak_ptr< Arion > arion
The Arion instance associated with this instance.
Definition memory_manager.hpp:156
std::string read_ascii(ADDR addr, size_t data_sz)
int read_fd(ADDR addr)
void protect(std::shared_ptr< ARION_MAPPING > mapping, PROT_FLAGS perms)
MemoryManager(std::weak_ptr< Arion > arion, size_t page_sz)
Definition memory_manager.hpp:198
std::unique_ptr< MemoryRecorder > recorder
Used to record memory accesses to the associated Arion instance.
Definition memory_manager.hpp:192
void stack_push_bytes(BYTE *data, size_t data_sz)
ADDR map_anywhere(size_t sz, PROT_FLAGS perms, bool asc=true, std::string info="")
This class is responsible for recording memory accesses to an Arion instance.
Definition memory_manager.hpp:92
MemoryRecorder(std::weak_ptr< Arion > arion)
Definition memory_manager.hpp:124
HOOK_ID write_mem_hook_id
ID of the hook used to record memory writes.
Definition memory_manager.hpp:99
void add_edit(std::shared_ptr< ARION_MEM_EDIT > edit)
static bool write_mem_hook(std::shared_ptr< Arion > arion, uc_mem_type type, uint64_t addr, int size, int64_t val, void *user_data)
std::weak_ptr< Arion > arion
The Arion instance being recorded.
Definition memory_manager.hpp:95
static std::unique_ptr< MemoryRecorder > initialize(std::weak_ptr< Arion > arion)
std::vector< std::shared_ptr< ARION_MEM_EDIT > > edits
Recorded memory accesses.
Definition memory_manager.hpp:97
bool started
Indicates whether recording is currently active.
Definition memory_manager.hpp:101
std::vector< std::shared_ptr< ARION_MEM_EDIT > > get_edits()
#define ARION_EXPORT
Defines which symbols should be exported from the library.
Definition global_defs.hpp:13
Definition arch_x86-64.hpp:11
std::vector< BYTE > serialize_arion_mapping(ARION_MAPPING *arion_m)
uint64_t ADDR
Identifies a memory address.
Definition global_defs.hpp:36
uint8_t BYTE
Identifies an 8-bit integer.
Definition global_defs.hpp:40
uint64_t HOOK_ID
ID associated with a hook when created.
Definition hooks_manager.hpp:19
uint8_t PROT_FLAGS
Identifies memory protection rights.
Definition global_defs.hpp:38
ARION_MAPPING * deserialize_arion_mapping(std::vector< BYTE > srz_mapping)
This structure holds data associated with a memory mapping.
Definition memory_manager.hpp:20
ARION_MAPPING(ARION_MAPPING *arion_m)
Definition memory_manager.hpp:48
ARION_MAPPING()
Definition memory_manager.hpp:34
std::string info
A string describing the mapping.
Definition memory_manager.hpp:28
ADDR start_addr
Start memory address of the mapping.
Definition memory_manager.hpp:22
PROT_FLAGS perms
Memory access rights of the mapping.
Definition memory_manager.hpp:26
ADDR end_addr
End memory address of the mapping.
Definition memory_manager.hpp:24
~ARION_MAPPING()
Definition memory_manager.hpp:54
ARION_MAPPING(ADDR start_addr, ADDR end_addr, PROT_FLAGS perms, std::string info="")
Definition memory_manager.hpp:42
This structure holds data associated with a memory modification event.
Definition memory_manager.hpp:76
size_t sz
Size of the modified memory.
Definition memory_manager.hpp:80
ADDR addr
Start address where memory was changed.
Definition memory_manager.hpp:78
ARION_MEM_EDIT(ADDR addr, size_t sz)
Definition memory_manager.hpp:87