こんにちは!KENTEM第2開発部のK.H.です。
世はOSS全盛期。
OSからフレームワーク、ライブラリ等、様々なソースコードが公開されています。
素晴らしい世界です。
でも・・・・・・・やっぱり隠したいものもありますよね?
バックエンドサーバーのURL、シークレットキー、僕の考えた最強ロジック、色々あると思います。
ソースコードを公開しなければいいんじゃないか。いえいえ、そんなことはありません。
世の中にはリバースエンジニアリングという言葉があります。配布しているアプリからソースコードを覗くことができるのです。
どうにかして隠したい!そんな時はソースコードの難読化をお勧めします。
ということで、今回はリバースエンジニアリングと難読化についてお話しします。
リバースエンジニアリングとは
既存の製品に対して「逆コンパイル」等の作業を行うことで、ソースコードを解析することです。
普段アプリケーションをビルドする際にソースコードはコンピュータが理解できる機械語やバイナリコード等にコンパイルされますが、その逆を行うことです。
様々な言語に対して逆コンパイルが可能ですが、特に.NETのような中間言語にコンパイルされるようなものはかなりの精度でソースコードに戻せます。
ではC#で作成した.NETのDLLを実際に逆コンパイルしてみましょう。
例えば以下のようなソースコードがあったとします。
public class Person { private string _firstName; private string _lastName; private DateTime _birthDate; //コンストラクタ public Person(string firstName, string lastName, DateTime birthDate) { _firstName = firstName; _lastName = lastName; _birthDate = birthDate; } //名前 public string FullName => _firstName + " " + _lastName; //年齢 public int GetAge() { var age = DateTime.Today.Year - _birthDate.Year; //誕生日前の月日だったら1歳引く if (_birthDate > DateTime.Today.AddYears(-age)) age--; return age; } }
これをビルドしてdllとして出力します。
もちろんテキストエディタで開いても文字化けするだけですが、逆コンパイルツールで開くと・・・・
コメント等は消えているものの、ソースコードがほぼ丸見えです。
隠したいものも見えてしまいますし、時には悪い人にアプリを改ざんされてしまうかもしれません。
次に解説する難読化を行ってアプリを守りましょう!
※リバースエンジニアリング自体は原則違法ではありませんが、得た情報の活用の仕方次第では違法になる可能性がありますので取り扱いにはご注意ください。
難読化とは
言葉の通りソースコードを読みづらくします。
リバースエンジニアリング自体は止めることができませんが、中身を見ても意味がわからなければ問題ありません。
自分でわけのわからない変数を付けて手動で難読化することもできますが、運用が大変なので、基本的には難読化ツールを利用します。
手始めに軽い難読化設定で前述したソースコードを難読化してDLLに出力します。
プライベート変数名がaやbといったアルファベットになり、ちょっとだけ読みづらくなりましたね。
さらに強力な難読化設定にしてみましょう。
クラス名やメソッド名まで変わり、だいぶ読みづらいコードになりました。ここまで来るとほぼ意味はわからないものになったかと思います。
ただ、Nuget配布用等、他アプリが外部参照するためのライブラリだと、ここまでやってしまうと使いづらくなってしまいますので、調整が必要です。
世の中には言語ごとに様々な難読化ツールがあり、設定も様々です。無料のものもありますので、気になる方は是非試してみてください。
まとめ
OSSが一般的になってきた昨今、ソースコード自体を秘匿したいということはあまり無いかもしれませんが、セキュアな情報がある場合には気を付けないと足元をすくわれるかもしれません。
守るべきものとそうでないものをしっかり区別して、アプリを守っていきましょう。
おわりに
KENTEMでは、様々な拠点でエンジニアを大募集しています! 建設×ITにご興味頂いた方は、是非下記のリンクからご応募ください。 recruit.kentem.jp career.kentem.jp