forked from IDontCode/Theodosius
parent
c7eb3c83bf
commit
88bf8873ec
@ -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
|
Loading…
Reference in new issue