moved a function out of pass_t that doesnt belong there...

3.0
_xeroxz 3 years ago
parent c7eb3c83bf
commit 88bf8873ec

@ -63,6 +63,7 @@ list(APPEND Theodosius_SOURCES
"include/obf/passes/next_inst_pass.hpp" "include/obf/passes/next_inst_pass.hpp"
"include/obf/passes/reloc_transform_pass.hpp" "include/obf/passes/reloc_transform_pass.hpp"
"include/obf/transform/add_op.hpp" "include/obf/transform/add_op.hpp"
"include/obf/transform/gen.hpp"
"include/obf/transform/operation.hpp" "include/obf/transform/operation.hpp"
"include/obf/transform/rol_op.hpp" "include/obf/transform/rol_op.hpp"
"include/obf/transform/ror_op.hpp" "include/obf/transform/ror_op.hpp"

@ -1,6 +1,7 @@
#pragma once #pragma once
#include <spdlog/spdlog.h> #include <spdlog/spdlog.h>
#include <decomp/symbol.hpp> #include <decomp/symbol.hpp>
#include <obf/transform/gen.hpp>
#define XED_ENCODER #define XED_ENCODER
extern "C" { extern "C" {
@ -15,36 +16,6 @@ class pass_t {
virtual void run(decomp::symbol_t* sym) = 0; virtual void run(decomp::symbol_t* sym) = 0;
decomp::sym_type_t sym_type() { return m_sym_type; } 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: private:
decomp::sym_type_t m_sym_type; decomp::sym_type_t m_sym_type;
}; };

@ -0,0 +1,33 @@
#pragma once
#include <obf/transform/transform.hpp>
#include <recomp/reloc.hpp>
namespace theo::obf::transform {
inline std::vector<std::uint8_t> 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<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;
}
} // namespace theo::obf

@ -1,6 +1,4 @@
#pragma once #pragma once
#include <obf/transform/operation.hpp>
#include <obf/transform/add_op.hpp> #include <obf/transform/add_op.hpp>
#include <obf/transform/rol_op.hpp> #include <obf/transform/rol_op.hpp>
#include <obf/transform/ror_op.hpp> #include <obf/transform/ror_op.hpp>
@ -13,5 +11,5 @@ inline std::map<xed_iclass_enum_t, operation_t*> operations = {
{XED_ICLASS_SUB, sub_op_t::get()}, {XED_ICLASS_SUB, sub_op_t::get()},
{XED_ICLASS_ROL, rol_op_t::get()}, {XED_ICLASS_ROL, rol_op_t::get()},
{XED_ICLASS_ROR, ror_op_t::get()}, {XED_ICLASS_ROR, ror_op_t::get()},
/*{XED_ICLASS_XOR, xor_op_t::get()}*/}; {XED_ICLASS_XOR, xor_op_t::get()}};
} } // namespace theo::obf::transform

@ -12,7 +12,7 @@ void next_inst_pass_t::run(decomp::symbol_t* sym) {
xed_decoded_inst_t inst = m_tmp_inst; xed_decoded_inst_t inst = m_tmp_inst;
std::vector<std::uint8_t> new_inst_bytes = std::vector<std::uint8_t> 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()... // add a push [rip+offset] and update reloc->offset()...
// //

@ -27,7 +27,7 @@ void reloc_transform_pass_t::run(decomp::symbol_t* sym) {
assert(err == XED_ERROR_NONE); 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(), sym->data().insert(sym->data().end(), transforms_bytes.begin(),
transforms_bytes.end()); transforms_bytes.end());
}; };

Loading…
Cancel
Save