ソースコードの難読化とアンチリバースエンジニアリング
Androidのapkファイルをjadxででコンパイルした際に、例えば電卓みたいな単純なアプリなのに何百ものファイルで構成されていたり、何の機能も持っていないように見えてプログラムの動作に何の寄与もしていないファイルを無数に組み合わせてネストさせ、そのファイルの内一つでも欠けると動作しないように仕込み、本体のメインファイルを巧妙に隠蔽しているものが多数みられた。これは何なのかをGeminiに訊いてみた。
Q.1
何の機能も持たず、プログラムの動作に寄与しないソースコードファイルを複数組み合わせてネストさせ、本体となるメインファイルを隠蔽したり、何の機能も持たずに何の動作にも寄与しないファイルを一つでも欠けさせると動作しないような仕組みを作る方法は何と呼ばれるか?
A.1
ご質問の意図されている仕組みは、一般的に「難読化 (Obfuscation)」や、より広範な意味で「アンチリバースエンジニアリング (Anti-Reverse Engineering) 技術」と呼ばれるものの一部として捉えることができます。
特に、
* 意味のないファイルの多層的なネスト: これはコードの構造を複雑にし、解析を困難にするための難読化手法の一つです。
* 依存関係を複雑にする仕組み: 動作に寄与しないファイルを含め、それらが一つでも欠けるとプログラムが動作しないように見せかける手法は、依存性の錯覚やおとりファイルなどと呼ばれることがあります。これもリバースエンジニアリングを妨害する目的で用いられます。
これらの手法は、ソフトウェアの知的財産を保護したり、悪意のあるコードの解析を遅らせたりするために用いられることがあります。
具体的な技術要素としては、以下のようなものが考えられます。
* インクルード/インポートの多用: 多くのプログラミング言語で、別のファイルを読み込む機能があります。意味のないファイルや空のファイルを多数インクルード/インポートすることで、コードの全体像を把握しにくくします。
* 条件分岐の複雑化: 実行されないことが明らかな条件分岐を多数追加し、コードの流れを追いづらくします。
* 間接的な呼び出し: 関数やメソッドの呼び出しを直接行わず、複数の посредник (仲介者) を介することで、処理の流れを複雑にします。
* チェックサムや整合性チェック: プログラムの起動時や実行中に、特定のファイルが存在するか、内容が改ざんされていないかをチェックする処理を組み込みます。意味のないファイルも含めてチェック対象にすることで、「一つでも欠けると動作しない」という状態を作り出すことができます。
* 仮想化やカスタムローダー: プログラムの実行環境を仮想化したり、カスタムのローダーを使用したりすることで、標準的な解析ツールによる解析を困難にします。
ただし、これらの手法には以下のようなデメリットや注意点があります。
* パフォーマンスの低下: 不要な処理やファイルの読み込みが増えることで、プログラムの実行速度が低下する可能性があります。
* 保守性の低下: コードが複雑化するため、開発者自身にとっても保守が困難になることがあります。
* 完全な防御は不可能: 熟練したリバースエンジニアにとっては、これらの難読化技術を突破することも可能です。
* 倫理的な問題: 過度な難読化は、正当な理由による解析(セキュリティ監査など)を妨げる可能性があり、倫理的な議論を呼ぶことがあります。
したがって、これらの技術は、セキュリティ対策の一環として慎重に検討し、適切な範囲で使用する必要があります。
ご質問の「何の機能も持たず、プログラムの動作に寄与しないソースコードファイルを複数組み合わせてネストさせ、本体となるメインファイルを隠蔽したり、何の機能も持たずに何の動作にも寄与しないファイルを一つでも欠けさせると動作しないような仕組み」を作る方法は、主に難読化とアンチリバースエンジニアリングの範疇に含まれる技術を組み合わせることで実現できます。
コメント
コメントを投稿