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.
33 lines
1.3 KiB
33 lines
1.3 KiB
3 years ago
|
#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
|