From 88bf8873ecd8336febd7dd767fa95bd11ea9974c Mon Sep 17 00:00:00 2001 From: _xeroxz Date: Thu, 7 Apr 2022 17:37:06 -0700 Subject: [PATCH] moved a function out of pass_t that doesnt belong there... --- CMakeLists.txt | 1 + include/obf/pass.hpp | 31 +----------------- include/obf/transform/gen.hpp | 33 ++++++++++++++++++++ include/obf/transform/transform.hpp | 6 ++-- src/theo/obf/passes/next_inst_pass.cpp | 2 +- src/theo/obf/passes/reloc_transform_pass.cpp | 2 +- 6 files changed, 39 insertions(+), 36 deletions(-) create mode 100644 include/obf/transform/gen.hpp diff --git a/CMakeLists.txt b/CMakeLists.txt index 107140b..b198d45 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -63,6 +63,7 @@ list(APPEND Theodosius_SOURCES "include/obf/passes/next_inst_pass.hpp" "include/obf/passes/reloc_transform_pass.hpp" "include/obf/transform/add_op.hpp" + "include/obf/transform/gen.hpp" "include/obf/transform/operation.hpp" "include/obf/transform/rol_op.hpp" "include/obf/transform/ror_op.hpp" diff --git a/include/obf/pass.hpp b/include/obf/pass.hpp index 95a9df9..e210f4e 100644 --- a/include/obf/pass.hpp +++ b/include/obf/pass.hpp @@ -1,6 +1,7 @@ #pragma once #include #include +#include #define XED_ENCODER extern "C" { @@ -15,36 +16,6 @@ class pass_t { virtual void run(decomp::symbol_t* sym) = 0; decomp::sym_type_t sym_type() { return m_sym_type; } - std::vector generate_transforms(xed_decoded_inst_t* inst, - recomp::reloc_t* reloc, - std::uint8_t low, - std::uint8_t high) { - auto num_transforms = transform::operation_t::random(low, high); - auto num_ops = transform::operations.size(); - std::vector new_inst_bytes; - - for (auto cnt = 0u; cnt < num_transforms; ++cnt) { - std::uint32_t imm = transform::operation_t::random( - 0, std::numeric_limits::max()); - - auto itr = transform::operations.begin(); - std::advance(itr, transform::operation_t::random(0, num_ops - 1)); - auto transform_bytes = itr->second->native(inst, imm); - new_inst_bytes.insert(new_inst_bytes.end(), transform_bytes.begin(), - transform_bytes.end()); - - reloc->add_transform( - {transform::operations[itr->second->inverse()]->get_transform(), - imm}); - } - - // inverse the order in which the transformations are executed... - // - std::reverse(reloc->get_transforms().begin(), - reloc->get_transforms().end()); - return new_inst_bytes; - } - private: decomp::sym_type_t m_sym_type; }; diff --git a/include/obf/transform/gen.hpp b/include/obf/transform/gen.hpp new file mode 100644 index 0000000..6093481 --- /dev/null +++ b/include/obf/transform/gen.hpp @@ -0,0 +1,33 @@ +#pragma once +#include +#include + +namespace theo::obf::transform { +inline std::vector generate(xed_decoded_inst_t* inst, + recomp::reloc_t* reloc, + std::uint8_t low, + std::uint8_t high) { + auto num_transforms = transform::operation_t::random(low, high); + auto num_ops = transform::operations.size(); + std::vector new_inst_bytes; + + for (auto cnt = 0u; cnt < num_transforms; ++cnt) { + std::uint32_t imm = transform::operation_t::random( + 0, std::numeric_limits::max()); + + auto itr = transform::operations.begin(); + std::advance(itr, transform::operation_t::random(0, num_ops - 1)); + auto transform_bytes = itr->second->native(inst, imm); + new_inst_bytes.insert(new_inst_bytes.end(), transform_bytes.begin(), + transform_bytes.end()); + + reloc->add_transform( + {transform::operations[itr->second->inverse()]->get_transform(), imm}); + } + + // inverse the order in which the transformations are executed... + // + std::reverse(reloc->get_transforms().begin(), reloc->get_transforms().end()); + return new_inst_bytes; +} +} // namespace theo::obf \ No newline at end of file diff --git a/include/obf/transform/transform.hpp b/include/obf/transform/transform.hpp index afaea75..6e79d82 100644 --- a/include/obf/transform/transform.hpp +++ b/include/obf/transform/transform.hpp @@ -1,6 +1,4 @@ #pragma once -#include - #include #include #include @@ -13,5 +11,5 @@ inline std::map operations = { {XED_ICLASS_SUB, sub_op_t::get()}, {XED_ICLASS_ROL, rol_op_t::get()}, {XED_ICLASS_ROR, ror_op_t::get()}, - /*{XED_ICLASS_XOR, xor_op_t::get()}*/}; -} \ No newline at end of file + {XED_ICLASS_XOR, xor_op_t::get()}}; +} // namespace theo::obf::transform \ No newline at end of file diff --git a/src/theo/obf/passes/next_inst_pass.cpp b/src/theo/obf/passes/next_inst_pass.cpp index 6d40574..0f3dbee 100644 --- a/src/theo/obf/passes/next_inst_pass.cpp +++ b/src/theo/obf/passes/next_inst_pass.cpp @@ -12,7 +12,7 @@ void next_inst_pass_t::run(decomp::symbol_t* sym) { xed_decoded_inst_t inst = m_tmp_inst; std::vector new_inst_bytes = - generate_transforms(&inst, reloc.value(), 3, 6); + transform::generate(&inst, reloc.value(), 3, 6); // add a push [rip+offset] and update reloc->offset()... // diff --git a/src/theo/obf/passes/reloc_transform_pass.cpp b/src/theo/obf/passes/reloc_transform_pass.cpp index 3b38d19..45113ae 100644 --- a/src/theo/obf/passes/reloc_transform_pass.cpp +++ b/src/theo/obf/passes/reloc_transform_pass.cpp @@ -27,7 +27,7 @@ void reloc_transform_pass_t::run(decomp::symbol_t* sym) { assert(err == XED_ERROR_NONE); } - auto transforms_bytes = generate_transforms(&inst, reloc.value(), 3, 6); + auto transforms_bytes = transform::generate(&inst, reloc.value(), 3, 6); sym->data().insert(sym->data().end(), transforms_bytes.begin(), transforms_bytes.end()); };