diff --git a/deps/unicorn b/deps/unicorn index 35c15efc..62caeb2d 160000 --- a/deps/unicorn +++ b/deps/unicorn @@ -1 +1 @@ -Subproject commit 35c15efcb47d5746389ae785bfb77b3b021479a3 +Subproject commit 62caeb2dcea23df3d15afbec4b6bb3662a2d2296 diff --git a/src/unicorn-emulator/unicorn_x64_emulator.cpp b/src/unicorn-emulator/unicorn_x64_emulator.cpp index c1fa22fb..61378a20 100644 --- a/src/unicorn-emulator/unicorn_x64_emulator.cpp +++ b/src/unicorn-emulator/unicorn_x64_emulator.cpp @@ -112,6 +112,12 @@ namespace unicorn uc_context_serializer(uc_engine* uc, const bool in_place) : uc_(uc) { + if (in_place) + { + // Unicorn stores pointers in the struct. The serialization here is broken + throw std::runtime_error("Memory saving not supported atm"); + } + uc_ctl_context_mode(uc, UC_CTL_CONTEXT_CPU | (in_place ? UC_CTL_CONTEXT_MEMORY : 0)); this->size_ = uc_context_size(uc); diff --git a/src/windows-emulator-test/serialization_test.cpp b/src/windows-emulator-test/serialization_test.cpp index a65aaa57..a07d970a 100644 --- a/src/windows-emulator-test/serialization_test.cpp +++ b/src/windows-emulator-test/serialization_test.cpp @@ -24,16 +24,7 @@ namespace test auto buffer1 = serializer1.move_buffer(); auto buffer2 = serializer2.move_buffer(); - // Unicorn context contains unpredictable data - constexpr auto unicorn_offset = 30; - - ASSERT_GT(buffer1.size(), unicorn_offset); - ASSERT_EQ(buffer1.size(), buffer2.size()); - - buffer1.erase(buffer1.begin(), buffer1.begin() + unicorn_offset); - buffer2.erase(buffer2.begin(), buffer2.begin() + unicorn_offset); - - ASSERT_EQ(buffer1, buffer2); + ASSERT_EQ(serializer1.get_buffer(), serializer2.get_buffer()); } TEST(SerializationTest, DISABLED_EmulationIsReproducible)