質問: "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; } ```
回答: 本当にやりたいのは実行形式ファイルの難読化であって `strings` に特化した話ではなさそうですが、質問タイトルに沿う形で話を続けることにします。 前提条件 - ソースコードを大きく変更しない - `strings` で表示されない 案1.日本語にしてしまう `strings` は日本語文字列を表示しませんから `strcmp(buf, "ほげ")` でよさそうです。 案2.ワイド文字にしてしまう 入力文字を `char` → `wchar_t` に変換して `wcscmp(buf, L"hoge")` とすると `strings a.exe` では `hoge` は表示されなくなります。ただし `strings -el a.exe` では表示されてしまいます。知っている人には通用しなさそうです。 案3.難読化ツール・圧縮ツールを使う MS-DOS の時代には EXE ファイルを圧縮し、起動時に自己展開するようなツールが流行っていました。圧縮すれば `strings` で見ても中身はぐちゃぐちゃです。今はあまり見かけないのでしょうか?ちょっと探しただけだと upx とか超古いものしか見つかりませんでした。 難読化ツール Obfuscator は .NET の世界では広く使われていますが native の世界ではあまり見かけないようです。とりあえずちょろっと検索して見つけた範囲では PELock とか 案4.直接見られたくない文字列はコンパイル前に base64 や uuencode する ソースコード上例えば `strcmp(buf, unbase64(BASE64IZE("hoge")))` のように書きます。 - `BASE64IZE()` はコンパイル前に base64 変換するマクロっつかツールでソース置換する - `unbase64()` は実行時に base64 逆変換する関数を自作 windows 特化であれば文字列リソースを base64/uuencode しておいて `LoadResource` 後に元に戻すとか。パスワードを含むテキストファイルを zip 圧縮してヘッダ取り除くとか。まあやろうと思えばいくらでもできます。あとはコストパフォーマンスの問題に過ぎないです。 --- 以下追記 --- パスワードの生文字列を見せたくないのであればパスワードシステムとしてすでに確立しているソルト+暗号学的単方向ハッシュ(+ストレッチング)を実装してみるとか。固定ソルト+固定ハッシュを1回で十分(ソルトなしでも十分という話がちらほら聞こえてきそうです)