【问题标题】:String modification in C++ macroC++ 宏中的字符串修改
【发布时间】:2015-08-31 11:53:47
【问题描述】:

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

原因是混淆了代码,特别是 2 个互斥愿望:

  1. 我想在我的源代码中看到文字,比如“password123”。
  2. 我希望它们在编译之前以某种方式被破坏,以避免将它们包含在二进制文件中。

我知道像 XOR 或移位这样的原始修改不足以进行专业分析,但它们对我来说已经足够了。

【问题讨论】:

  • 我不知道使用 c++ 预处理器进行此类操作。
  • 我可以看到,如果字符串的格式为 (p,a,s,s,w,o,r,d,1,2,3)(p)(a)(s)(s)(w)(o)(r)(d)(1)(2)(3) 或其他分隔字符的格式。您将通过对结果进行字符串化来完成。
  • 除非您将密码分解为单独的字符,否则如果在源代码中以字符串形式写入它们将构成预处理令牌,在预处理期间不会分开。
  • 您可以通过一些模板元编程来实现这样的转换,类似于用于类型安全 printf 的转换。我会尝试寻找合适的链接。
  • This 问题类似,但这不是重复的,所以我重新打开了它。

标签: c++ string macros


【解决方案1】:

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

【讨论】:

  • 实际上,在混淆之后,替换字符串应该被包裹在一个去混淆器中。
【解决方案2】:

您可以使用宏将字符串传递给执行“加密”的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&amp; 引用才能利用生命周期延长。你也可以写auto const&amp; sauto &amp;&amp;s;它会是一样的。当前版本的 Clang 不允许将 s 声明为 constexpr,但我认为这是一个错误。

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

【讨论】:

    猜你喜欢
    • 2018-04-10
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-07-04
    相关资源
    最近更新 更多