ソフトウェア開発において、難読化とは、人間やコンピュータが理解しにくいソースコードやマシンコードを作成することです。自然言語の難読化と同様に、コードの難読化では、不必要に回りくどい文の書き方をすることがあります。プログラマーは、目的、ロジック、埋め込まれた値を隠すためにコードを難読化することがよくあります。これを行う主な理由は、改ざんの防止、リバースエンジニアリングの阻止、またはコードを難読化解除するためのパズルやレクリエーションの課題(クラックコードによく含まれる課題)を作成することです。難読化は手動で行うこともできますが、難読化ツールを使って行う方が一般的です。[1]
概要
一部の言語は、そのアーキテクチャや特性により、他の言語よりも難読化されやすい場合があります。[2] [3] C、[4] C++、[5] [6] Perl プログラミング言語[7]は難読化されやすい言語の例です。Haskellも構造がかなり異なるにもかかわらず、非常に難読化されやすいです[8]。
言語を難読化しやすくする特性は、すぐには明らかではありません。
テクニック
難読化の種類には、単純なキーワードの置換、芸術的な効果を生み出すための空白の使用または非使用、自己生成プログラムまたは大幅に圧縮されたプログラムなどがあります。
Nick Montfortによれば、次のようなテクニックが考えられます。
- 名前の難読化(変数に意味のない、または誤解を招くような名前を付けることを含む)
- データ/コード/コメントの混乱。実際のコードがコメントのように見えたり、構文とデータが混同されたりすることが含まれます。
- 二重コーディングは、コードを詩の形や面白い形で表示することができます。[9]
自動化ツール
コード難読化を実行または支援するためのさまざまなツールが存在します。これには、学者が開発した実験的な研究ツール、趣味のツール、専門家が作成した商用製品、オープンソース ソフトウェアが含まれます。さらに、難読化プロセスを元に戻すことを目的とした難読化解除ツールも存在します。
市販の難読化ソリューションのほとんどは、プログラムのソース コードまたはプラットフォームに依存しないバイトコード ( Javaや.NETで使用されるもの) のいずれかを変換しますが、コンパイルされたバイナリで直接動作するものもあります。
- Pythonの例は、公式のPythonプログラミングFAQなどで見つけることができます。[10] [11] [12]
- x86_32 ISA用のmovfuscator Cコンパイラは難読 化のためにmov命令のみを使用します。 [13] [14] [15]
レクリエーション
難読化されたソース コードを書いたり読んだりするのは、頭の体操になることがあります。International Obfuscated C Code ContestやObfuscated Perl Contestなど、最も創造的に難読化されたコードに賞金を出すプログラミング コンテストが数多くあります。
短い難読化されたPerlプログラムは、Perlプログラマーの署名に使用されることがあります。これらはJAPH(「Just another Perl hacker」)です。[16]
暗号化
暗号学者は、コードを難読化して、暗号的にリバースエンジニアリングを困難にするアイデアを研究してきました。これは、区別不能難読化の多くの提案で形式化されています。区別不能難読化は、安全に構築できれば、誰も作り方を知らないまったく新しいタイプを含む、他の多くの種類の暗号を構築できる暗号プリミティブです。(より強力な概念であるブラックボックス難読化は、一般に不可能であることが知られています。)[17] [18]
難読化のデメリット
- 難読化によりプログラムの読み取り、書き込み、リバースエンジニアリングが困難になり、時間がかかるようになるが、必ずしも不可能になるわけではない。[19]
- これにより、開発者のビルド プロセスに時間と複雑さが追加されます。
- ソフトウェアが難読化された後のデバッグの問題は非常に困難になる可能性があります。
- コードがメンテナンスされなくなると、愛好家はプログラムをメンテナンスしたり、改造を加えたり、理解を深めたりしたいと考えるかもしれません。難読化により、エンド ユーザーがコードを使用して有用な操作を行うことが難しくなります。
- 特定の種類の難読化 (つまり、ローカル バイナリだけではなく、必要に応じて Web サーバーからミニ バイナリをダウンロードするコード) は、パフォーマンスを低下させたり、インターネットを必要とする場合があります。
難読化されたコードをユーザーに通知する
AVG AntiVirus [ 20]などの一部のウイルス対策ソフトウェアは、手動で難読化されたコードを含むウェブサイトにアクセスしたときにユーザーに警告を発します。これは、難読化の目的の 1 つが悪意のあるコードを隠すことにあるためです。ただし、一部の開発者は、ファイル サイズを小さくしたり、セキュリティを強化したりする目的でコードの難読化を使用する場合があります。平均的なユーザーは、特に信頼できる企業からの、無害なコードについてウイルス対策ソフトウェアが警告を発することを期待していないため、このような機能は実際にはユーザーが正当なソフトウェアを使用することを思いとどまらせる可能性があります。
MozillaとGoogleは、アドオンストアで難読化されたコードを含むブラウザ拡張機能を許可していません。[21] [22]
難読化とコピーレフトライセンス
作者がソースコードを公開することにあまり乗り気でないような場合など、難読化された形式でソースコードを公開することでコピーレフト ソフトウェアライセンスを回避することが違法であるかどうかについては議論がある。この問題は、 GNU 一般公衆利用許諾書で「変更を加えるための推奨形式」を公開することを義務付けることによって対処されている。[23] GNU の Web サイトには、「難読化された『ソースコード』は実際のソースコードではなく、ソースコードとしてカウントされません」と記載されている。[24]
デコンパイラ
逆コンパイラは、実行可能ファイルまたはライブラリからソース コードをリバース エンジニアリングできるツールです。このプロセスは、暗号化における従来の「中間者攻撃」にヒントを得て、マン イン ザ エンド (Mite) 攻撃と呼ばれることもあります。逆コンパイルされたソース コードは、ランダムな関数名や変数名、誤った変数型、コンパイラの最適化により元のソース コードとは異なるロジックが含まれるなど、読みにくいことがよくあります。
モデルの難読化
モデルの難読化は、機械学習モデルの内部構造を隠す技術である。[25]難読化はモデルをブラックボックス化する。これは説明可能なAIとは相反する。難読化モデルは、モデルに入力する前にトレーニングデータに適用してランダムノイズを追加することもできる。これにより、個々のサンプルやサンプルグループの特性に関する機密情報が隠される。[26]
参照
参考文献
- ^ 「難読化 (obfu) とは何か? - WhatIs.com の定義」。SearchSoftwareQuality。2019年2 月 2 日時点のオリジナルよりアーカイブ。2019 年2 月 1 日閲覧。
- ^ Binstock, Andrew (2003 年 3 月 6 日)。「Obfuscation: Cloaking your Code from Prying Eyes」。2008 年 4 月 20 日時点のオリジナルよりアーカイブ。2013年11 月 25 日閲覧。
- ^ Atwood, Jeff (2005年5月15日). 「Jeff Atwood、2005年5月15日」。Codinghorror.com。2010年1月9日時点のオリジナルよりアーカイブ。2013年11月25日閲覧。
- ^ “Obfuscation”. Kenter.demon.nl. 2016年3月4日時点のオリジナルよりアーカイブ。2013年11月25日閲覧。
- ^ 「C++ チュートリアル – 難読化されたコード – 簡単な入門」DreamInCode.net。2008 年 6 月 28 日時点のオリジナルよりアーカイブ。2013 年11 月 25 日閲覧。
{{cite web}}: CS1 メンテナンス: 不適切 URL (リンク) - ^ 「C チュートリアル – C の難読化コード」。2011 年 7 月 7 日。2013 年 12 月 27 日時点のオリジナルよりアーカイブ。2013 年11 月 25 日閲覧。
- ^ 2013-11-25 18:22 GMT 時点。「Pe(a)rls in line noise」。Perlmonks.org。2009 年 1 月 16 日時点のオリジナルよりアーカイブ。2013年11 月 25 日閲覧。
{{cite web}}: CS1 maint: 数値名: 著者リスト (リンク) - ^ “Obfuscation – Haskell Wiki”. 2006年2月16日. 2017年8月30日時点のオリジナルよりアーカイブ。2020年3月3日閲覧。
- ^ Montfort, Nick. 「難読化されたコード」(PDF) 。 2019年4月24日時点のオリジナル(PDF)からアーカイブ。2017年11月24日閲覧。
- ^ Ben Kurtovic. 「"Hello world!" の難読化」benkurtovic.com。2017年9月14日時点のオリジナルよりアーカイブ。 2017年10月18日閲覧。
- ^ 「Obfuscated Python」. wiki.c2.com . 2017年2月14日時点のオリジナルよりアーカイブ。2017年10月18日閲覧。
- ^ 「The First Annual Obfuscated Python Content」. 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 Turning mov into a soul crushing RE nightmare Christopher Domas、2015年9月25日、2022年10月21日時点のオリジナルよりアーカイブ、 2022年11月5日閲覧。
- ^ Williams, Al (2021年3月21日). 「One Instruction To Rule Them All: C Compiler Emits Only 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日閲覧。
- ^ 「ウェブサイトがブロックされています。修正するには、HTTPS を無効にするしかありません... | AVG」。support.avg.com。2020年7月21日。2022年2月4日時点のオリジナルよりアーカイブ。 2022年2月4日閲覧。
- ^ 05:01、サンフランシスコのトーマス・クラバーン、2018年10月2日。「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日閲覧。
- ^ 周、明義;ガオ、シャン。ウー、ジン。グランディ、ジョン C.チェン、シャオ。チェン、チュンヤン。リー、リー (2023)。 「展開されたニューラル ネットワークを保護するためのモデル難読化」。
{{cite journal}}:ジャーナルを引用するには|journal=(ヘルプ)が必要です - ^ Zhang, Tianwei; He, Zecheng; Lee, Ruby B. (2018年7月12日). 「データの難読化によるプライバシー保護機械学習」. arXiv : 1807.01860 [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 年。
- Mateas, Michael; Nick Montfort。「A Box, Darkly: Obfuscation, Weird Languages, and Code Aesthetics」(PDF)。第 6 回デジタル アートおよび文化カンファレンスの議事録、IT University of Copenhagen、2005 年 12 月 1 ~ 3 日。pp. 144 ~ 153。2008年 6 月 23 日時点のオリジナルからアーカイブ(PDF) 。2008 年6 月 28 日閲覧。
外部リンク
- 国際難読化Cコードコンテスト
- コード難読化による Java コードの保護、ACM Crossroads、1998 年春号
- プログラムを難読化できますか?
- Yury Lifshits. プログラム難読化に関する講義ノート (2005 年春)
- c2:ブラックボックス計算
