実行可能バイナリ内に埋め込まれた文字列の難読化は、暗号化キーなどの機密情報を不正アクセスから保護するのに役立ちます。ただし、文字列を文字配列に保存するような単純な方法では、分析中にその内容が簡単に明らかになります。
コンパイルされたバイナリ内の文字列を効果的に隠すには、より洗練されたアプローチを使用できます。次の例を考えてみましょう:
#include "HideString.h" DEFINE_HIDDEN_STRING(EncryptionKey, 0x7f, ('M')('y')(' ')('s')('t')('r')('o')('n')('g')(' ')('e')('n')('c')('r')('y')('p')('t')('i')('o')('n')(' ')('k')('e')('y')) DEFINE_HIDDEN_STRING(EncryptionKey2, 0x27, ('T')('e')('s')('t')) int main() { std::cout << GetEncryptionKey() << std::endl; std::cout << GetEncryptionKey2() << std::endl; return 0; }
このコードには、指定された文字列を暗号化するカスタム マクロ「DEFINE_HIDDEN_STRING」が組み込まれています。マクロは、提供されたシード値から派生した一意のキーを使用して各文字をエンコードします (例: 「私の強力な暗号化キー」 -> 0x7f)。シードに基づく暗号化アルゴリズムが文字シーケンスに適用されるため、結果のデータはランダムに見え、コンパイルされたバイナリ内で識別することが困難になります。
#define CRYPT_MACRO(r, d, i, elem) (elem ^ (d - i))
#define DEFINE_HIDDEN_STRING(NAME, SEED, SEQ) \ static const char* BOOST_PP_CAT(Get, NAME)() \ { \ static char data[] = { \ BOOST_PP_SEQ_ENUM(BOOST_PP_SEQ_FOR_EACH_I(CRYPT_MACRO, SEED, SEQ)), \ '' \ }; \ static bool isEncrypted = true; \ if (isEncrypted) \ { \ for (unsigned i = 0; i < (sizeof(data) / sizeof(data[0])) - 1; ++i) \ { \ data[i] = CRYPT_MACRO(_, SEED, i, data[i]); \ } \ isEncrypted = false; \ } \ return data; \ }
このアプローチは、ファイル内の埋め込み文字列を効果的に難読化します。バイナリ コードであるため、暗号化キーとアルゴリズムの知識がなければ抽出することが困難になります。セキュリティと使いやすさのバランスが取れており、機密情報を保護する便利な方法を提供します。
以上が実行可能バイナリに埋め込まれた文字列を効果的に難読化するにはどうすればよいでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。