You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Theodosius/include/obf/pass.hpp

51 lines
1.7 KiB

#pragma once
#include <spdlog/spdlog.h>
#include <decomp/symbol.hpp>
#define XED_ENCODER
extern "C" {
#include <xed-decode.h>
#include <xed-interface.h>
}
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<std::uint8_t> 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<std::uint8_t> new_inst_bytes;
for (auto cnt = 0u; cnt < num_transforms; ++cnt) {
std::uint32_t imm = transform::operation_t::random(
0, std::numeric_limits<std::int32_t>::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