DxShield 猫の巻【第2回】ソースコード難読化

みなさんこんにちは、新入社員のyyokotaです。
今週もDxShield猫の巻、いってみましょう!
今回からは、実際の技術について触れてまいります\(^o^)/

 


  • おさらい

前回の記事で、DxShieldに用いられている技術について軽くまとめました。こんな感じ↓

  1. ソースコード暗号化
  2. soファイルアンチデコンパイル
  3. Fake GPS検知APIフック検知
  4. メモリ改ざん検知
  5. APKパッケージ整合性検証
  6. 共有ライブラリ整合性検証
  7. ルート化検知
  8. アンチデバッグ
  9. 仮想マシン検知
  10. 検出ログ収集
  11. グラフィカル分析

今回は順番通りに、1の”ソースコード難読化”について扱いたいと思います(・∀・)

 


  • コンパイルと逆コンパイル

普段私達がプログラムを作成するときは、おおよそCやJavaといった、人間が理解できる言語(高級言語)でコードを記述してから、コンパイラを通して機械語へ翻訳してコンピュータが理解できるもの(オブジェクトコード)にします。
それに対して、その順序とは逆にオブジェクトコードを解析してコードを再現することを逆コンパイルといいます。

この逆コンパイルの精度ですが、.NET Frameworkで開発されたアプリケーション(C#とかVisual Basicとか)や、Javaはかなり高い精度でソースコードが再現できます。

もちろんこの逆コンパイルは、Javaなどで作成されたAndroidアプリにも行うことが可能です!

 


  • 難読化の必要性

ただこの逆コンパイルっていうの、かなりヤバそうな匂いがしますよね/(^o^)\
なぜならば、アプリケーションさえあれば、誰でもソースコードを復元してまったく同じプログラムが作成できてしまうってことだからです!
苦心してコードを書いてアプリケーションを作成した人からするとやってられねえ!って感じですし、
そもそも中に大事な情報とかが書かれてたら、非常にまずいですよね(´・ω・`)

 


  • 難読化とは

そんなことが起こるのを防ぐために、ソースコードの難読化ということが求められます。
困ったときのWikipedia先生…子曰く、

難読化コード(Obfuscated code)とは、コンピュータプログラムにおいて、その内部的な動作の手続き内容・構造・データなどを人間が理解しにくい、あるいはそのようになるよう加工されたソースコードやマシンコードのこと。
https://ja.wikipedia.org/wiki/%E9%9B%A3%E8%AA%AD%E5%8C%96%E3%82%B3%E3%83%BC%E3%83%89

つまり、私達エンジニアが記述したコードが他の人達に解析されないように、ところどころ内容を読みづらくしてぐちゃぐちゃにするってことですねφ(..)メモメモ
とはいえこの説明だけだと実際に難読化をしたときにどんな事が起こるの?
っていうことが分かり辛いので、実際に難読化を行ってみましょう!

 


  • 実際に難読化してみる

さて、実際にソースコードの難読化を行うとどんな感じになるんでしょうか?
下にサンプルをのせました。実際に見ていきましょう!

①難読化を適用する前


これが、難読化を適用されていないソースコードです。
至って普通のソースという感じで、中身を読み解くことが面倒だ!ってことはなさそうですよね。

②難読化を適用した後


難読化を適用した後は、こんな感じになります!
1行目の”AppCompatActivity”が”m”になっていたり、6行目の”mGraphicOverlay”が”p”になっていたり、
パッと見ただけでも色々と変わっているのが見えますよね。

元々ソースを記述するときには変数名や関数名に何らかの意味を持たせる事が多いので、
それを何か別の言葉、とりわけ特に意味を持たないアルファベットや数字の羅列にしたりするだけでも、
ソースコードを解析しようと試みる人たちにとっては非常に面倒になりますよね!

このように、逆コンパイルを行ってソースコードを復元した際に非常に読みにくいものにすることによって、
解析を難しくすることが難読化の目的になります!

ただ、ソースコードを保護するという観点では、この難読化だけでは何の力も持ちません。あくまでコードを読みづらくすることが目的なので、時間と労力をかければ解読はできてしまいますからね。

そこで、DxShieldではこの難読化に加えて”暗号化”を適用することによってさらにソースコードを堅牢化しています。
“暗号化”については次回の記事で紹介する予定です(・∀・)

 


  • まとめ

以上、ソースコードの難読化についてまとめました!
自分の成果物を保護するという観点でも、セキュリティ上の観点でも、非常に大事なものですね@@