開発者コラム
Colum

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

2020.10.01

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つでもかかっていれば技術が足りない・あるいは労力に見合わないと、
突破を諦めさせることができるかもしれません。

 

難読化とは、鍵=セキュリティ対策の一つであり、
それらを一つ一つ積み重ねることでセキュリティ対策が強化されるのだと思います。

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

 

————————————————-

まずはお問い合わせください
CONTACT
営業担当者がヒアリングを行い、最適な形をご提案いたします。
またCrackProofの使用感を確認できるトライアルも用意しております。
CONTACT
CrackProof 導入事例