How to make a C macro pre-build pre-processor?
假设我有一个字符串,我想在代码中混淆它。(本例仅用于学习。)
我的计划是用宏包装字符串文字,例如
1 2 | #define MY_STRING"lol" const char *get_string() { return _MY_ENCRYPTION_MACRO(MY_STRING); } |
作为一个预构建步骤,通过我自己的预处理器运行我的源文件,以查找
我将如何用VisualC++进行这个预处理?
我把这个问题的答案放在一对问题上,好像很多人都有这个问题一样,我也认为这是不可能的,尽管这很简单,但人们在写解决方案时,你需要一个自定义的工具来扫描建筑物后的文件和扫描条纹和加密条纹,比如说,这不是一个坏问题,但我想要一个包装。从视觉工作室编辑出来,现在可能!
你需要什么????????????
新的指挥系统
神奇的发生在这
1 | #define XorString( String ) ( CXorString<ConstructIndexList<sizeof( String ) - 1>::Result>( String ).decrypt() ) |
它不会在计算时解码Xorstring,只是在运行时,但它只会在计算时加密弦乐,所以弦乐不会出现在可执行文件中。
1 | printf(XorString("this string is hidden!" )); |
但你不会发现它的内涵像弦乐一样是可执行的文件!下载链接:https://technet.microsoft.com/en-us/sysinternals/strings.aspx
全部源代码是宽的,但很容易被包括到一个主文件中。但同时也随机地,加密的条纹输出将永远改变每一个新的编译器,种子是以时间为基础的,它的编译速度很快,很坚固,很完美。
创建一个文件名为EDOCX1
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 | #pragma once //-------------------------------------------------------------// //"Malware related compile-time hacks with C++11" by LeFF // // You can use this code however you like, I just don't really // // give a shit, but if you feel some respect for me, please // // don't cut off this comment when copy-pasting... ;-) // //-------------------------------------------------------------// //////////////////////////////////////////////////////////////////// template <int X> struct EnsureCompileTime { enum : int { Value = X }; }; //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// //Use Compile-Time as seed #define 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) //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// constexpr int LinearCongruentGenerator(int Rounds) { return 1013904223 + 1664525 * ((Rounds> 0) ? LinearCongruentGenerator(Rounds - 1) : Seed & 0xFFFFFFFF); } #define Random() EnsureCompileTime<LinearCongruentGenerator(10)>::Value //10 Rounds #define RandomNumber(Min, Max) (Min + (Random() % (Max - Min + 1))) //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// template <int... Pack> struct IndexList {}; //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// template <typename IndexList, int Right> struct Append; template <int... Left, int Right> struct Append<IndexList<Left...>, Right> { typedef IndexList<Left..., Right> Result; }; //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// template <int N> struct ConstructIndexList { typedef typename Append<typename ConstructIndexList<N - 1>::Result, N - 1>::Result Result; }; template <> struct ConstructIndexList<0> { typedef IndexList<> Result; }; //////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////// const char XORKEY = static_cast<char>(RandomNumber(0, 0xFF)); constexpr char EncryptCharacter(const char Character, int Index) { return Character ^ (XORKEY + Index); } template <typename IndexList> class CXorString; template <int... Index> class CXorString<IndexList<Index...> > { private: char Value[sizeof...(Index) + 1]; public: constexpr CXorString(const char* const String) : Value{ EncryptCharacter(String[Index], Index)... } {} char* decrypt() { for(int t = 0; t < sizeof...(Index); t++) { Value[t] = Value[t] ^ (XORKEY + t); } Value[sizeof...(Index)] = '\0'; return Value; } char* get() { return Value; } }; #define XorS(X, String) CXorString<ConstructIndexList<sizeof(String)-1>::Result> X(String) #define XorString( String ) ( CXorString<ConstructIndexList<sizeof( String ) - 1>::Result>( String ).decrypt() ) //////////////////////////////////////////////////////////////////// |
如果你在Linux上使用了最近的GCC(I.E.GCC 4.6),你也可以有一个Plugin,提供一个Builtin Function to"Encrypt"Compile Time Strings,or you could even make it a GCC Melt Extension(Melt is a High-level Domain Specific Language to Extend GCC).
如果你使用其他的C+,你可能有自己的预处理脚本找到你的宏。您可能有一些程序来扫描每一次
1 2 | #define ENCRYPTSTRING(S) ENCRPYTSTRING_AT(S,__LINE__) #define ENCRYPTSTRING_AT(S,L) cryptstring_#L |
并有你产生的EDOCX1&3
ZZU1
发生器可以是一个