Jump to content

Fenrisus

Moderator
  • Content Count

    4
  • Joined

  • Last visited

  • Feedback

    N/A

Community Reputation

6 Neutral

About Fenrisus

Recent Profile Visitors

The recent visitors block is disabled and is not being shown to other users.

  1. Hi guys, today I will tell you how you can protect C ++ code from reverse engineering. Just little trick based on const expr compile-time obfuscation. Everything in comments #pragma once #include "targetver.h" #include <stdio.h> #include <tchar.h> #include <array> #include <iostream> #include <string> #pragma region Learning typedef uint32_t u32; typedef uint64_t u64; typedef unsigned char uchar; template<u32 S, u32 A = 16807UL, u32 C = 0UL, u32 M = (1UL << 31) - 1> struct LinearGenerator { static const u32 state = ((u64)S * A + C) % M; static const u32 value = state; typedef LinearGenerator<state> next; struct Split { // Leapfrog typedef LinearGenerator< state, A*A, 0, M> Gen1; typedef LinearGenerator<next::state, A*A, 0, M> Gen2; }; }; // Metafunction to get a particular index from generator template<u32 S, std::size_t index> struct Generate { static const uchar value = Generate<LinearGenerator<S>::state, index - 1>::value; }; template<u32 S> struct Generate<S, 0> { static const uchar value = static_cast<uchar> (LinearGenerator<S>::value); }; // List of indices template<std::size_t...> struct StList {}; // Concatenate template<typename TL, typename TR> struct Concat; template<std::size_t... SL, std::size_t... SR> struct Concat<StList<SL...>, StList<SR...>> { typedef StList<SL..., SR...> type; }; template<typename TL, typename TR> using Concat_t = typename Concat<TL, TR>::type; // Count from zero to n-1 template<size_t s> struct Count { typedef Concat_t<typename Count<s - 1>::type, StList<s - 1>> type; }; template<> struct Count<0> { typedef StList<> type; }; template<size_t s> using Count_t = typename Count<s>::type; // Get a scrambled character of a string template<u32 seed, std::size_t index, std::size_t N> constexpr uchar get_scrambled_char(const char(&a)[N]) { return static_cast<uchar>(a[index]) + Generate<seed, index>::value; } // Get a ciphertext from a plaintext string template<u32 seed, typename T> struct cipher_helper; template<u32 seed, std::size_t... SL> struct cipher_helper<seed, StList<SL...>> { static constexpr std::array<uchar, sizeof...(SL)> get_array(const char(&a)[sizeof...(SL)]) { return{ { get_scrambled_char<seed, SL>(a)... } }; } }; template<u32 seed, std::size_t N> constexpr std::array<uchar, N> get_cipher_text(const char(&a)[N]) { return cipher_helper<seed, Count_t<N>>::get_array(a); } // Get a noise sequence from a seed and string length template<u32 seed, typename T> struct noise_helper; template<u32 seed, std::size_t... SL> struct noise_helper<seed, StList<SL...>> { static constexpr std::array<uchar, sizeof...(SL)> get_array() { return{ { Generate<seed, SL>::value ... } }; } }; template<u32 seed, std::size_t N> constexpr std::array<uchar, N> get_key() { return noise_helper<seed, Count_t<N>>::get_array(); } /* // Get an unscrambled character of a string template<u32 seed, std::size_t index, std::size_t N> char get_unscrambled_char(const std::array<uchar, N> & a) { return static_cast<char> (a[index] - Generate<seed, index>::value); } */ // Metafunction to get the size of an array template<typename T> struct array_info; template <typename T, size_t N> struct array_info<T[N]> { typedef T type; enum { size = N }; }; template <typename T, size_t N> struct array_info<const T(&)[N]> : array_info<T[N]> {}; // Scramble a string template<u32 seed, std::size_t N> class obfuscated_string { private: std::array<uchar, N> cipher_text_; std::array<uchar, N> key_; public: explicit constexpr obfuscated_string(const char(&a)[N]) : cipher_text_(get_cipher_text<seed, N>(a)) , key_(get_key<seed, N>()) {} operator std::string() const { char plain_text[N]; for (volatile std::size_t i = 0; i < N; ++i) { volatile char temp = static_cast<char>(cipher_text_[i] - key_[i]); plain_text[i] = temp; } return std::string{ plain_text, plain_text + N }; } }; template<u32 seed, std::size_t N> std::ostream & operator<< (std::ostream & s, const obfuscated_string<seed, N> & str) { s << static_cast<std::string>(str); return s; } //compiletime Seed for random string obfuscation #define RNG_SEED ((__TIME__[7] - '0') * 1 + (__TIME__[6] - '0') * 10 + \ (__TIME__[4] - '0') * 60 + (__TIME__[3] - '0') * 600 + \ (__TIME__[1] - '0') * 3600 + (__TIME__[0] - '0') * 36000) + \ (__LINE__ * 100000) #define DECRYPTSTRING(STR) \ obfuscated_string<RNG_SEED, array_info<decltype(STR)>::size>{STR} #pragma endregion Well, now the usage: #include "stdafx.h" auto FooBar = DECRYPTSTRING("FWEFWEFWEFWefwehkdl2hei1o;eh23khdBlahBlahBlah"); int main() { std::cout << DECRYPTSTRING("You can use it like this also") << std::endl; std::getchar(); return 0; } This code obfuscate your string values just like VMProtect.DecryptString ("Foobar") does. Such technique can be used for protect constant string values like public RSA/XXTea/etc. keys, connection IP string or any other string values. It prevents simple reading such values via OllyDbg or IDAPro software. Works like a charm at Visual Studio 2015/2017 x86 Release builds. Enjoy
  2. Thanks. Mainly that is just for education. Understanding the processes how it works also help you to protect your C# application too Wich can be critical in case of Unity3D also. Because C# code is easy to restore nowadays also.
  3. Hello there! Today i will show you, how to unpack and deobfuscate protected C# dll or exe. How to remove anti-tampering and some other techniques.
  4. Fenrisus

    Unity3D SpaceMMO

    © Fenrisus

×
×
  • Create New...

Important Information

By using our forums or services as a guest you agree to our Terms of Service: Terms of Use Privacy Policy: Privacy Policy and Guidelines