C ++宏中的字符串修改

时间:2015-08-31 11:53:47

标签: c++ string macros

有没有办法从宏修改C ++中的字符串文字?

原因是混淆了代码,尤其是2个互斥体希望:

  1. 我希望在源代码中看到文字,例如" password123"。
  2. 我希望它们在编译之前以某种方式被破坏,以避免将它们包含在二进制文件中。
  3. 我知道像XOR或移位这样的原始修改对于专业分析来说还不够,但它们对我来说已经足够了。

2 个答案:

答案 0 :(得分:3)

您可以创建一个实际上没有做任何事情的宏,但是在预处理器获取源代码之前,使用宏作为自定义构建步骤(简单脚本可能会执行此操作)的“标记”来混淆字符串。

答案 1 :(得分:3)

您可以使用宏将字符串传递给执行"加密的constexpr函数。"从C ++ 14开始,constexpr更容易使用。

// Similar to std::array, but with a member pointer as an accessor.
// It's complicated.
template< std::size_t length >
struct string_holder {
    char str[ length ];
    char const * ptr = str;
};

template< std::size_t length >
constexpr string_holder< length > encrypt( char const (& in)[ length ] ) {
    string_holder< length > result = {};
    for ( std::size_t i = 0; i != length - 1; ++ i ) {
        result.str[ i ] = in[ i ] ^ 1; // Do encryption here.
    }
    return result;
}

#define ENCRYPT( STR ) ( encrypt( STR ).ptr )

char const * const & s = ENCRYPT( "password123" );

http://coliru.stacked-crooked.com/a/3b6f6753d9f722cb

注意,s需要声明为const&引用才能利用生命周期扩展。你也可以写auto const& sauto &&s;它会是一样的。 Clang的当前版本不允许s声明constexpr,但我认为这是一个错误。

理想情况下,你可以写一个用户定义的文字,如"password123"_encrypted。不幸的是,实现基础语言功能的进展缓慢。