難読化を正しく行うために必要なことは?
ブログ記事シリーズ「はじめてのPreEmptive Protection」第1回目では、"難読化"の技術を必要十分に活用できるように、それと強いつながりをもつ"リバースエンジニアリング"と"逆コンパイル"の説明をまじえて、難読化の詳細に迫っていきたいと思います。
ブログ記事シリーズ「はじめてのPreEmptive Protection」とは・・・。
『ソースコードの難読化は本当に必要なの?』
『難読化でよく使われているツールはどれ?』
『有料版と無料版のツールには違いがあるの?』
<はじめてのPreEmptive Protectionシリーズの記事一覧>
1)「難読化を正しく行うために必要なことは?」編(→当ページ)
2)「JavaScriptと難読化ツール、有料版と無料版の違い」編
3)「.NETやXamarinで難読化を行うことは重要です。」編
4)「Android/Javaアプリを難読化して強力に保護するには」編
※ 弊社のサイトを初めてご覧になった方は、会社紹介のブログ記事からお読みください。
*目次*
リバースエンジニアリングと逆コンパイルの本来の意味
これから始まる当ブログ記事シリーズでは、難読化について詳しく説明したうえで、難読化ツールのパッケージ製品「PreEmptive Protection」をはじめとした専用ツールを紹介していきます。今回は、難読化について深掘りしようと思いますが、この後に続くブログ記事の概要については、こちらをご確認ください。
さて、話を進めていく前に、難読化と並んでよく目にするリバースエンジニアリングと逆コンパイルについて先ずは確認しておきましょう。
リバースエンジニアリングや逆コンパイルは不正行為?
「リバースエンジニアリング」は、ハッキング(またはクラッキング)などを目的にした不正行為のひとつである、といったネガティブな意味で使われることが多いようです。しかし正確には、"自社/他社のハードまたはソフト製品を細かく解析して、その仕組みや構成などを明らかにすること"を意味します。つまり、必ずしもリバースエンジニアリング=不正行為というわけではありません。
自社製品の脆弱性を調査してセキュリティの強化を図ったりする一方で、他社製品を解析して機能の一部を許可もなく自社製品に取り込むような不正行為を行うなど、リバースエンジニアリングを行う目的はさまざまであり、その目的によって意味の良し悪しが変わってきます。
そして、リバースエンジニアリングと並んでよく目にするのが「逆コンパイル」です。そもそも「コンパイル」とは、プログラム言語(人間が見て理解できる形式)で書かれたソースコードを、機械語 (コンピュータが理解して実行できる形式)や中間言語(プログラム言語と機械語の両方の特徴をもつ形式)などで書かれたオブジェクトコードに変換するということです。
したがって、逆コンパイルとは、"オブジェクトコード(機械語や中間言語など)をソースコード(プログラム言語)に変換する(=元に戻す)"という意味になります。ソースコードが入手できない場合でも、逆コンパイルを実行することで、プログラムの仕様を把握することできるようになるわけです。
リバースエンジニアリングと同様に、その行為自体は決して「悪」ではないのですが、通常のプログラム解析だけではなく、機密情報を盗み取るなどの不正行為のために利用されることも多いという点が、アプリを"作る"側だけでなく、アプリを"使う"側にとっても厄介なところです。
その「難読化」でアプリを保護することはできるのか?
ソフトウェア開発において、セキュリティ対策に取り組むことは優先度の高いタスクになりますが、皆様が考える(またはすでに皆様が行っている)対策の中に「難読化」は含まれているでしょうか。クラッキング(不正な解析や改ざん)を防止するために、難読化を行うことは大変有効です。
そこで当ブログ記事では、難読化を"セキュリティを守るために必要とされる技術のひとつ"であると定義しようと思います。その技術によって、次に挙げているような難読化の機能を提供します。(参考:「難読化とは」)
<難読化の主な機能について>
1)名称の変更:アプリの性能を維持させつつも、プログラム内の「変数名」や「メソッド名」などを意味のない文字列に変換する機能
2)文字列の暗号化:暗号化によってプログラム内の文字列を隠し、検索しても該当の文字列がヒットしないようにする機能
3)制御フローの難読化:既存のロジックに対して悪影響を与えない範囲で、不要なコード(=偽[にせ]の条件文など)を挿入する機能
ソースコードが理解されにくくなるように文字変換さえすれば事足りる?
ところで、難読化について調べていると、"難読化とは変数やメソッドなどの名称を意味のない文字列に変換して解析されないようにすることである"という「名称の変更」の機能説明に終始しているコンテンツを時々見かけます。確かに「名称の変更」は無料版のツールにも搭載されている難読化の基本機能ではあるのですが、これでは説明が足りません。
というのは、その「難読化」を行ったとしても、リバースエンジニアリング(逆コンパイル)を用いた不正行為を完全に防ぐには十分な対応であると言えないからです。
例えば、"セキュリティを無効化して機密性の高い機能の仕組みを盗み取り、不正にプログラムを複製する"ことができるような高いスキルをもつ攻撃者にとって、変数やメソッドなどの名称を意味のない文字列に変換しただけの難読化は大した障壁にもならず、ソースコード上のロジックや処理の内容が見破られてしまう恐れがあります。
このように、「名称の変更」だけを行った難読化では、十分なセキュリティ対策が施されていない場合もあるため、他にも「文字列の暗号化」や「制御フローの難読化」などの機能を含めた、必要十分な難読化の実施を検討しなければなりません。
ではここで、改めて難読化を定義するとしたら、"セキュリティを守るために必要となる技術のひとつであり、「名称の変更」を基本とした複数の機能を上手く組み合わせること"であるとも言えるでしょう。
さまざまな開発環境に対応する難読化ツールについて
難読化ツールのパッケージ製品「PreEmptive Protection」には、上記に挙げたような機能が漏れなく備わっているため、高度な難読化を実現することができます。また、さまざまな開発環境(またはプログラミング言語)に対応しており、1).NET/Xamarin、2)Java/Android、3)JavaScriptのアプリを保護できる3種類のツールを提供しています。
1).NET/Xamarin 難読化ツール「Dotfuscator」
▼ https://www.agtech.co.jp/preemptive/dotfuscator/product/
2)Java/Android 難読化ツール「DashO」
▼ https://www.agtech.co.jp/preemptive/dash_o/product/
3)JavaScript 難読化ツール「JSDefender」
▼ https://www.agtech.co.jp/preemptive/jsdefender/product/
各ツールの特長や主な機能、およびパッケージ製品のライセンス形態などについては、上記URLからリンクされている製品紹介ページをご参照ください。
「はじめてのPreEmptive Protection」では当記事を含む4つの記事を公開!
次回からの「はじめてのPreEmptive Protection」は、3種類のツールが対応する開発環境やプログラミング言語に焦点を当てた、難読化とその専用ツールにまつわる記事へと続いていきます。
- 「JavaScriptと難読化ツール、有料版と無料版の違い」編
→JavaScriptを難読化する必要はあるのか?という問いに答えたうえで、必要な場合に知っておくと便利な難読化ツールの有料版と無料版の違いに迫ります。 - 「.NETやXamarinで難読化を行うことは重要です。」編
→.NET/Xamarinアプリは逆コンパイルによって難なく解析できてしまう現状と、不正な解析への対策で難読化ツールを活用することの効果に迫ります。 - 「Android/Javaアプリを難読化して強力に保護するには」編
→モバイルアプリの難読化でよく使われているツールを紹介し、Android/Javaアプリのセキュリティ強化を図る際に役立つ機能の詳細に迫ります。
– 製品パンフレットをダウンロードして価格表をチェック!
▼ https://www.agtech.co.jp/preemptive/docs-download-form-introduction_second/