#pragma once #include #include #define XED_ENCODER extern "C" { #include #include } namespace theo::obf { class pass_t { public: explicit pass_t(decomp::sym_type_t sym_type) : m_sym_type(sym_type){}; 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; }; } // namespace theo::obf