#ifndef OBFUSCATOR_HPP #define OBFUSCATOR_HPP #include #include #define COMPILE_TIME_SEQUENCE #define OBFS_FINITE_STATE_MACHINE #define COMPILE_TIME_RANDOM #define MAKE_RAND_VAL(MOD) RAND_VAL<__LINE__, MOD> #define OBFS_STRING #define MAKE_STRING(Var, String, ...) constexpr auto Var = obfs::make_string<__VA_ARGS__>(String); namespace obfs { template struct TypeVal { using value_type = T; constexpr static T value = Val; }; struct Nothing {}; template struct Sequence { using value = TypeVal; using next = Sequence; constexpr static std::size_t size = 1 + sizeof...(Others); template using index = std::conditional_t>; }; template struct Sequence { using value = TypeVal; constexpr static std::size_t size = 1; template using index = std::conditional_t; }; template struct TypeSeq { using type = T; using next = TypeSeq; template using index = std::conditional_t>; }; template struct TypeSeq { using type = T; template using index = std::conditional_t; }; template struct MinVal { constexpr static std::size_t value = Val < MinVal::value ? Val : MinVal::value; }; template struct MinVal { constexpr static std::size_t value = Val; }; template struct SeqPack { constexpr static std::size_t size = sizeof...(T); constexpr static std::size_t elem_size = MinVal::value; template using getter = typename U::template index; template using index = TypeSeq...>; }; } namespace obfs { constexpr bool FreeAction() { return false; } template struct Next { using event = Event; using state = State; constexpr static bool(*action)() = Action; }; struct Pass {}; template struct First { using type = std::conditional_t< std::is_same_v, typename First::type, T>; }; template struct First { using type = std::conditional_t< std::is_same_v, IfAllPass, T>; }; struct None {}; template struct Stage { using state = State; template using act = std::conditional_t< std::is_same_v, Cond, Pass>; template using next = typename First, act...>::type; }; template struct StateMachine { template using find = std::conditional_t< std::is_same_v, ST, Pass>; using stage = typename First...>::type; template using next = typename stage::template next; template using next_s = StateMachine::state, Specs...>; template constexpr static void run() { if (next::action()) { return; } if constexpr (sizeof...(Others) > 0) { next_s::template run(); } } }; } namespace obfs { constexpr char TIME[] = __TIME__; constexpr int digit(char c) { return c - '0'; } constexpr int SEED = digit(TIME[7]) + digit(TIME[6]) * 10 + digit(TIME[4]) * 60 + digit(TIME[3]) * 600 + digit(TIME[1]) * 3600 + digit(TIME[0]) * 36000; using size_t = decltype(sizeof(void*)); template struct Xorshiftplus { using prev = Xorshiftplus; constexpr static size_t update() { constexpr size_t x = prev::state0 ^ (prev::state0 << 23); constexpr size_t y = prev::state1; return x ^ y ^ (x >> 17) ^ (y >> 26); } constexpr static size_t state0 = prev::state1; constexpr static size_t state1 = update(); constexpr static size_t value = state0 + state1; }; template <> struct Xorshiftplus<0> { constexpr static size_t state0 = static_cast(SEED); constexpr static size_t state1 = static_cast(SEED << 1); constexpr static size_t value = state0 + state1; }; template constexpr size_t RAND_VAL = Xorshiftplus::value % Mod; } namespace obfs { using Encoder = char(*)(char); using Decoder = char(*)(char); template class String { public: template constexpr String(char const* str, std::index_sequence): str{ encoder(str[Idx])... } { // Do Nothing } inline char const* decode() const { for (char& chr : str) { chr = decoder(chr); } return str; } private: mutable char str[size]; }; template constexpr auto make_string(char const (&str)[size]) { return String(str, std::make_index_sequence()); } template using encoder_seq = Sequence; template using decoder_seq = Sequence; template using make_table = SeqPack; template constexpr auto make_string(char const (&str)[size]) { using pair = typename Table::template index; constexpr Encoder encoder = pair::template index<0>::value; constexpr Decoder decoder = pair::template index<1>::value; return make_string(str); } } #endif