#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