簡體   English   中英

C ++宏中的字符串修改

[英]String modification in C++ macro

有沒有辦法從宏修改C ++中的字符串文字?

這樣做的原因是混淆了代碼,尤其是兩個互斥鎖:

  1. 我想在源代碼中看到原義,例如“ password123”。
  2. 我希望在編譯之前以某種方式對它們進行處理,以避免將它們包括在二進制文件中。

我知道像XOR或shifting這樣的原始修改不足以進行專業分析,但對我而言已經足夠了。

您可以創建一個實際上沒有做任何事情的宏,但可以將宏用作自定義構建步驟的“標記”(簡單腳本可能會執行此操作),以在預處理器獲取源代碼之前混淆字符串。

您可以使用宏將字符串傳遞給執行“加密”的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 不幸的是,在實現底層語言功能方面進展緩慢。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM