論文紹介："Obfuscator-LLVM" 大衆のためのソフトウェア保護


#始めに
原題は「[Obfuscator-LLVM — Software Protection for the Masses](http://crypto.junod.info/spro15.pdf)」[1] で、[ICSE2015](http://2015.icse-conferences.org)[2]の[ワークショップ](http://2015.icse-conferences.org/call-dates/workshops)[3]で今年からはじまった[SPRO](https://aspire-fp7.eu/spro/)[4]で発表された論文です。OHPは[こちら](https://aspire-fp7.eu/spro/wp-content/uploads/spro15_talk.pdf)[5]です

内容は **LLVM の中間コード**を難読化する拡張を **オープンソース**として作りましたという報告の **作りました論文**です。実装なしで **手法の提案**だけをされるよりも **使える実装のある論文**のほうが **読んでてワクワク**するので私は好きです
商用開発で必用な技術なのにこれまでオープンソースの適切な実装がなく、それを提供したことが Contributionと主張されてますが全くその通りだと思います。 **私もこんなの欲しかった**
コードは[こちら](https://github.com/obfuscator-llvm/obfuscator)のgithubで公開されています
**インストールして使ってみた**記事を[こちら](http://qiita.com/UedaTakeyuki/items/8429261ae7203d393df2)に用意いたしました

#前提知識
## Obfuscation って何? なんて発音するの?
「オブフスケーション」とか「オブファスケーション」とか読みます。コードや変数を複雑にしてソフトウェアの理解を阻止する技術です。whitebox encription と呼ばれることもあります。「難読化」と訳されることが多いようです

## なぜソフトウェアの理解を阻止する必用があるの?
ソフトウェアをハッキングして悪用するためには内容の理解が必須です。その理解を阻止して悪用を防ぎます。

## どんなところでつかわれてるの?
- 武器の制御：不発ミサイルを解析されてハックされるのを防ぐのに使われているのだそうです
- 有料動画の再生：暗号化された有料動画を複号するプログラムを解析したり、悪い処理を埋め込んだりして暗号鍵を盗まれることを防いでいます
- 有料ソフトウェアの保護：ゲームコンテンツとかパクってキャラクターだけ別のに差し替えて似たようなのを作って少し値段を安くして Google Play とかに出されるのを防いでいます

## 具体的にどんなことするの?
例えば以下のような単純な代入を

a = b

以下のような２行に変更します(instruction substitutions )

a = b + c
a -= c

よくみると単に a=b なのですが、c ってなんだろ？とちょっとわかりにくいです。こういうのを沢山入れるとオブジェクトサイズは大きくなってしまう（賢いコンパイラだと最適化して無駄かもしれませんが）のですがなにをやってるのかわからなくなります。
他に、普通のコードを switch case に分割して順番を入れ替えるとか、無駄な関数呼び出しを入れるとか、変数を分割する（暗号鍵を守るのに有効）とかいろいろやります

## 暗号化ではだめなの?
暗号化したコードは実行時には必ず複合化しなければならず、その時にパクられたらおしまいです。obfuscation は何時みてもわけのわからない、読んで理解しようとする心を折ってしまう凶悪なコードです
無意識でそういうコードかいてしまう人は幸いかもしれません

また、mobile や組み込みの環境では暗号鍵を安全に保管する機構が（プラットフォームの提供者は別の事を言ってるかもしれませんが)ない事がよくあります。ARM の trustZone のようなハードウェアサポートが有効なのであればともかく、All SoftWare なシステムでどこかに鍵をおいておかざるを得ない環境では、最低限、鍵そのものと鍵の処理ルーチンを obfuscation で守る必用があります

尚、obfuscation に合わせて anti debugging (デバッガが動いていることを検知すると、嘘ルーチンに飛んで永遠に無意味なコードをデバッグさせる）を併用することもよくおこなわれます

## 単なるアカデミックな研究なの？商用でも使われているの?
Java の class を obfuscate するプロダクト ProGuarde が Android アプリの開発環境の一部として提供されていることもあり、よく使われています

論文と同様に LLVM の IR を obfuscate する有名な(famous な意味でも notorious な意味でも)商用実装があります。日本でも多くの関係者がこれのおかげで多くの恩恵といくばくかの被害を受けているのではないかという個人的な感想をもっております

尚、コンテンツプロテクションやリンクプロテクションのいくつかの規格は、そのソフトウェア実装において obfuscation を利用することを推奨しています

## 教科書とかあるの？
紹介論文でも引用されていましたが、こちらが表紙がちょっといけてませんが網羅的でいい本です
<a rel="nofollow" href="http://www.amazon.co.jp/gp/product/0321549252/ref=as_li_tf_il?ie=UTF8&camp=247&creative=1211&creativeASIN=0321549252&linkCode=as2&tag=grenouille0d-22"><img border="0" src="http://ws-fe.amazon-adsystem.com/widgets/q?_encoding=UTF8&ASIN=0321549252&Format=_SL110_&ID=AsinImage&MarketPlace=JP&ServiceVersion=20070822&WS=1&tag=grenouille0d-22" ></a><img src="http://ir-jp.amazon-adsystem.com/e/ir?t=grenouille0d-22&l=as2&o=9&a=0321549252" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" />
著者の１人の **Christian Collberg**先生は、よくみたら紹介論文が採録された[国際会議のプログラム委員](https://aspire-fp7.eu/spro/panel-programme-commitee/)されてますね。今、突然気がついてしまった（手遅れ）のですが、プログラム委員が誰かチェックして著述を refer したほうが採録されやすかったのかしら orz... 関係ないですが、Gemaltoとその関係会社関係者が何人も入ってますね...

# 論文の内容

１章の Introduction で obfuscation の概要をたっぷりと述べ、学会及び産業界での重要性を述べます。つづけて、ソースコードやバイナリコードを obfuscate するのではなく、LLVM コンパイラの中間コードを難読化する実装にした結果、LLVM のサポートする種々の言語、種々のプラットフォームで利用できる obfuscator となった利点を述べています

続く２章 Code Transformations で、まず LLVM についての簡単な説明を行い、Obfuscator-LLVM が実装している個々の手法の詳しい解説が続きます

３章 Practical Results で定量的な評価を行い、４章 Future Work、５章 Conclusion があっさりと続きます

全体で7ページ、実装した手法についての説明も詳しく、読みやすい論文です。お正月休みの読書にちょうどいいかも

#おまけ
成果は[こちら](https://github.com/obfuscator-llvm/obfuscator)のgithubで公開されています
**実際に Mac にインストールして使ってみた**記事を[こちら](http://qiita.com/UedaTakeyuki/items/8429261ae7203d393df2)に用意いたしました

尚、このオープンソースは [strong.codes](https://strong.codes)というベンチャーをおこすのに忙しいのであまりメンテしてないなどと宣われております ^^:
まあ **strong.code** 社も **「大衆のためのソフトウエア保護」**を歌っているので、有名な商用実装よりも大衆的なのかもしれません

#references
1. [Obfuscator-LLVM — Software Protection for the Masses](http://crypto.junod.info/spro15.pdf)
本稿で御紹介させていただきました論文です


2. [ICSE2015](http://2015.icse-conferences.org) **ソフトウェア工学**の **まあ御立派**な国際会議です。ここに採録されるような御立派な論文が書けるようになるために全論文を **一日で全部勉強してしまおう！**というとても楽しい[ICSE 2015 勉強会](https://sites.google.com/site/sereadings/icse2015)もここ数年毎年開催されています

3. [ICSE2015のワークショップ](http://2015.icse-conferences.org/call-dates/workshops) ソフトウェア工学の研究対象っていっぱいあるんですね。**丸とか四角とか描いて線で結んでるだけがソフトウェア工学なわけじゃない**んですね

4. [SPRO](https://aspire-fp7.eu/spro/) 1st International Workshop on Software PROtection

5. [Obfuscator-LLVM — Software Protection for the Masses](https://aspire-fp7.eu/spro/wp-content/uploads/spro15_talk.pdf) ４人のリサーチャーと数名の学部生、院生で３年間でつくってこられたそうです。ちなみに **「Debugging an obfuscator is ... hard!」**との事ですが、まあそうでしょうねぇ...