1#ifndef ARION_MEMORY_MANAGER_HPP
2#define ARION_MEMORY_MANAGER_HPP
4#include <arion/capstone/capstone.h>
7#include <arion/unicorn/unicorn.h>
30 BYTE *saved_data =
nullptr;
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) {};
97 std::vector<std::shared_ptr<ARION_MEM_EDIT>>
edits;
111 static bool write_mem_hook(std::shared_ptr<Arion>
arion, uc_mem_type type, uint64_t addr,
int size, int64_t val,
117 void add_edit(std::shared_ptr<ARION_MEM_EDIT> edit);
147 std::vector<std::shared_ptr<ARION_MEM_EDIT>>
get_edits();
162 std::vector<std::shared_ptr<ARION_MAPPING>>
mappings;
Definition memory_manager.hpp:153
bool has_mapping(std::shared_ptr< ARION_MAPPING > mapping)
void unmap(ADDR start_addr, ADDR end_addr)
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)
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)
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)
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