diff --git a/src/emulator/emulator.hpp b/src/emulator/emulator.hpp index c6bdd5e9..4f33ee4b 100644 --- a/src/emulator/emulator.hpp +++ b/src/emulator/emulator.hpp @@ -64,6 +64,9 @@ public: virtual void read_raw_register(int reg, void* value, size_t size) = 0; virtual void write_raw_register(int reg, const void* value, size_t size) = 0; + virtual std::vector save_registers() = 0; + virtual void restore_registers(const std::vector& register_data) = 0; + virtual emulator_hook* hook_memory_violation(uint64_t address, size_t size, memory_violation_hook_callback callback) = 0; diff --git a/src/unicorn-emulator/unicorn_x64_emulator.cpp b/src/unicorn-emulator/unicorn_x64_emulator.cpp index db8ff3f1..4f0358b9 100644 --- a/src/unicorn-emulator/unicorn_x64_emulator.cpp +++ b/src/unicorn-emulator/unicorn_x64_emulator.cpp @@ -586,6 +586,21 @@ namespace unicorn serializer.deserialize(buffer); } + std::vector save_registers() override + { + utils::buffer_serializer buffer{}; + const uc_context_serializer serializer(this->uc_, false); + serializer.serialize(buffer); + return buffer.move_buffer(); + } + + void restore_registers(const std::vector& register_data) override + { + utils::buffer_deserializer buffer{register_data}; + const uc_context_serializer serializer(this->uc_, false); + serializer.deserialize(buffer); + } + private: mutable bool has_snapshots_{false}; uc_engine* uc_{};