テクニック 難読化の種類には、単純なキーワード置換、芸術的な効果を生み出すための空白の使用または不使用、自己生成プログラムや高度に圧縮されたプログラムなどがある。
ニック・モントフォート によれば、その手法には以下のようなものがある。
命名難読化とは、変数に意味のない、あるいは欺瞞的な名前を付けることを含む。 データ/コード/コメントの混同。これには、実際のコードの一部をコメントのように見せたり、構文とデータを混同したりすることが含まれます。 ダブルコーディングとは、コードを詩の形式や興味深い形状で表示することです。[ 9 ] プログラムの変換によって意味レベルでプログラムを難読化する、より高度な手法も存在する(ソースレベルではなく)。これらには以下が含まれる。
制御フロー難読化変換、例えば、無関係な式の計算を統合し、関連する式の計算を分割する、任意の順序で計算できるステートメントの順序をランダム化する、難読化ツールには値がわかっているが、明らかにならない方法で計算される述語を挿入するなど。[ 10 ] データ構造を難読化する変換、例えば配列の構造を変更したり、継承グラフを再配置したりする。[ 11 ] コードの手続き構造を難読化するために、新しい手続き的抽象化を挿入したり、既存の手続き的抽象化を変更したりして、コードの構造を完全に変更する。 プログラムのデータフローを難読化する。[ 12 ]
例 以下は、ソースコードの難読化の簡単な例です。どちらのプログラムも同じ出力を生成しますが、2番目のバージョンは意図的に理解しにくくなっています。
クリアコード:
#include <stdio.h> int main ( void ) { int x = 5 ; int y = 7 ; printf ( "%d \n " , x + y ); return 0 ; } 難読化されたコード:
#include <stdio.h> int main (){ int _ = 5 , __ = 7 ; printf ( "%d \n " , _ -~ __ -1 );} 難読化バージョンでは、意味のある変数名が削除され、算術式は読みにくい形式に書き換えられますが、プログラムの動作は維持されます。
マルウェア回避のためのペイロードエンコード XOR暗号化 とBase64エンコードは、 マルウェアを ウイルス対策ソフトの検出 から隠すためによく用いられる2つの方法です。どちらも、悪意のあるコードがファイル内でどのように表示されるかを変更することで、セキュリティソフトウェアが危険なパターンを認識できないようにします。
XOR難読化では、攻撃者は秘密鍵を選択し、マルウェアバイナリにXOR ビット演算を適用します。これにより、実行可能ファイルはランダムなデータのように見えるものに変換されます。インポートテーブルの関数名は消え、 PEヘッダーは 破損し、ファイル全体が構造を失います。難読化されたペイロードは、ドロッパー に埋め込まれます。ドロッパーは、リソースまたはデータセクションとして隠されたマルウェアを含む、見た目は通常の実行可能ファイルです。ユーザーがドロッパーを実行すると、同じ鍵でXOR演算を再度実行して元のマルウェアを再構築し、メモリから直接実行するか、実行前にディスクに書き込みます。[ 13 ]
このプロセスでは、アンチウイルス ソフトウェアが頼りにしているいくつかの指標が削除されます。すべての Windows実行可能ファイル の 先頭を示す 2 バイトの署名 であるMZ ヘッダーは 、XOR 演算によって完全に隠蔽されます ASCII テキストに変換することで、実行可能ファイルが (プログラムではなく) プレーン テキストのように見えるようになります。
2020年の機械学習セキュリティ回避コンペティションの研究によると、これらの手法は最新の検出システムを回避できることが示されました。参加者は、XORエンコーディング、Base64エンコーディング、デッドコード挿入の組み合わせを使用して、サンプルあたり5回未満の試行で3つのコンペティションモデルすべてを回避しました。 エントロピーベースの検出も失敗し、場合によってはBase64エンコーディングによって、元のマルウェアファイルと比較してエントロピー が実際に低下しました。[ 14 ]
これらの手法の単純さこそが、特に危険な点である。XORとBase64エンコードは基本的なプログラミングスキルさえあれば実装できるにもかかわらず、高度な機械学習 分類器に対しても有効であることが証明されている。このため、セキュリティ研究者たちは、自動化されたXORキー復元ツールや、実行可能ファイルに埋め込まれたリソースのより詳細な分析など、新たな防御策の開発に取り組んでいる。
コードの難読化を実行または支援するためのツールは多岐にわたる。これには、研究者によって開発された実験的な研究ツール、趣味で開発されたツール、専門家によって作成された商用製品、そしてオープンソースソフトウェア などが含まれる。さらに、難読化プロセスを逆転させることを目的とした、難読化解除ツールも存在する。
ほとんどの商用難読化ソリューションは、プログラムのソースコードまたはプラットフォームに依存しないバイトコード( Java や.NET で使用されるようなポータブルコード)を変換しますが 、コンパイル済みのバイナリに直接作用するものもあります。
暗号化 暗号学者は、コードのリバースエンジニアリングが暗号学的に 困難になるようにコードを難読化するというアイデアを探求してきました。これは、不可分性難読化 に関する多くの提案で形式化されています。不可分性難読化は、安全に構築できれば、誰も作成方法を知らないまったく新しいタイプを含む、他の多くの種類の暗号を構築できる暗号プリミティブです。(より強力な概念であるブラックボックス難読化は 、一般的には不可能であることが知られています。)[ 22 ] [ 23 ]
難読化のデメリット 難読化によってプログラムの読み書きやリバースエンジニアリングが困難で時間のかかるものになる可能性はあるものの、必ずしも不可能になるわけではない。[ 24 ] これは開発者にとって、ビルドプロセスに時間と複雑さを加えることになる。 ソフトウェアが難読化された後では、デバッグ作業が非常に困難になる可能性がある。 コードのメンテナンスが終了すると、趣味でプログラムを維持したり、改造を加えたり、より深く理解しようとする人が出てくるかもしれません。しかし、難読化によって、エンドユーザーがコードを使って有益なことを行うことが難しくなります。 特定の種類の難読化(つまり、ローカルバイナリではなく、必要に応じてWebサーバーからミニバイナリをダウンロードするコード)は、パフォーマンスを低下させたり、インターネット接続を必要とする場合があります。
難読化されたコードをユーザーに通知する AVG AntiVirus [ 25 ] などの一部のウイルス対策ソフトウェアは、手動で難読化されたコードを含む Web サイトにアクセスした際にユーザーに警告を発します。これ は、難読化の目的の 1 つは悪意のあるコードを隠すことであるためです。しかし、開発者によっては、ファイル サイズを小さくしたりセキュリティを強化したりするためにコードの難読化を使用する場合があります。平均的なユーザーは、特に信頼できる企業からの無害なコードについてウイルス対策ソフトウェアが警告を発するとは期待していないため、このような機能は実際にはユーザーが正規のソフトウェアを使用することを阻害する可能性があります。
Mozilla とGoogleは、それぞれのブラウザ( Firefox とChrome )のアドオンストアで難読化されたコードを含むブラウザ拡張機能を許可していません。 [ 26 ] [ 27 ]
デコンパイラ デコンパイラと は、実行ファイルやライブラリからソースコードを逆算できるツールです。このプロセスは、暗号化における伝統的な「中間者攻撃 」にちなんで、「エンド攻撃(mite攻撃)」と呼ばれることもあります。逆コンパイルされたソースコードは、ランダムな関数名や変数名、誤った変数型、コンパイラの最適化によって元のソースコードとは異なるロジックが含まれているため、読みにくい場合が多いです。
モデルの難読化 モデルの難読化は、 機械学習 モデルの内部構造を隠す技術です。[ 30 ] 難読化によってモデルはブラックボックスになります。これは説明可能なAI とは相反するものです。難読化モデルは、ランダムノイズを追加するために、トレーニングデータをモデルに入力する前に適用することもできます。これにより、個々のサンプルやサンプルグループの特性に関する機密情報が隠されます。[ 31 ]
参考文献 ↑ 「難読化(obfu)とは? - WhatIs.com の定義」。SearchSoftwareQuality。2019 年2 月 2 日のオリジナルからアーカイブ済み。2019年 2 月 1 日 取得 。 ↑ ビンストック、アンドリュー(2003年3月6日)。 「難読化:コードを覗き見から隠す」 。 2008年4月20日の オリジナル からアーカイブ 。 2013年 11月25日 取得。 ↑ アトウッド、ジェフ(2005年5月15日)。 「ジェフ・アトウッド、2005年5月15日」 。Codinghorror.com。 2010年1月9日の オリジナルからアーカイブ。 2013年 11月25日 取得 。 ↑ 「難読化」 。Kenter.demon.nl。 2016年3月4日の オリジナルからアーカイブ済み 。 2013年 11月25日 取得。 ↑ "C++ チュートリアル – 難読化されたコード – 簡単な入門" . DreamInCode.net。2008 年 6 月 28 日のオリジナルからアーカイブ済み。2013 年 11 月 25 日 取得 。 ↑ 「Cチュートリアル – C言語の難読化コード」 。2011年7月7日。 2013年12月27日に オリジナルからアーカイブ済み 。 2013年 11月25日 取得。 ↑ 2013年11月25日18:22 GMT時点。 「ラインノイズのPe(a)rls」 。Perlmonks.org。 2009年1月16日のオリジナルから アーカイブ 。 2013年 11月25日 取得。 {{cite web}}: CS1 maint: 数値名: 著者リスト (リンク)↑ 「難読化 – Haskell Wiki」 。2006年2月16日。 2017年8月30日のオリジナルから アーカイブ済み 。 2020年 3月3日 取得。 ↑ Montfort, Nick. "難読化されたコード" (PDF) 。 2019年4月24日に オリジナル (PDF)からアーカイブ済み。 2017年 11月24日 に取得 。 ↑ コルバーグ、クリスチャン;トンボルソン、クラーク;ロウ、ダグラス(1998年1月21日) 「安価で、堅牢で、ステルス性の高い不透明な構造の製造」 。 第25回ACM SIGPLAN-SIGACTプログラミング言語原理シンポジウム(POPL '98 ) 議事録 。ニューヨーク州ニューヨーク:Association for Computing Machinery。pp. 184–196。doi : 10.1145 / 268946.268962。ISBN 978-0-89791-979-1 。↑ Collberg, C.; Thomborson, C.; Low, D. (1998年6月)「抽象化の打破とデータ構造の非構造化」 1998年国際コンピュータ言語会議議事録(カタログ番号98CB36225) pp. 28–38 . doi : 10.1109/ICCL.1998.674154 . ISBN 0-8186-8454-2 。↑ Linn, Cullen; Debray, Saumya (2003年10月27日). 静的逆アセンブルに対する耐性を向上させるための実行可能コードの難読化 . pp. 290–299 . doi : 10.1145/948109.948149 . ISBN 1-58113-738-9 2026年3月11日 に取得 。↑ Ceschin, Fabrício; Botacin, Marcus; Lüders, Gabriel; Gomes, Heitor Murilo; Oliveira, Luiz S.; Grégio, André (2020). "古いマルウェアに新しいトリックを教える必要はありません: XOR ベースの敵対的サンプルで回避チャレンジに勝利する". リバースエンジニアリングと攻撃指向のトレンドシンポジウム議事録 . pp. 1– 10. doi : 10.1145/3433667.3433669 . ↑ Ceschin, Fabrício; Botacin, Marcus; Lüders, Gabriel; Gomes, Heitor Murilo; Oliveira, Luiz S.; Grégio, André (2020). "古いマルウェアに新しいトリックを教える必要はありません: XOR ベースの敵対的サンプルで回避チャレンジに勝利する". リバースエンジニアリングと攻撃指向のトレンドシンポジウム議事録 . pp. 1– 10. doi : 10.1145/3433667.3433669 . ↑ ベン・クルトヴィッチ。 「「Hello world!」を難読化する」 " . benkurtovic.com . 2017年9月14日のオリジナルからアーカイブ済み。2017年10月18日 に取得。↑ 「難読化されたPython」 。wiki.c2.com 。 2017 年2月14日のオリジナルから アーカイブ済み。 2017年 10月18日 取得 。 ↑ 「第1回難読化Pythonコンテンツ」 。code.activestate.com 。2023年5月25日のオリジナルからアーカイブ済み 。 2017 年 10 月18日 取得 。 ↑ domas (2022年11月3日)、 xoreaxeaxeax/movfuscator 、 2022年11月12日にオリジナルから アーカイブ 、 2022年 11月5日に取得 ↑ Break Me00 The MoVfuscator movを魂を打ち砕くバイオハザードの悪夢に変える Christopher Domas 、2015年9月25日、 2022年10月21日にオリジナルから アーカイブ 、 2022年 11月5日に取得 ↑ Williams, Al (2021年3月21日). 「すべてを支配する1つの命令:CコンパイラはMOVのみを出力する」 . Hackaday . 2023年 10月23日 取得 。 ↑ "JAPH – Just Another Perl Hacker" . pm.org . Perl Mongers. 2013年5月16日の オリジナルからアーカイブ済み。 2015年 2月27日 取得 。 ↑ 「暗号化技術のブレークスルー により 、ソフトウェアがハッキング不可能になる可能性」。Wired。ISSN 1059-1028 。 2022 年 4 月 14日のオリジナルから アーカイブ。 2021年 3月14日 取得 。 ↑ Jain, Aayush; Lin, Huijia ; Sahai, Amit (2020). "Indistinguishability Obfuscation from Well-Founded Assumptions" . Cryptology ePrint Archive . arXiv : 2008.09317 . 2022年3月3日のオリジナルから アーカイブ済み。 2021年 3月14日 取得 。 ↑ " 「プログラムを難読化できるか?」Boaz Barak著。Math.ias.edu。2016年3月23日のオリジナルからアーカイブ済み。 2013年 11月25日 取得 。↑ 「Webサイトがブロックされ、HTTPSを無効にする以外に解決策がない... | AVG」 . support.avg.com . 2020年7月21日。 2022年2月4日のオリジナルから アーカイブ済み 。 2022年 2月4日 に取得。 ↑ 2018年10月2日、サンフランシスコのThomas Claburnによる05:01の記事「GoogleがChromeウェブストアの偽装コード に対して 対策を講じる」 。www.theregister.co.uk 。 2019年11月12日にオリジナルから アーカイブ済み。 2019年 11月12日 に取得 。 {{cite web}}: CS1 maint: 数値名: 著者リスト (リンク)↑ Cimpanu, Catalin. 「Mozilla、難読化コードを含むFirefox拡張機能の禁止を発表」 . ZDNet . 2020年3月5日のオリジナルから アーカイブ済み。 2019年 11月12日 取得 。 ↑ 「GPLにおける「作品の変更を行うための好ましい形式」という文言の根拠」 。Lwn.net。 2013年12月2日のオリジナルから アーカイブ。 2013年 11月25日 取得 。 ↑ 「フリーソフトウェアとは何か?」 gnu.org。 2013年10月14日のオリジナルから アーカイブ。 2014年 12月18日 取得 。 ↑ Zhou, Mingyi; Gao, Xiang; Wu, Jing; Grundy, John C.; Chen, Xiao; Chen, Chunyang; Li, Li (2023年2月13日). 展開済みニューラルネットワークを保護するためのモデル難読化 . 第11回国際学習表現会議. キガリ : 国際学習表現会議. 2026年 7月26日 取得 . 決定: 却下 ↑ Zhang, Tianwei; He, Zecheng; Lee, Ruby B. (2018年7月13日). "データ難読化によるプライバシー保護機械学習". arXiv : 1807.01860v2 [ cs.CR ].
さらに読む Seyyedhamzeh, Javad、「ABCME: 新しい変形エンジン [ リンク削除]」 、第17回全国コンピュータ会議、シャリフ工科大学、テヘラン、イラン、2012年。 B. Barak、O. Goldreich、R. Impagliazzo、S. Rudich、A. Sahai、S. Vadhan、K. Yang。「難読化プログラムの(不)可能性について」。第21回国際暗号学会議 、米国カリフォルニア州サンタバーバラ。Springer Verlag LNCS 第2139巻、2001年。 マテアス、マイケル、ニック・モントフォート。「A Box, Darkly: Obfuscation, Weird Languages, and Code Aesthetics」(PDF) 。第6回デジタルアート&カルチャー会議議事録、コペンハーゲンIT大学、2005年12月1~3日 。pp. 144–153 。2008年6月23日にオリジナルからアーカイブ(PDF) 。 2008年 6月28日 取得 。
外部リンク 国際難読化Cコードコンテスト Javaコードの難読化による保護、ACM Crossroads、1998年春号 プログラムを難読化することは可能でしょうか? ユーリー・リフシッツ著「プログラム難読化に関する講義ノート(2005年春)」 c2:ブラックボックス計算