From 956ba85f080ad99fcc010982732e51d6d82a575d Mon Sep 17 00:00:00 2001 From: _xeroxz Date: Sat, 22 May 2021 01:51:24 -0700 Subject: [PATCH] removing vmptest.vmp.exe and test.vmp2... --- src/main.cpp | 13 ++++++++++--- src/test.vmp2 | Bin 153648 -> 0 bytes src/vmemu_t.cpp | 21 +++++++++++++-------- src/vmptest.vmp.exe | Bin 24064 -> 0 bytes 4 files changed, 23 insertions(+), 11 deletions(-) delete mode 100644 src/test.vmp2 delete mode 100644 src/vmptest.vmp.exe diff --git a/src/main.cpp b/src/main.cpp index 5ffe514..c3daf9b 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -25,6 +25,10 @@ int __cdecl main(int argc, const char* argv[]) .name("--out").required(true) .description("output file name for trace file..."); + parser.add_argument() + .name("--advancement").required(true) + .description("the way in which the virtual instruction pointer advances... 'forward' or 'backward'..."); + parser.enable_help(); auto result = parser.parse(argc, argv); @@ -64,9 +68,10 @@ int __cdecl main(int argc, const char* argv[]) if (!emu.get_trace(entries)) std::printf("[!] something failed during tracing, review the console for more information...\n"); - std::printf("> finished tracing...\n"); - std::printf("> creating trace file...\n"); + std::printf("> finished tracing... number of virtual instructions = %d\n", + entries.size()); + std::printf("> creating trace file...\n"); std::ofstream output(parser.get("out"), std::ios::binary); @@ -75,7 +80,9 @@ int __cdecl main(int argc, const char* argv[]) file_header.epoch_time = time(nullptr); file_header.entry_offset = sizeof file_header; - file_header.advancement = vmp2::exec_type_t::forward; + file_header.advancement = parser.get("advancement") == + "forward" ? vmp2::exec_type_t::forward : vmp2::exec_type_t::backward; + file_header.version = vmp2::version_t::v1; file_header.module_base = module_base; file_header.entry_count = entries.size(); diff --git a/src/test.vmp2 b/src/test.vmp2 deleted file mode 100644 index d6fd1da6e88c9bb057aeb334613e2663f4a1424b..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 153648 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 diff --git a/src/vmemu_t.cpp b/src/vmemu_t.cpp index 36cf6b6..28ec438 100644 --- a/src/vmemu_t.cpp +++ b/src/vmemu_t.cpp @@ -50,7 +50,7 @@ namespace vm NT_HEADER(module_base)->OptionalHeader.SizeOfImage; std::uintptr_t stack_base = 0x1000000; - std::uintptr_t stack_addr = stack_base + (0x1000 * 20); + std::uintptr_t stack_addr = (stack_base + (0x1000 * 20)) - 0x6000; uc_err err; if ((err = uc_open(UC_ARCH_X86, UC_MODE_64, &uc))) @@ -201,10 +201,13 @@ namespace vm if (address == obj->vm_entry[obj->vm_entry.size() - 1].addr) { + uc_err err; vmp2::entry_t new_entry; - if (!obj->create_entry(&new_entry)) + if ((err = obj->create_entry(&new_entry))) { - std::printf("[!] failed to create new entry... exiting...\n"); + std::printf("[!] failed to create new entry... reason = %u, %s\n", + err, uc_strerror(err)); + exit(0); } obj->trace_entries->push_back(new_entry); @@ -239,10 +242,13 @@ namespace vm vm_handler_check) == obj->vm_handlers.end()) return; + uc_err err; vmp2::entry_t new_entry; - if (!obj->create_entry(&new_entry)) + if ((err = obj->create_entry(&new_entry))) { - std::printf("[!] failed to create new entry... exiting...\n"); + std::printf("[!] failed to create new entry... reason = %u, %s\n", + err, uc_strerror(err)); + exit(0); } obj->trace_entries->push_back(new_entry); @@ -256,9 +262,6 @@ namespace vm { switch (type) { - default: - // return false to indicate we want to stop emulation - return false; case UC_MEM_WRITE_UNMAPPED: printf(">>> Missing memory is being WRITE at 0x%p, data size = %u, data value = 0x%p\n", address, size, value); @@ -267,6 +270,8 @@ namespace vm printf(">>> Missing memory is being READ at 0x%p, data size = %u, data value = 0x%p\n", address, size, value); return false; + default: + return false; } } } \ No newline at end of file diff --git a/src/vmptest.vmp.exe b/src/vmptest.vmp.exe deleted file mode 100644 index 60c276e74f089de6a42cd355f0b8885e353efbe5..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 24064 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