楽しみのためにコードを難読化したい。国際難読化 C コンテストのコードを見ています。
いくつかの一般的な難読化手法と、難読化されたコードをどのように理解しますか?
コードを難読化するためのさまざまな手法が多数あります。ここに示すのは、小さく、非常に不完全なリストです。
識別子マングリング。a、b、c のような名前のみを使用している人を見つけるか、変数/関数の実際の目的とはまったく関係のない識別子を見つけるかのいずれかです。難読化解除は、適切な名前を割り当てることです。
条件評価演算子 を多用し、 の? :
出現箇所をすべて置き換えますif() else
。ほとんどの場合、これは読みにくいため、難読化を解除すると が再挿入されif()
ます。
の代わりにカンマ演算子を多用;
。2. と 4. を組み合わせることで、基本的にプログラム全体を 1 つのステートメントにすることができますmain()
。
の再帰呼び出しmain()
。main が何をすべきかを決定するために使用できる引数を持つことで、任意の関数を main に折りたたむことができます。これを再帰によるループの置き換えと組み合わせると、プログラム全体がメイン関数になります。
3. と 4. とは正反対の方向に進み、事実上何もしない非常に多くの関数を作成することで、すべてをバラバラにハックすることができます。
スタックに値を保存することで、配列のストレージを難読化できます。データを 2 回調べる必要がある場合はfork()
、便利なスタックのコピーを作成するための便利な呼び出しが常にあります。
前述したように、これは非常に不完全なリストですが、一般的に難読化とは、有効なプログラミング手法を体系的に乱用することです。IOCCC が C++ エントリを許可していた場合、多くのテンプレート コードが入力され、if 置換として例外をスローすることを多用し、ポリモーフィズムの背後に構造を隠すことなどに賭けるでしょう。