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.
51 lines
1.7 KiB
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
|