アプリに施せる耐タンパ―Tips -難読化はなぜ必要か?-

1.はじめに

『アプリのセキュリティ対策(耐タンパ)には難読化が有効』とはよく言われますが、
こんなことを思ったことはないでしょうか。

「難読化って実際どうなの?」
「防御効果が確認できない。」
「開発に時間かけたくないなあ……。」

実際にプログラムを作成する段階で難読化の効果を感じることはあまりないでしょう。
そこで今回は”難読化を施していない”プログラムの解析を通して
「難読化にはこんな効果がある」と改めて理解していただければと思います。

※実際の作業画面を見ながら解説します。
逆アセンブル等、実践的ではありますが、開発者の方でなくても読める基本的な内容です。
アプリのセキュリティ対策を見直すきっかけになれば幸いです。


難読化については、マーケティング担当者コラムにも記事がございます。
難読化をアプリのセキュリティ対策ツールとして検討中の方や
既に対策として実施されている方向けのコラムとなっています。
ご興味のある方は、ぜひご覧ください。

難読化だけで大丈夫?!アプリに施すセキュリティ対策の落とし穴

2.実験用プログラムについて

ではまず今回使用するプログラムについて説明します。
より身近に考えてもらうために、“パスワード確認をする”簡単なプログラムを用意しました。
(私はLinux担当ですので、Linuxでプログラムを作成しました。)

内容としては、以下画面のように、入力パスワードが
▪正しい⇒ “PassWord OK“、
▪間違っている⇒ ”PassWord NG“と出力するものです。

<プログラムの実行画面>

また、このプログラムの中では”CheckPassWord”という関数を実行します。
これは、アプリ等でも利用される、“パスワードが正しいか該当の文字列と照合する”ものです。
今回は入力パスワードが“Hyper”かどうかを確認(照合)するように設定します。

<関数の詳細内容>

3.プログラムの解析

それでは早速、以下の方法で難読化をしていないプログラムの解析に移ります。

①readelf -sでパスワード確認関数を探す
②objdump -dで関数部分の逆アセンブル情報を読む

↓↓↓では、始めます!

①はじめに、readelf -sでパスワード確認関数を探す
まずはreadelfコマンドでELFファイル(Linux環境で作成したプログラム)の情報を表示させます。
今回は “プログラム内で使用される関数の情報を表示させる”『-s』オプションを使用します。
(※オプションにより様々な情報を表示できます。)

そして関数名を確認していくと……「CheckPassWord」という名の関数を発見しました。

※強調部分は筆者編集

「パスワードに関係する関数かな?」と推測を立てます。

ここで値の左に目を移すと、”0000000000001401″と書かれています。
この数値は「プログラムのどこにこの関数が記述されているか(プログラム内のアドレス)」を
示しているので、この特定したアドレスの箇所を更に詳しく見ていきます。

②次に、objdump -dで関数部分の逆アセンブル情報を読む
まずは、objdumpコマンドでファイルの様々な情報を表示し、
プログラムにobjdump -dコマンドを使用します。
※-dコマンドは、“ファイルの逆アセンブル情報=機械語での動作を見る”ことができます。
⇒更に追加オプション”–start-address”を使用してアドレス1401の部分を表示するよう指定します。

それではプログラムにobjdump -dコマンドを使ってみると……

※強調部分は筆者編集

「CheckPassWord」関数の逆アセンブル情報が表示されました。
ここで注目すべきはマーカーした“cmp $0x48,%al”のような部分です。

ではここでもう一度冒頭で説明した「パスワードを照合する関数」が
どのようなものだったか確認してみましょう。

関数内では入力された文字列が
0x48,0x79,0x70,0x65,0x72かどうかを確認するという動作を設定していました。

逆アセンブル情報を見てみると、
cmp $0x48,%al・cmp $0x79,%al・cmp $0x70,%al・cmp $0x65,%al・cmp $0x72,%al
という命令(文字列を比較する命令)が記載されています。

つまり、この逆アセンブル情報の“cmp”以降の記載箇所には
CheckPassWord関数が“照合すべき文字列”=“パスワード”
書かれていることがわかります。

4.難読化の効果

さて、ここから話の肝である「難読化の効果」を考えます。

今回“CheckPassWordという関数名”により、
この関数で「パスワードが正しいか確認している」と推測できました。
それでは“CheckPassWord”という関数名を“dummy00”などに変えましょう。

そうすれば、何らかの関数でパスワードを確認していることまでは推測できても、
それがどの関数なのかは特定できないという状態になります。

今回のような短いプログラムであれば
数分〜数十分でパスワード確認関数を探せますが、
数百ほどの関数がある複雑なプログラムであれば、
その数十倍~数百倍の時間は必要だと予測できます。

つまり、「簡単な工夫一つで重要な技術データ・個人情報の流出等を防ぐ」ことができます。

5.まとめ

私は、難読化を家に付ける”鍵”だと考えています。
何も対策していない=”家に鍵がかかっていない状態”では、
誰でも簡単に侵入されてしまいます。
しかし、「関数名の難読化」を行った状態=”家に鍵をかけた状態”は、
ある程度侵入を妨害することが可能です。

つまり、複雑な鍵が1つでもかかっていれば
技術が足りない・あるいは労力に見合わないと、
突破を諦めさせることができるかもしれません。
難読化とは、鍵=セキュリティ対策の一つであり、
それらを一つ一つ積み重ねることでセキュリティ対策が強化されるのだと思います。

セキュリティ対策には難読化ツール一つ取っても沢山の方法や技術があり
難しく感じることもあると思いますが、
このように簡単な工夫を施すだけでも効果的な対策となるので、是非皆さん試してみてください。


当サイトでは、アプリのセキュリティについて詳しくわかる資料をご用意しています。
アプリのセキュリティや対策についてご興味を持たれた方は、
ぜひダウンロードしていただけますと幸いです。

ダウンロード資料一覧

また、弊社では
アプリへの不正な解析・改ざん行為(クラッキング)を防ぐ対策製品
「CrackProof」の開発・販売を行っております。
詳しく話を聞いてみたいと思われた方は、
当サイトからお気軽にお問い合わせください。

お問い合わせはこちら