株式会社Ninjastars 技術研究部

「もっと楽しく安全なゲームの世界を創る」

リバースエンジニアリング対策 -難読化編-

株式会社Ninjastars
取締役:齊藤和輝

今回の記事では株式会社Ninjastarsが提供しているリバースエンジニアリング対策の1つである実行ファイルの難読化についてご紹介したいと思います。
リバースエンジニアリング対策における難読化とは、ソフトウェアの内部的な動作の構造・データなどを人間が理解しにくいように加工することです。
難読化することでGhidraやIDA Proなどの解析ツールでソフトウェアが逆アセンブルされたとしても、攻撃の起点となる脆弱性を発見しにくくなります。

難読化方式について

一般的に難読化方式は3種類に分類できます。
1.ライブラリ方式されている
2.パッカー方式
3.コンパイラ方式

これらはそれぞれ利点と欠点があり、ソフトウェアに応じて使い分ける必要があります。

1.ライブラリ方式

難読化を施す関数を定義したライブラリを作成し、関数を呼び出すことでソフトウェアで使用されている変数等のデータを難読化をすることができます。
この方式の利点は、一度ライブラリを作ってしまえばコーディング時に呼び出すだけでよいので汎用性が高くパフォーマンスに優れています。
欠点としては、常にライブラリが必要となるので場所を特定されてしまえば簡単に難読化を解かれてしまいます。
しかしながら、大抵の人間は難読化をされているという事実によってリバースエンジニアリングが面倒だと思いこんでしまうので敷居を高くすることができます。

f:id:Ninjastars:20190413155054p:plain
ライブラリ方式の概略図

2.パッカー方式

プログラムを実行可能な状態のままパッキング(圧縮、符号化)することでリバースエンジニアリングの難易度を高めます。パッカー方式はパッキングとアンパッキングルーチンがセットになっており、アンパッキングルーチンで命令の一つ一つをメモリ上で自己解凍しながらプログラムを実行していきます。
この方式の利点は導入のしやすさにあります。すでにコンパイルされているプログラムを包み込むようなイメージでパッキングするのですぐにでも難読化を施すことができます。また、強度も高く並大抵のリバースエンジニアリング技術では突破することが難しいです。
欠点としては、パッカー方式はマルウェアに使われていることが多いので安全なプログラムであってもマルウェアとして認識されることがあります。また、自己解凍しているのでプログラムの実行速度にも影響があります。
このような理由から特にiOS向けのアプリケーションではAppleの審査が通らずリリースすることができません。

f:id:Ninjastars:20190413164035p:plain
パッカー方式の概略図

3コンパイラ方式

ソースコードは通常コンパイラを通して実行ファイル(PEやELF等)へと変換されます。
その手順の中で難読化を施してしまうということです。
この方式の利点は、強度の高さです。3つのうちで最も強度が高く、コンパイラさえできてしまえばすぐに導入できるのも魅力の一つです。
欠点としては、プログラミング言語の種類や目的ごとに最適なコンパイラを作成しなければならず、さらに今までのコンパイラとの融合性も備わっていなければいけないことが挙げられます。

f:id:Ninjastars:20190413164744p:plain
コンパイラ方式の概略図

まとめ

これら3種類の難読化方式はリバースエンジニアリングの難易度をあげる手法です。
これらの対策をしたからと言ってリバースエンジニアリングされないわけではありません。
それぞれの手法に対して破る方法は存在します。次回の記事ではパッカー方式について詳しく述べていきたいと思います。

注意事項

本レポートに記載されている内容を許可されていないソフトウェアで行うと、場合によっては犯罪行為となる可能性があります。そのため、記事の内容を試す際には許可されたソフトウェアに対してのみ実施するようにしてください。

本レポートについて
お問い合せ
E-mail:saito@ninjastars-net.com

株式会社Ninjastars
取締役:齊藤和輝