strings コマンドによる解析に対する対策


C言語でプログラムを書いた後、gccによって実行ファイルを作成し、それをバイナリ解析しようと思ったのですが、以下のプログラムであると、stringsコマンドによって"hoge"という文字列が出力されてしまいます。そこで、それが出力されないようにしたいのですが、どういった手法を用いれば良いのでしょうか。txtファイルに保存してということもできると思うのですが、これをバイナリ解析の問題としてダウンロードファイルにしたいため、それをするとtxtファイルまでダウンロードさせることになり、簡単に解かれてしまうと思い質問しました。

[code]

    #include <stdio.h>
    #include <string.h>
    
    int main(void)
    {
      char buf[32];
      char key[] = "hoge";
    
      puts("Please input password.");
      fgets(buf, sizeof(buf), stdin);
      strtok(buf, "\n");
    
      if(!strcmp(buf, key)){
        puts("Congratulations!");
      }
      else{
        puts("Invalid input.");
      }
      return 0;
    }
    
[/code]




多少脱線しますが回答者も間違えているので重要なこととして補足しておきます。K&R 2nd 4.9 Initializationにも

> Character arrays are a special case of initialization; a string may be used
> instead of the braces and commas notation:
[code]

>     char pattern[] = "ould";
>  
[/code]

>
> is a shorthand for the longer but equivalent
[code]

>     char pattern[] = { 'o', 'u', 'l', 'd', '\0' };
>  
[/code]

と説明されているように、たとえソースコード中で１文字ずつ分割して記述したとしても言語仕様上は同じ意味となります。

* * *

さて回答ですが、ここから一歩発展させて各文字を`~`ビット反転させてみてはどうでしょうか？  
実行時にはもう一度ビット反転させることで値が復元できます。もちろん`~`でなくても特定のビットパターンでのXORでも可能です。

[code]

    char key[] = { ~'h', ~'o', ~'g', ~'e', '\0' };
    for (int i = 0; i < 4; i++) key[i] = ~key[i];
    
[/code]

これで質問にある「strings コマンドによる解析」に対してとりあえずの対策とはなります。

* * *

なお、有名ソフトウェアになりますと例えば[MS SQL
Serverで全ユーザーの生パスワード閲覧可能な脆弱性](https://news.mynavi.jp/article/20090909-a055/)のようにプログラム動作中のメモリを盗み見ることで漏洩する・その対策が求められることになります。  
実行ファイルの難読化も実行開始時に復号してプログラムスタートとなる実装の場合、復号完了した時点でプロセスを一時停止しメモリイメージをダンプされてしまうと簡単に難読化前の実行ファイルを取得できてしまいます。  
そういった事例も踏まえましてどこまで対策を試みるべきかから見直した方がいいかもしれません。

