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