c++宏中的字符串修改

String modification in C++ macro

本文关键字:字符串 修改 c++      更新时间:2023-10-16

是否有办法从宏修改c++中的字符串文字?

这样做的原因是混淆代码,特别是两个互斥对象的愿望:

  1. 我想看到的字面值是在我的源代码,说,"password123"。
  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&引用来利用生命周期延长。你也可以写auto const& sauto &&s;这是一样的。Clang的当前版本不允许将s声明为constexpr,但我相信这是一个错误。

理想情况下,可以只写一个用户定义的字面值,如"password123"_encrypted。不幸的是,实现这方面的底层语言特性进展缓慢。