Arion 1.0.2-alpha
A high-performance C++ framework for emulating executable binaries.
 
Loading...
Searching...
No Matches
arion.hpp
Go to the documentation of this file.
1#ifndef ARION_ARION_HPP
2#define ARION_ARION_HPP
3
5#include <arion/capstone/capstone.h>
19#include <arion/keystone/keystone.h>
23#include <arion/unicorn/unicorn.h>
24#include <exception>
25#include <memory>
26#include <optional>
27#include <string>
28#include <vector>
29
30namespace arion
31{
33extern std::map<CPU_ARCH, std::pair<uc_arch, uc_mode>> ARION_TO_UC_ARCH;
35extern std::map<CPU_ARCH, std::vector<std::pair<ks_arch, ks_mode>>> ARION_TO_KS_ARCH;
37extern std::map<CPU_ARCH, std::vector<std::pair<cs_arch, cs_mode>>> ARION_TO_CS_ARCH;
38
40class ARION_EXPORT ArionGroup : public std::enable_shared_from_this<ArionGroup>
41{
42 private:
47 pid_t next_pid = ARION_PROCESS_PID;
49 pid_t curr_pid = ARION_PROCESS_PID;
51 std::map<pid_t, std::shared_ptr<Arion>> instances;
52
53 public:
63 std::map<pid_t, std::shared_ptr<Arion>> ARION_EXPORT get_arion_instances();
75 std::shared_ptr<Arion> ARION_EXPORT get_arion_instance(pid_t pid);
82 void ARION_EXPORT add_arion_instance(std::shared_ptr<Arion> arion, std::optional<pid_t> pid = std::nullopt,
83 std::optional<pid_t> pgid = std::nullopt);
110 void set_curr_pid(pid_t pid);
122 void set_next_pid(pid_t pid);
123};
124
126class ARION_EXPORT Arion : public std::enable_shared_from_this<Arion>
127{
128 private:
130 std::vector<std::string> program_args;
132 std::vector<std::string> program_env;
134 std::weak_ptr<ArionGroup> group;
136 std::weak_ptr<Arion> parent;
138 std::vector<std::weak_ptr<Arion>> children;
140 std::exception_ptr uc_exception = nullptr;
142 bool afl_mode = false;
144 std::vector<int> afl_signals;
146 std::optional<ADDR> start = std::nullopt;
148 std::optional<ADDR> end = std::nullopt;
150 bool running = false;
152 bool sync = false;
154 bool stopped = false;
156 bool zombie = false;
158 pid_t pid = 0;
160 pid_t pgid = 0;
162 uint32_t sid = 0;
164 uint32_t uid = 0;
166 uint32_t gid = 0;
168 uint32_t euid = 0;
170 uint32_t egid = 0;
180 static void new_instance_common_init(std::shared_ptr<Arion> arion, std::string fs_path = "/",
181 std::vector<std::string> program_env = std::vector<std::string>(),
182 std::string cwd = "",
183 std::unique_ptr<Config> config = std::move(std::make_unique<Config>()));
189 static void new_instance_common_finish(std::shared_ptr<Arion> arion, CPU_ARCH arch);
199 void init_file_program(std::shared_ptr<ExecutableParser> prog_parser);
208 void init_dynamic_program(std::shared_ptr<ExecutableParser> prog_parser);
213 void init_static_program(std::shared_ptr<ExecutableParser> prog_parser);
218
219 public:
221 std::unique_ptr<ArchManager> arch;
223 std::unique_ptr<BaremetalManager> baremetal;
225 std::unique_ptr<MemoryManager> mem;
227 std::unique_ptr<FileSystemManager> fs;
229 std::unique_ptr<SocketManager> sock;
231 std::unique_ptr<HooksManager> hooks;
233 std::unique_ptr<ThreadingManager> threads;
235 std::unique_ptr<SignalManager> signals;
237 std::unique_ptr<ContextManager> context;
239 std::unique_ptr<LinuxSyscallManager> syscalls;
241 std::unique_ptr<GdtManager> gdt_manager;
243 std::unique_ptr<CodeTracer> tracer;
245 std::unique_ptr<Logger> logger;
247 std::unique_ptr<Config> config;
249 std::unique_ptr<LNX_LOADER_PARAMS> loader_params;
251 std::vector<std::shared_ptr<SIGNAL>> pending_signals;
253 uc_engine *uc;
255 std::vector<ks_engine *> ks;
257 std::vector<csh *> cs;
268 static std::shared_ptr<Arion> ARION_EXPORT
269 new_instance(std::vector<std::string> program_args, std::string fs_path = "/",
270 std::vector<std::string> program_env = std::vector<std::string>(), std::string cwd = "",
271 std::unique_ptr<Config> config = std::move(std::make_unique<Config>()));
282 static std::shared_ptr<Arion> ARION_EXPORT
283 new_instance(std::unique_ptr<BaremetalManager> baremetal, std::string fs_path = "/",
284 std::vector<std::string> program_env = std::vector<std::string>(), std::string cwd = "",
285 std::unique_ptr<Config> config = std::move(std::make_unique<Config>()));
295 void ARION_EXPORT set_run_bounds(std::optional<ADDR> start = std::nullopt, std::optional<ADDR> end = std::nullopt);
300 void ARION_EXPORT set_run_start(std::optional<ADDR> start);
305 void ARION_EXPORT set_run_end(std::optional<ADDR> end);
319 void crash(std::exception_ptr exception);
334 void init_afl_mode(std::vector<int> signals);
343 std::shared_ptr<Arion> copy();
353 std::shared_ptr<Arion> ARION_EXPORT get_parent();
358 std::vector<std::shared_ptr<Arion>> ARION_EXPORT get_children();
364 std::vector<std::shared_ptr<Arion>> ARION_EXPORT get_pgid_children(pid_t pgid);
369 pid_t ARION_EXPORT add_child(std::shared_ptr<Arion> child);
375 bool ARION_EXPORT has_child(pid_t child_pid);
381 bool ARION_EXPORT is_child_of(pid_t parent_pid);
387 std::shared_ptr<Arion> ARION_EXPORT get_child(pid_t child_pid);
393 void ARION_EXPORT replace_child(pid_t child_pid, std::shared_ptr<Arion> child);
398 void ARION_EXPORT remove_child(pid_t child_pid);
410 void execve(std::string file_path, std::vector<std::string> argv, std::vector<std::string> envp);
415 std::vector<std::string> ARION_EXPORT get_program_args();
420 std::vector<std::string> ARION_EXPORT get_program_env();
430 void ARION_EXPORT set_pid(pid_t pid);
440 void ARION_EXPORT set_pgid(pid_t pgid);
450 void ARION_EXPORT set_sid(uint32_t sid);
460 void ARION_EXPORT set_uid(uint32_t uid);
470 void ARION_EXPORT set_gid(uint32_t gid);
480 void ARION_EXPORT set_euid(uint32_t euid);
490 void ARION_EXPORT set_egid(uint32_t egid);
500 std::shared_ptr<ArionGroup> ARION_EXPORT get_group();
505 void set_group(std::shared_ptr<ArionGroup> group);
527 bool is_zombie();
537 void ARION_EXPORT send_signal(pid_t source_pid, int signo);
542 void ARION_EXPORT run_gdbserver(uint32_t port);
543};
544
545}; // namespace arion
546
547#endif // ARION_ARION_HPP
Group of Arion instances that run together. This allows IPC as well as sandboxing between groups.
Definition arion.hpp:41
void add_arion_instance(std::shared_ptr< Arion > arion, std::optional< pid_t > pid=std::nullopt, std::optional< pid_t > pgid=std::nullopt)
std::map< pid_t, std::shared_ptr< Arion > > get_arion_instances()
void set_curr_pid(pid_t pid)
bool trigger_stop
True when emulation of the group should be stopped.
Definition arion.hpp:44
size_t count_arion_instances()
bool has_arion_instance(pid_t pid)
std::shared_ptr< Arion > get_arion_instance(pid_t pid)
void set_next_pid(pid_t pid)
std::map< pid_t, std::shared_ptr< Arion > > instances
List of Arion instances associated with this group.
Definition arion.hpp:51
void remove_arion_instance(pid_t pid)
An emulation unit associated with a process.
Definition arion.hpp:127
std::shared_ptr< Arion > get_child(pid_t child_pid)
bool has_child(pid_t child_pid)
void set_sid(uint32_t sid)
void init_afl_mode(std::vector< int > signals)
std::weak_ptr< Arion > parent
The Arion instance emulating the parent process of this process.
Definition arion.hpp:136
static std::shared_ptr< Arion > new_instance(std::vector< std::string > program_args, std::string fs_path="/", std::vector< std::string > program_env=std::vector< std::string >(), std::string cwd="", std::unique_ptr< Config > config=std::move(std::make_unique< Config >()))
std::unique_ptr< LNX_LOADER_PARAMS > loader_params
Parameters related to the loader action.
Definition arion.hpp:249
static std::shared_ptr< Arion > new_instance(std::unique_ptr< BaremetalManager > baremetal, std::string fs_path="/", std::vector< std::string > program_env=std::vector< std::string >(), std::string cwd="", std::unique_ptr< Config > config=std::move(std::make_unique< Config >()))
void send_signal(pid_t source_pid, int signo)
std::unique_ptr< Logger > logger
Logger instance associated with this instance.
Definition arion.hpp:245
void init_static_program(std::shared_ptr< ExecutableParser > prog_parser)
void set_egid(uint32_t egid)
std::unique_ptr< SocketManager > sock
SocketManager instance associated with this instance.
Definition arion.hpp:229
void replace_child(pid_t child_pid, std::shared_ptr< Arion > child)
std::vector< std::string > get_program_env()
std::vector< std::shared_ptr< Arion > > get_children()
std::vector< std::string > get_program_args()
void clear_children()
void set_euid(uint32_t euid)
uint32_t get_uid()
void set_uid(uint32_t uid)
std::shared_ptr< ArionGroup > get_group()
static void new_instance_common_finish(std::shared_ptr< Arion > arion, CPU_ARCH arch)
void set_run_start(std::optional< ADDR > start)
std::vector< std::shared_ptr< SIGNAL > > pending_signals
List of signals to be processed by this instance.
Definition arion.hpp:251
std::unique_ptr< ContextManager > context
ContextManager instance associated with this instance.
Definition arion.hpp:237
void init_engines(CPU_ARCH arch)
std::vector< ks_engine * > ks
Keystone engine related to this instance.
Definition arion.hpp:255
std::unique_ptr< HooksManager > hooks
HooksManager instance associated with this instance.
Definition arion.hpp:231
std::unique_ptr< CodeTracer > tracer
CodeTracer instance associated with this instance.
Definition arion.hpp:243
uint32_t get_gid()
void set_zombie()
pid_t add_child(std::shared_ptr< Arion > child)
bool has_parent()
void init_dynamic_program(std::shared_ptr< ExecutableParser > prog_parser)
std::vector< std::shared_ptr< Arion > > get_pgid_children(pid_t pgid)
uint32_t get_egid()
void set_pid(pid_t pid)
void remove_child(pid_t child_pid)
std::unique_ptr< FileSystemManager > fs
FileSystemManager instance associated with this instance.
Definition arion.hpp:227
void reset_group()
std::unique_ptr< MemoryManager > mem
MemoryManager instance associated with this instance.
Definition arion.hpp:225
void set_stopped()
std::unique_ptr< LinuxSyscallManager > syscalls
LinuxSyscallManager instance associated with this instance.
Definition arion.hpp:239
uint32_t get_sid()
std::unique_ptr< Config > config
Config instance associated with this instance.
Definition arion.hpp:247
std::shared_ptr< Arion > copy()
void sync_threads()
std::vector< csh * > cs
Capstone engine related to this instance.
Definition arion.hpp:257
std::weak_ptr< ArionGroup > group
The ArionGroup this process is associated with. Arion instances are emulated together through their g...
Definition arion.hpp:134
static void new_instance_common_init(std::shared_ptr< Arion > arion, std::string fs_path="/", std::vector< std::string > program_env=std::vector< std::string >(), std::string cwd="", std::unique_ptr< Config > config=std::move(std::make_unique< Config >()))
std::vector< std::string > program_args
The program arguments of the emulated process, basically the "argv" array.
Definition arion.hpp:130
void run_gdbserver(uint32_t port)
std::vector< std::weak_ptr< Arion > > children
The Arion instances emulating the child processes of this process.
Definition arion.hpp:138
bool is_running()
void close_engines()
std::unique_ptr< ThreadingManager > threads
ThreadingManager instance associated with this instance.
Definition arion.hpp:233
void set_resumed()
void set_group(std::shared_ptr< ArionGroup > group)
std::unique_ptr< BaremetalManager > baremetal
BaremetalManager instance associated with this instance.
Definition arion.hpp:223
bool run_current()
bool is_child_of(pid_t parent_pid)
std::unique_ptr< GdtManager > gdt_manager
GdtManager instance associated with this instance.
Definition arion.hpp:241
void set_run_bounds(std::optional< ADDR > start=std::nullopt, std::optional< ADDR > end=std::nullopt)
void init_file_program(std::shared_ptr< ExecutableParser > prog_parser)
pid_t get_pid()
bool is_zombie()
void stop_afl_mode()
std::unique_ptr< SignalManager > signals
SignalManager instance associated with this instance.
Definition arion.hpp:235
std::unique_ptr< ArchManager > arch
ArchManager instance associated with this instance.
Definition arion.hpp:221
std::vector< std::string > program_env
The program environment variables of the emulated process, basically the "envp" array.
Definition arion.hpp:132
void init_baremetal_program()
pid_t get_pgid()
std::shared_ptr< Arion > get_parent()
void set_run_end(std::optional< ADDR > end)
void set_gid(uint32_t gid)
std::vector< int > afl_signals
List of UNIX signals that must be considered as process crashes when fuzzing with ArionAfl component.
Definition arion.hpp:144
void set_pgid(pid_t pgid)
uint32_t get_euid()
uc_engine * uc
Unicorn engine related to this instance.
Definition arion.hpp:253
void crash(std::exception_ptr exception)
bool is_stopped()
bool has_group()
void execve(std::string file_path, std::vector< std::string > argv, std::vector< std::string > envp)
#define ARION_EXPORT
Defines which symbols should be exported from the library.
Definition global_defs.hpp:13
#define ARION_PROCESS_PID
First PID value to be associated with an emulated process.
Definition global_defs.hpp:29
Definition arch_x86-64.hpp:11
std::map< CPU_ARCH, std::vector< std::pair< ks_arch, ks_mode > > > ARION_TO_KS_ARCH
Ensures the conversion between Arion CPU_ARCH and Keystone CPU architectures and modes.
std::map< CPU_ARCH, std::pair< uc_arch, uc_mode > > ARION_TO_UC_ARCH
Ensures the conversion between Arion CPU_ARCH and Unicorn CPU architectures and modes.
CPU_ARCH
Identifies a CPU architecture.
Definition global_defs.hpp:128
std::map< CPU_ARCH, std::vector< std::pair< cs_arch, cs_mode > > > ARION_TO_CS_ARCH
Ensures the conversion between Arion CPU_ARCH and Capstone CPU architectures and modes.