以下、図面を参照し、本発明の実施形態を説明する。以下では、一例として、Android(登録商標)がOS(Operating Systems)に用いられている端末で動作するアプリケーションの解析について主に説明する。本明細書および図面では、便宜上、必要に応じてAndroid(登録商標)という文字列を*andrd*という文字列で代用し、java(登録商標)という文字列を*jv*という文字列で代用し、Linux(登録商標)という文字列を*Lnx*という文字列で代用している。すなわち、*andrd*という文字列はAndroid(登録商標)という文字列と等価であり、*jv*という文字列はjava(登録商標)という文字列と等価であり、*Lnx*という文字列はLinux(登録商標)という文字列と等価である。
(第1の実施形態)
まず、本発明の第1の実施形態を説明する。図1は、本実施形態によるアプリケーション解析装置の構成を示している。本実施形態によるアプリケーション解析装置は、静的解析部10、動的解析部20、サーバ解析部30、アプリケーション解析部40を有する。
静的解析部10は、アプリケーションのプログラム(実行プログラム)を逆アセンブルして得られるプログラムコードを解析し、サーバが保持するWebページのスクリプトの実行時に実行されるメソッドを特定する。動的解析部20は、アプリケーションがサーバに送信するリクエストを取得する。サーバ解析部30は、動的解析部20によって取得されたリクエストに基づいてリクエストを生成し、生成されたリクエストをサーバに送信する。アプリケーション解析部40は、サーバから送信されたレスポンスに含まれるスクリプトを解析し、静的解析部10によって特定されたメソッドのうちレスポンスに含まれるスクリプトの実行時に実行されるメソッドが利用するAPIを特定する。
図2は、静的解析部10の構成を示している。静的解析部10は、逆アセンブル部100、APIリスト記憶部101、メソッド解析部102、メソッド解析結果記憶部103を有する。
逆アセンブル部100は、アプリケーションのプログラムを含むアプリケーションファイルを逆アセンブルし、プログラムコードとしてソースコードに相当する逆アセンブルコードを得る。本実施形態で想定しているOSに対応したアプリケーションは、ソースコードをコンパイルした実行プログラムであるclass.dexファイルと、証明書情報、画像等のリソース情報を圧縮したファイルとで構成されている。逆アセンブル部100は、既存のツールを利用してアプリケーションファイルを逆アセンブルしてもよい。
APIリスト記憶部101は、端末で管理される情報や機能を利用するための命令や関数の集合であるAPI(Application Program Interface)を含むAPIリストを記憶する。図3は、APIリスト記憶部101に記憶されているAPIリストの一例を示している。図3には、本実施形態で想定しているOSのプラットフォームにおける複数のAPIの例が示されている。図3では、getCellLocation、getLastKnowLocation、requestLocationUpdates、getDeviceId、getNetworkOperator、getLine1Number、getAccounts、sendTextMessageが示されている。
getCellLocation、getLastKnowLocation、requestLocationUpdatesは、端末の位置情報を取得するAPIである。getDeviceIdは、端末固有識別子であるIMEI(International Mobile Equipment Identity)を取得するAPIである。getNetworkOperatorは、MCC(Mobile Country Code)、MNC(Mobile Network Code)を取得するAPIである。getLine1Numberは、端末の電話番号を取得するAPIである。getAccountsは、端末のアカウント情報を取得するAPIである。sendTextMessageは、SMS(Short Message Service)を送信するAPIである。
メソッド解析部102は、逆アセンブル部100が得た逆アセンブルコードを解析し、アプリケーションがスクリプトを実行するときにスクリプトから呼び出されて実行されるメソッドを特定する。また、メソッド解析部102は、特定したメソッドの情報と、APIリスト記憶部101に記憶されているAPIリストに含まれる複数のAPIとを比較し、特定したメソッドが利用するAPIを特定する。メソッド解析結果記憶部103は、メソッド解析部102によって特定されたメソッドの情報と、そのメソッドが利用するAPIの情報とを記憶する。
図4は、動的解析部20の構成を示している。動的解析部20は、アプリケーション実行部200、リクエスト取得部201、リクエスト記憶部202を有する。
アプリケーション実行部200は、解析対象のアプリケーションを実行することによって、アプリケーションを起動する。ユーザが解析対象のアプリケーションを指定して実行を指示する等の方法によってアプリケーションの実行が可能な場合、アプリケーション実行部200が設けられていなくてもよい。
リクエスト取得部201は、アプリケーション実行部200によって実行されて起動したアプリケーションが行う通信を監視し、サーバへ送信されるリクエストを取得する。通信の監視は、アプリケーションがインストールされている端末上で行ってもよいし、それ以外の監視ポイントで行ってもよい。例えば、端末が接続するアクセスポイントまたはプロキシサーバ等の通信装置を別途用意し、通信装置上で監視を行ってもよい。通信装置は、端末からのリクエストをキャプチャし、そのリクエストをアプリケーション解析装置に送信する。リクエスト取得部201は、このリクエストを受信することによって、リクエストを取得してもよい。リクエスト記憶部202は、リクエスト取得部201によって取得されたリクエストを記憶する。
図5は、サーバ解析部30の構成を示している。サーバ解析部30は、リクエスト生成部300、リクエスト送信部301、レスポンス受信部302、レスポンス記憶部303を有する。
リクエスト生成部300は、リクエスト記憶部202に記憶されているリクエストに基づいて新たなリクエストを生成する。リクエスト送信部301は、リクエスト生成部300によって生成されたリクエストをサーバに送信する。レスポンス受信部302は、リクエスト送信部301によって送信されたリクエストを受信したサーバから送信されるレスポンスを受信する。レスポンスには、Webページのスクリプトが含まれる場合がある。レスポンス記憶部303は、レスポンス受信部302によって受信されたレスポンスを受信する。
図6は、アプリケーション解析部40の構成を示している。アプリケーション解析部40は、アプリケーション挙動解析部400を有する。
アプリケーション挙動解析部400は、レスポンス記憶部303に記憶されているレスポンスに含まれるスクリプトを解析する。アプリケーション挙動解析部400は、レスポンスに含まれるスクリプトと、メソッド解析結果記憶部103に記憶されているメソッドの情報とを比較し、レスポンスに含まれるスクリプトの実行時に実行されるメソッドを特定する。さらに、アプリケーション挙動解析部400は、メソッド解析結果記憶部103に記憶されているAPIの情報に基づいて、レスポンスに含まれるスクリプトの実行時に実行されるメソッドが利用するAPIを特定する。
本実施形態によるアプリケーション解析装置は、複数の記憶部(APIリスト記憶部101、メソッド解析結果記憶部103、リクエスト記憶部202、レスポンス記憶部303)を有している。アプリケーション解析装置が有する複数の記憶部がそれぞれ異なる記憶装置で構成されていてもよいし、アプリケーション解析装置が有する複数の記憶部の一部または全部が同一の記憶装置で構成されていてもよい。
静的解析部10、動的解析部20、サーバ解析部30、アプリケーション解析部40の機能は、例えばCPU(Central Processing Unit)等の制御装置の動作を制御するためのプログラムを、アプリケーション解析装置のコンピュータが読み込んで実行することにより、ソフトウェアの機能として実現可能である。また、このプログラムは、例えばフラッシュメモリのような「コンピュータ読み取り可能な記録媒体」により提供されてもよい。また、上述したプログラムは、このプログラムを記憶装置等に格納したコンピュータから、伝送媒体を介して、あるいは伝送媒体中の伝送波によりアプリケーション解析装置に伝送されることでアプリケーション解析装置に入力されてもよい。ここで、プログラムを伝送する「伝送媒体」は、インターネット等のネットワーク(通信網)や電話回線等の通信回線(通信線)のように、情報を伝送する機能を有する媒体である。また、上述したプログラムは、前述した機能の一部を実現してもよい。さらに、上述したプログラムは、前述した機能をコンピュータに既に記録されているプログラムとの組合せで実現できる、いわゆる差分ファイル(差分プログラム)であってもよい。
次に、本実施形態によるアプリケーション解析装置の動作を説明する。図7は、本実施形態によるアプリケーション解析装置の動作の手順を示している。
(静的解析部10による処理)
静的解析部10は、アプリケーションのプログラムを逆アセンブルして得られるプログラムコードを解析し、サーバが保持するWebページのスクリプトの実行時に実行されるメソッドを特定する(ステップS10)。例えば、ステップS10では、以下の処理が行われる。
逆アセンブル部100は、アプリケーションのプログラムを含むアプリケーションファイルを逆アセンブルし、逆アセンブルコードを得る。メソッド解析部102は、逆アセンブル部100が得た逆アセンブルコードを解析し、アプリケーションがスクリプトを実行するときにスクリプトから呼び出されて実行されるメソッドを特定する。また、メソッド解析部102は、特定したメソッドの情報と、APIリスト記憶部101に記憶されているAPIリストに含まれる複数のAPIとを比較し、特定したメソッドが利用するAPIを特定する。具体的には以下の処理が行われる。
本実施形態で想定しているOSにおいて、スクリプトが実行されたときにスクリプトから呼び出される*jv*オブジェクトを登録するAPIは、WebViewクラスのadd*jv*scriptInterfaceというAPIである。図8は、*jv*オブジェクトを登録するプログラム(ソースコード)の例を示している。アプリケーションのソースコードの一部が抜粋されて図8に示されている。
図8において、最も左に記載された数字は行番号である。2行目に、add*jv*scriptInterfaceに関するコードがある。add*jv*scriptInterfaceは、第一引数と第二引数との2つの引数を必要とする。第一引数は、登録される*jv*オブジェクトの名前であり、第二引数は、スクリプトから呼び出されるメソッドの名前である。図8に示す例では、第一引数は「JsObject()」であり、第二引数は「FromWebScript」である。3行目〜7行目には、登録された*jv*オブジェクトに関するコードがある。このコードには、JsObject()クラスのメソッドであるmethod1()メソッドを定義するコードが含まれる。method1()メソッドは、アプリケーションがスクリプトを実行するときにスクリプトから呼び出されて実行される。6行目には、スクリプトから実行される処理のコードがある(図8ではコードが省略されている)。スクリプトから呼び出されて実行されるメソッドがAPIを利用する場合、6行目にAPIの情報が含まれる。
図9は、スクリプトに含まれるプログラムの例を示している。図9において、最も左に記載された数字は行番号である。2行目には、図8に示すプログラムで定義されているJsObject()クラスのmethod1()メソッドを呼び出すコードがある。
メソッド解析部102は、スクリプトから呼び出されるアプリケーション内のメソッドを特定するため、逆アセンブルコードから、add*jv*scriptInterfaceの第一引数と第二引数とを取得する。続いて、メソッド解析部102は、逆アセンブルコードにおいて、第一引数が示す*jv*オブジェクトに関するコードからメソッドの処理内容の情報を取得する(図8の6行目の情報)。これによって、メソッド解析部102は、アプリケーションがスクリプトを実行するときにスクリプトから呼び出されて実行されるメソッドを特定する。
続いて、メソッド解析部102は、取得したメソッドの処理内容の情報と、APIリスト記憶部101に記憶されているAPIリストに含まれる複数のAPIとを比較する。これによって、メソッド解析部102は、アプリケーションがスクリプトを実行するときにスクリプトから呼び出されて実行されるメソッドが利用するAPIを特定する。メソッドの処理内容の情報の中に、APIリストに含まれるAPIと一致するAPIの情報があった場合、メソッド解析部102は、そのAPIがメソッドによって利用されると判定する。メソッド解析部102は、add*jv*scriptInterfaceの第二引数の情報(スクリプトから呼び出されるメソッドの名前、図8では「FromWebScript」)と、登録された*jv*オブジェクトのメソッドの名前(図8では「method1()」)と、メソッドが利用するAPIの名前とを関連付けてメソッド解析結果記憶部103に記憶させる。
(動的解析部20による処理)
動的解析部20は、アプリケーションがサーバに送信するリクエストを取得する(ステップS20)。例えば、ステップS20では、以下の処理が行われる。
アプリケーション実行部200は、解析対象のアプリケーションを実行する。アプリケーション実行部200によって実行されたアプリケーションは起動し、アプリケーションの処理として規定された各種の処理を実行する。何らかの操作の入力が必要な場合、例えばユーザが操作を行う。あるいは、既存のツールを利用して操作の入力を行ってもよい。リクエスト取得部201は、アプリケーション実行部200によって実行されたアプリケーションが行う通信を監視し、サーバへ送信されるリクエストを取得する。リクエスト取得部201は、取得したリクエストから、リクエストラインと、ヘッダと、メッセージ・ボディとを抽出し、抽出した情報をリクエスト記憶部202に記憶させる。
図10は、アプリケーションが、広告等を取得するためにHTTP GETメソッドを実行した際に送信されるリクエストの例を示している。図10において、最も左に記載された数字は行番号である。1行目はリクエストラインである。2行目〜5行目はヘッダである。図10に示す例ではメッセージ・ボディはない。
図11は、アプリケーションが、広告等を取得するために上記とは別のHTTP GETメソッドを実行した際に送信されるリクエストの例を示している。図11において、最も左に記載された数字は行番号である。1行目はリクエストラインである。2行目〜11行目はヘッダである。図11に示す例ではメッセージ・ボディはない。
(サーバ解析部30による処理)
サーバ解析部30は、ステップS20で取得されたリクエストに基づいてリクエストを生成し、生成されたリクエストをサーバに送信する(ステップS30)。例えば、ステップS30では、以下の処理が行われる。
リクエスト生成部300は、リクエスト記憶部202に記憶されているリクエストと同一のリクエストを生成する。リクエスト送信部301は、リクエスト生成部300によって生成されたリクエストをサーバに送信する。レスポンス受信部302は、リクエスト送信部301によって送信されたリクエストを受信したサーバから送信されるレスポンスを受信し、受信したレスポンスをレスポンス記憶部303に記憶させる。
図12は、図10に示すリクエストに対応するレスポンスの例を示している。図12において、最も左に記載された数字は行番号である。1行目はステータスコードである。2行目〜14行目はヘッダである。15行目はヘッダとメッセージ・ボディとの区切りを示している。16行目はメッセージ・ボディである。図12に示すレスポンスは、スクリプトを含まないレスポンスの例である。レスポンスにスクリプトが含まれる場合、メッセージ・ボディにスクリプトが含まれる。
図13および図14は、図11に示すリクエストに対応するレスポンスの例を示している。図13および図14は、スクリプトが含まれるレスポンスの例を示している。図13および図14において、最も左に記載された数字は行番号である。図13にはレスポンスの1行目〜12行目、16行目、29行目、32行目が示され、その他の行は省略されている。省略されている行は「・・・」で示されている。1行目はステータスコードである。2行目〜9行目はヘッダである。10行目はヘッダとメッセージ・ボディとの区切りを示している。11行目以降はメッセージ・ボディである。レスポンスにスクリプトが含まれる場合、メッセージ・ボディにスクリプトが含まれる。11行目は空白行である。29行目と32行目では一部が示され、残りは省略されている。省略されている部分は「・・・」で示されている。
図14は、レスポンスにおいて、図13に示す部分に続く部分を示している。図14では36行目、39行目、40行目、45行目のみが示され、それ以外の行は省略されている。省略されている行は「・・・」で示されている。36行目、39行目、40行目では一部が示され、残りは省略されている。省略されている部分は「・・・」で示されている。
リクエスト送信部301は、リクエストを1回以上送信する。リクエスト送信部301は、リクエストを複数回送信してもよい。その場合、リクエスト送信部301は定期的に(所定の時間間隔で)リクエストを送信してもよい。
サーバ解析部30が処理を行っている間、ステップS20で実行されたアプリケーションを終了してもよい。例えば、リクエスト取得部201がリクエストを取得した後、アプリケーション実行部200は、実行中の解析対象のアプリケーションを終了する。より具体的には、リクエスト取得部201がリクエストを取得した後であって、リクエスト送信部301がリクエストを送信する前にアプリケーションを終了することが望ましい。
例えば、複数のアプリケーションの挙動を解析する場合、複数のアプリケーションが起動したままであると、アプリケーションの挙動の解析に割り当て可能なリソースが減少する。したがって、リクエストが取得された後にアプリケーションを終了することによって、アプリケーションの挙動の解析に必要なリソースを確保することができる。
上記の処理では、アプリケーションの状態によらずリクエストが送信されるので、アプリケーションの挙動の解析を効率的に行うことができる。
(アプリケーション解析部40による処理)
アプリケーション解析部40は、サーバから送信されたレスポンスに含まれるスクリプトを解析し、静的解析部10によって特定されたメソッドのうちレスポンスに含まれるスクリプトの実行時に実行されるメソッドが利用するAPIを特定する(ステップS40)。例えば、ステップS40では、以下の処理が行われる。
アプリケーション挙動解析部400は、レスポンス記憶部303に記憶されているレスポンスに含まれる情報と、メソッド解析結果記憶部103に記憶されているメソッドの情報とを比較する。具体的には、アプリケーション挙動解析部400は、メソッド解析結果記憶部103から、add*jv*scriptInterfaceの第二引数の情報と、登録された*jv*オブジェクトのメソッドの名前とを読み出す。アプリケーション挙動解析部400は、読み出した第二引数が示す文字列と、登録された*jv*オブジェクトのメソッドの名前が示す文字列とをドットで繋いだ文字列を生成する。
例えば、第二引数が「FromWebScript」であり、登録された*jv*オブジェクトのメソッドの名前が「method1()」である場合、アプリケーション挙動解析部400は、「FromWebScript.method1()」という文字列を生成する。スクリプトにこの文字列が含まれていると、スクリプトからmethod1()メソッドが呼び出される。
アプリケーション挙動解析部400は、レスポンス記憶部303からレスポンスを読み出し、そのレスポンスのメッセージ・ボディを検索範囲として、上記の文字列を検索する。この検索によって、アプリケーション挙動解析部400は、スクリプトに含まれるメソッドが、静的解析で特定されたメソッドと一致するか否かを確認する。検索に使用した文字列と、検索範囲に含まれる文字列とが一致した場合、静的解析部10によって特定されたメソッドのうちレスポンスに含まれるスクリプトの実行時に実行されるメソッドが特定されたことを意味する。
文字列が一致した場合、アプリケーション挙動解析部400は、上記の第二引数および登録された*jv*オブジェクトのメソッドの名前と関連付けられているAPIの名前をメソッド解析結果記憶部103から読み出す。このAPIの名前は、レスポンスに含まれるスクリプトから呼び出されるメソッドが利用するAPIの名前である。つまり、レスポンスに含まれるスクリプトの実行時に実行されるメソッドが利用するAPIが特定されたことを意味する。
図13、図14に示すレスポンスの例を用いて、アプリケーション挙動解析部400の動作を説明する。この例では、add*jv*scriptInterfaceの第二引数が「medibaappsdk」であり、登録された*jv*オブジェクトのメソッドの名前が「adFirstResult()」、「adClicked(settings.targetWindow,enurl)」、「getAdViewScale」、「dspUidSync(name,uid,publishUrl,registUrl)」、「adRefreshResult(1)」、「adRefreshResult(2)」である。アプリケーション挙動解析部400は、「medibaappsdk」と上記の各メソッドの名前とをドットで繋いだ文字列を検索する。
図13に示すレスポンスでは、16行目に「medibaappsdk.adFirstResult()」という文字列(下線部)が登場する。したがって、アプリケーション挙動解析部400は、この文字列を検出することによって、レスポンスに含まれるスクリプトの実行時に実行されるメソッドを特定する。アプリケーション挙動解析部400は、メソッド解析結果記憶部103に記憶されている情報を参照し、add*jv*scriptInterfaceの第二引数である「medibaappsdk」および登録された*jv*オブジェクトのメソッドの名前である「adFirstResult()」と関連付けられているAPIの名前を取得する。
また、図13に示すレスポンスでは、29行目に「medibaappsdk.adClicked(settings.targetWindow,enurl)」という文字列(下線部)が登場する。したがって、アプリケーション挙動解析部400は、この文字列を検出することによって、レスポンスに含まれるスクリプトの実行時に実行されるメソッドを特定する。アプリケーション挙動解析部400は、メソッド解析結果記憶部103に記憶されている情報を参照し、add*jv*scriptInterfaceの第二引数である「medibaappsdk」および登録された*jv*オブジェクトのメソッドの名前である「adClicked(settings.targetWindow,enurl)」と関連付けられているAPIの名前を取得する。
また、図13に示すレスポンスでは、32行目に「medibaappsdk.getAdViewScale()」という文字列(下線部)が登場する。したがって、アプリケーション挙動解析部400は、この文字列を検出することによって、レスポンスに含まれるスクリプトの実行時に実行されるメソッドを特定する。アプリケーション挙動解析部400は、メソッド解析結果記憶部103に記憶されている情報を参照し、add*jv*scriptInterfaceの第二引数である「medibaappsdk」および登録された*jv*オブジェクトのメソッドの名前である「getAdViewScale()」と関連付けられているAPIの名前を取得する。
図14に示すレスポンスでは、36行目に「medibaappsdk.dspUidSync(name,uid,publishUrl,registUrl)」という文字列(下線部)が登場する。したがって、アプリケーション挙動解析部400は、この文字列を検出することによって、レスポンスに含まれるスクリプトの実行時に実行されるメソッドを特定する。アプリケーション挙動解析部400は、メソッド解析結果記憶部103に記憶されている情報を参照し、add*jv*scriptInterfaceの第二引数である「medibaappsdk」および登録された*jv*オブジェクトのメソッドの名前である「dspUidSync(name,uid,publishUrl,registUrl)」と関連付けられているAPIの名前を取得する。
また、図14に示すレスポンスでは、39行目および40行目に「medibaappsdk.adRefreshResult(2)」という文字列(下線部)が登場する。したがって、アプリケーション挙動解析部400は、この文字列を検出することによって、レスポンスに含まれるスクリプトの実行時に実行されるメソッドを特定する。アプリケーション挙動解析部400は、メソッド解析結果記憶部103に記憶されている情報を参照し、add*jv*scriptInterfaceの第二引数である「medibaappsdk」および登録された*jv*オブジェクトのメソッドの名前である「adRefreshResult(2)」と関連付けられているAPIの名前を取得する。
また、図14に示すレスポンスでは、45行目に「medibaappsdk. adRefreshResult(1)」という文字列(下線部)が登場する。したがって、アプリケーション挙動解析部400は、この文字列を検出することによって、レスポンスに含まれるスクリプトの実行時に実行されるメソッドを特定する。アプリケーション挙動解析部400は、メソッド解析結果記憶部103に記憶されている情報を参照し、add*jv*scriptInterfaceの第二引数である「medibaappsdk」および登録された*jv*オブジェクトのメソッドの名前である「adRefreshResult(1)」と関連付けられているAPIの名前を取得する。
アプリケーション挙動解析部400は、アプリケーションの挙動の解析結果を出力する。例えば、表示部に解析結果が表示される。あるいは、いずれかの記憶部に解析結果を記憶してもよい。例えば、解析結果は、スクリプトから呼び出されるメソッドが利用するAPIの名前である。あるいは、解析結果は、スクリプトから呼び出されるメソッドが利用するAPIの処理内容(例えば、位置情報の取得)であってもよい。
ステップS10の処理はステップS40の処理よりも前に行われればよい。ステップS10の処理はステップS20またはステップS30の処理の後に行われてもよい。リクエスト送信部301がリクエストを複数回送信する場合、例えば1個のリクエストを送信するステップS30と、1個のレスポンスを受信して解析を行うステップS40とが繰り返される。
次に、本実施形態の変形例を説明する。以下では、時間の経過に応じたスクリプトの変更によってアプリケーションの挙動が変化することを明示的に検出する処理について説明する。
アプリケーション挙動解析部400は、第1のレスポンスに含まれる第1のスクリプトと、第1のレスポンスとは別の第2のレスポンスに含まれる第2のスクリプトとを解析する。第1のレスポンスおよび第2のレスポンスは、異なるタイミングで取得されたレスポンスである。
例えば、リクエスト送信部301がリクエストを複数回送信する場合、複数回のリクエストの送信に対応して、レスポンス受信部302はレスポンスを複数回受信する。レスポンス受信部302によって異なるタイミングで受信された複数のレスポンスのうちの任意の2つのレスポンスが上記の第1のレスポンスおよび第2のレスポンスである。
動的解析部20が動的解析を行っている際にアプリケーションが送信するリクエストを受信したサーバから送信されるレスポンスを解析に利用してもよい。例えば、アプリケーション実行部200によってアプリケーションが実行された後、リクエスト送信部301はリクエストの送信を行わず、レスポンス受信部302はレスポンスの受信を待つ。アプリケーションが送信したリクエストを受信したサーバから送信されたレスポンスを受信した場合、レスポンス受信部302は、受信したレスポンスをレスポンス記憶部303に記憶させる。このレスポンスが第1のレスポンスである。レスポンス受信部302がレスポンスを受信した後、リクエスト送信部301はリクエストを送信する。レスポンス受信部302は、このリクエストを受信したサーバから送信されたレスポンスを受信する。このレスポンスが第2のレスポンスである。アプリケーションが送信するリクエストを受信したサーバから送信されるレスポンスを解析に利用することによって、リクエストの送信が1回減るので、アプリケーションの挙動の解析をより効率的に行うことができる。
アプリケーション挙動解析部400は、静的解析部20によって特定されたメソッドのうち第1のスクリプトと第2のスクリプトとのそれぞれの実行時に実行されるメソッドが利用するAPIを特定する。つまり、アプリケーション挙動解析部400は、第1のスクリプトの実行時に実行されるメソッドが利用する第1のAPIと、第2のスクリプトの実行時に実行されるメソッドが利用する第2のAPIとを特定する。アプリケーション挙動解析部400は、特定した第1のAPIと第2のAPIとを比較し、両者が同一であるか否かを確認する。
第1のAPIと第2のAPIとが同一である場合、時間が経過してもアプリケーションの挙動は変化していない。一方、第1のAPIと第2のAPIとが異なる場合、時間の経過によってスクリプトが変化し、アプリケーションの挙動が変化することを検出することができる。これによって、解析対象のアプリケーションが、時間の経過に応じて挙動を変化させるタイプのアプリケーションであることを知ることができる。
上記の変形例では、アプリケーション解析部40は、第1のレスポンスに含まれる第1のスクリプトと、第1のレスポンスとは別の第2のレスポンスに含まれる第2のスクリプトとを解析し、静的解析部10によって特定されたメソッドのうち第1のスクリプトと第2のスクリプトとのそれぞれの実行時に実行されるメソッドが利用するAPIを特定し、かつ、第1のスクリプトの実行時に実行されるメソッドが利用するAPIと、第2のスクリプトの実行時に実行されるメソッドが利用するAPIとを比較する。
また、上記の変形例では、アプリケーション解析部40は、サーバ解析部30によって送信された第1のリクエストに対応する第1のレスポンスに含まれる第1のスクリプトと、サーバ解析部30によって送信された、第1のリクエストとは異なる第2のリクエストに対応する第2のレスポンスに含まれる第2のスクリプトとを解析する。
あるいは、上記の変形例では、アプリケーション解析部40は、アプリケーションがサーバに送信した第1のリクエストに対応する第1のレスポンスに含まれる第1のスクリプトと、サーバ解析部30によって送信された第2のリクエストに対応する第2のレスポンスに含まれる第2のスクリプトとを解析する。
次に、本実施形態の他の変形例を説明する。アプリケーションがインストールされた端末とは別にアプリケーション解析装置を構成してもよい。例えば、端末が接続するアクセスポイントまたはプロキシサーバ等の通信装置を別途用意し、その通信装置にアプリケーション解析装置の機能を実装してもよい。端末とは別の通信装置にアプリケーション解析装置の機能が実装された場合、リクエスト取得部201は、端末のアプリケーションによって送信されたリクエストを受信することによってリクエストを取得する。これによって、解析対象のアプリケーションがインストールされた端末にアプリケーション解析装置の機能を実装する必要がなくなる。したがって、アプリケーション解析装置のOS等の実行環境が端末の実行環境に依存しなくなるので、様々な実行環境で動作するアプリケーションの挙動の解析をより効率的に行うことができる。
また、アプリケーション解析装置を構成する静的解析部10、動的解析部20、サーバ解析部30、アプリケーション解析部40の一部または全部が複数の異なる装置に分散して配置されていてもよい。例えば、静的解析部10が第1の装置に配置され、動的解析部20、サーバ解析部30、アプリケーション解析部40が第1の装置とは異なる第2の装置に配置されてもよい。また、静的解析部10とアプリケーション解析部40とが第1の装置に配置され、動的解析部20とサーバ解析部30とが第1の装置とは異なる第2の装置に配置されてもよい。
上述したように、本実施形態によれば、実際のアプリケーションの動作に基づいて、スクリプトの実行時に実行されるメソッドが利用するAPIを特定することが可能となる。また、ステップS30におけるリクエストの生成と送信とを任意のタイミングで行うことによって、任意のタイミングでスクリプトを取得し、スクリプトを解析することが可能となる。任意のタイミングでWebページのスクリプトが変更される可能性があるが、本実施形態では、スクリプトが変更された場合でも、スクリプトの変更後にリクエストが送信されれば、スクリプトの変更後のアプリケーションの挙動を解析することが可能となる。よって、Web連動型アプリケーションの挙動をより正確に解析することができる。
また、特定の操作が行われた場合のみリクエストを送信するアプリケーションの挙動を解析する場合、アプリケーションが送信するリクエストを1回取得した後は特定の操作を行う必要がない。このため、アプリケーションの挙動の解析をより効率的に行うことができる。
スマートフォン等のプラットフォームでは、アプリケーションの実装によっては、複数のアプリケーションを並列に実行できない場合がある。このような場合に本実施形態では、複数のアプリケーションを1つずつ排他的に実行し、リクエストを取得した時点でアプリケーションを終了すればよい。定期的に解析を行うためにリクエストを複数回送信する場合でも、各アプリケーションは1回実行されればよい。したがって、複数のアプリケーションの挙動の解析をより効率的に行うことができる。
また、アプリケーションが送信するリクエストを受信したサーバから送信されるレスポンスを解析に利用することによって、アプリケーションの挙動の解析をより効率的に行うことができる。
(第2の実施形態)
次に、本発明の第2の実施形態を説明する。Web連携型アプリケーションの中には、端末に依存する端末情報に応じたスクリプトをサーバから受信するアプリケーションがある。端末情報に応じてスクリプトが変化するため、端末情報に応じてアプリケーションの挙動が変化する。このようなアプリケーションの挙動を解析するために、端末情報が異なる多くの端末を用意するとコストがかかる。本実施形態では、端末情報に応じて変化するアプリケーションの挙動を効率的に解析するアプリケーション解析装置について説明する。
本実施形態では、第1の実施形態におけるサーバ解析部30が、図15に示すサーバ解析部30aに変更される。サーバ解析部30aは、リクエスト生成部300、リクエスト送信部301、レスポンス受信部302、レスポンス記憶部303、端末情報リスト記憶部304を有する。
端末情報リスト記憶部304は、端末の性能や属性を示す端末情報の種類毎に、端末情報として使用される複数の情報を含む端末情報リストを記憶する。図16は、端末情報リストの例を示している。
図16では端末情報の種類としてOSバージョン情報、端末モデル名、User-Agent、国コードがある。それぞれの種類に対して、端末情報として使用される複数の情報が示されている。例えば、OSバージョン情報に使用される情報として、「*andrd*1.6」、「*andrd*2.1」等が示されている。また、端末モデル名に使用される情報として、「IS01」、「IS03」等が示されている。また、User-Agentに使用される情報として、「Mozilla/5.0 (*Lnx*; U; *andrd* 4.1.1; ja-jp; Galaxy Nexus Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30」、「Mozilla/5.0 (*Lnx*; *andrd* 4.1.1; Nexus 7 Build/JRO03S) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19」等が示されている。また、国コードに使用される情報として、「JP」、「US」等が示されている。
本実施形態では、動的解析部20は、アプリケーションがサーバに送信する、端末情報を含むリクエストを取得する。また、サーバ解析部30は、動的解析部20によって取得されたリクエストに基づいて、そのリクエストに含まれる端末情報と同一または異なる第1の端末情報を含む第1のリクエストと、第1の端末情報と異なる第2の端末情報を含む第2のリクエストとを生成し、生成された第1のリクエストと第2のリクエストとをサーバに送信する。
具体的には、リクエスト生成部300は、リクエスト記憶部202に記憶されているリクエストに含まれる情報と、端末情報リスト記憶部304に記憶されている端末情報リストに含まれる情報とを比較する。このとき、リクエスト生成部300は、リクエストのメッセージ・ボディを検索範囲として、端末情報の種類毎に、端末情報として使用される情報の文字列を検索する。例えば、OSバージョン情報として使用されるそれぞれの情報の文字列の検索、端末モデル名として使用されるそれぞれの情報の文字列の検索、User-Agentとして使用されるそれぞれの情報の文字列の検索、国コードとして使用されるそれぞれの情報の文字列の検索が順次行われる。
図10に示すリクエストの例では、2行目に「Mozilla/5.0 (*Lnx*; U; *andrd* 4.1.1; ja-jp; Galaxy Nexus Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30」(下線部)がある。また、図11に示すリクエストの例では、6行目に「Mozilla/5.0 (*Lnx*; U; *andrd* 4.1.1; ja-jp; Galaxy Nexus Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30」(下線部)がある。これらは、端末情報リストに含まれるUser-Agentの情報と一致する。
文字列の検索の結果、リクエスト生成部300は、リクエスト記憶部202に記憶されているリクエストに含まれる情報が、端末情報リストに含まれる情報のいずれかと一致した場合に、端末情報リストから、一致した情報と同一種類の端末情報として使用される情報を選択する。例えば、User-Agentに使用される情報である「Mozilla/5.0 (*Lnx*; U; *andrd* 4.1.1; ja-jp; Galaxy Nexus Build/JRO03H) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30」がリクエストに含まれている場合、リクエスト生成部300は、User-Agentに使用される情報であって、リクエストに含まれる情報と同一の情報または異なる情報(例えば、「Mozilla/5.0 (*Lnx*; *andrd* 4.1.1; Nexus 7 Build/JRO03S) AppleWebKit/535.19 (KHTML, like Gecko) Chrome/18.0.1025.166 Safari/535.19」)を端末情報リストから選択する。
リクエスト生成部300は、リクエストに含まれる端末情報を、上記のようにして選択した情報で置き換えることによって、新たなリクエストを生成する。リクエスト記憶部202に記憶されているリクエストに含まれる情報が、端末情報リストに含まれる情報のいずれかと一致した場合、そのリクエストが、端末情報を含むリクエストである。また、上記のようにしてリクエスト生成部300が生成したリクエストが、第1の端末情報を含む第1のリクエストおよび第2の端末情報を含む第2のリクエストである。リクエスト生成部300は、第2のリクエストを生成する際、第1の端末情報とは異なる第2の端末情報を端末情報リストから選択する。
リクエスト生成部300は、リクエスト記憶部202に記憶されているリクエストと同一のリクエストを第1のリクエストとして生成してもよい。この場合、リクエスト記憶部202に記憶されているリクエストに含まれる端末情報と、第1のリクエストに含まれる第1の端末情報とは同一である。
リクエスト送信部301は上記の第1のリクエストと第2のリクエストとをサーバに送信する。リクエスト受信部302は、第1のリクエストを受信したサーバから送信された第1のレスポンスと、第2のリクエストを受信したサーバから送信された第2のレスポンスとを受信し、受信した第1のレスポンスと第2のレスポンスとをレスポンス記憶部303に記憶させる。
上記の例では、サーバ解析部30は、端末情報の種類毎に、端末情報として使用される複数の情報を含む端末情報リストに含まれる情報と、動的解析部20によって取得されたリクエストに含まれる情報とを比較し、そのリクエストに含まれる情報が、端末情報リストに含まれる情報のいずれかと一致した場合に、端末情報リストから、一致した情報と同一種類の端末情報として使用される情報を選択し、選択した情報を含む第1のリクエストと第2のリクエストとを生成する。
動的解析部20が動的解析を行っている際にアプリケーションが送信するリクエストを受信したサーバから送信されるレスポンスを解析に利用してもよい。例えば、アプリケーション実行部200によってアプリケーションが実行された後、リクエスト送信部301はリクエストの送信を行わず、レスポンス受信部302はレスポンスの受信を待つ。アプリケーションが送信したリクエスト(第1のリクエスト)を受信したサーバから送信されたレスポンスを受信した場合、レスポンス受信部302は、受信したレスポンスをレスポンス記憶部303に記憶させる。
アプリケーションが送信した第1のリクエストはリクエスト記憶部202に記憶されている。この第1のリクエストに含まれる情報が、端末情報リストに含まれる情報のいずれかと一致した場合、この第1のリクエストに対応して受信されたレスポンスが第1のレスポンスである。レスポンス受信部302が第1のレスポンスを受信した後、リクエスト生成部300は、第1のリクエストに含まれる端末情報を、上記のようにして選択した情報で置き換えることによって、第2のリクエストを生成する。リクエスト送信部301は第2のリクエストを送信する。レスポンス受信部302は、第2のリクエストを受信したサーバから送信されたレスポンスを受信する。このレスポンスが第2のレスポンスである。アプリケーションが送信するリクエストを受信したサーバから送信されるレスポンスを解析に利用することによって、リクエストの送信が1回減るので、アプリケーションの挙動の解析をより効率的に行うことができる。
上記の例では、動的解析部20は、アプリケーションがサーバに送信する、第1の端末情報を含む第1のリクエストを取得する。サーバ解析部30は、動的解析部20によって取得された第1のリクエストに基づいて、第1の端末情報と異なる第2の端末情報を含む第2のリクエストを生成し、生成された第2のリクエストをサーバに送信する。
また、上記の例では、サーバ解析部30は、端末情報の種類毎に、端末情報として使用される複数の情報を含む端末情報リストに含まれる情報と、動的解析部20によって取得された第1のリクエストに含まれる情報とを比較し、第1のリクエストに含まれる情報が、端末情報リストに含まれる情報のいずれかと一致した場合に、端末情報リストから、一致した情報と同一種類の端末情報として使用される情報を選択し、選択した情報を含む第2のリクエストを生成する。
アプリケーション挙動解析部400は、第1のレスポンスに含まれる第1のスクリプトと、第2のレスポンスに含まれる第2のスクリプトとを解析する。この解析によって、アプリケーション挙動解析部400は、静的解析部20によって特定されたメソッドのうち第1のスクリプトと第2のスクリプトとのそれぞれの実行時に実行されるメソッドが利用するAPIを特定する。つまり、アプリケーション挙動解析部400は、第1のスクリプトの実行時に実行されるメソッドが利用する第1のAPIと、第2のスクリプトの実行時に実行されるメソッドが利用する第2のAPIとを特定する。アプリケーション挙動解析部400は、特定した第1のAPIと第2のAPIとを比較し、両者が同一であるか否かを確認する。
第1のAPIと第2のAPIとが同一である場合、リクエストに含まれる端末情報が変化してもアプリケーションの挙動は変化していない。一方、第1のAPIと第2のAPIとが異なる場合、リクエストに含まれる端末情報が変化することによってスクリプトが変化し、アプリケーションの挙動が変化することを検出することができる。これによって、解析対象のアプリケーションが、リクエストに含まれる端末情報の変化に応じて挙動を変化させるタイプのアプリケーションであることを知ることができる。
上記の例では、アプリケーション解析部40は、第1のリクエストに対応してサーバから送信された第1のレスポンスに含まれる第1のスクリプトと、第2のリクエストに対応してサーバから送信された第2のレスポンスに含まれる第2のスクリプトとを解析し、静的解析部10によって特定されたメソッドのうち第1のスクリプトと第2のスクリプトとのそれぞれの実行時に実行されるメソッドが利用するAPIを特定し、かつ、第1のスクリプトの実行時に実行されるメソッドが利用するAPIと、第2のスクリプトの実行時に実行されるメソッドが利用するAPIとを比較する。
上述したように、本実施形態によれば、実際のアプリケーションの動作に基づいて、スクリプトの実行時に実行されるメソッドが利用するAPIを特定することが可能となる。また、動的解析部20によって取得されたリクエストに含まれる端末情報とは異なる端末情報を含むリクエストを送信し、そのリクエストに対応するレスポンスに含まれるスクリプトを解析することによって、端末情報の変化に応じたアプリケーションの挙動の変化を解析することが可能となる。よって、Web連動型アプリケーションの挙動をより正確に解析することができる。
また、端末情報が異なる多くの端末を用意してアプリケーションの挙動を解析する必要がないため、端末情報に応じて変化するアプリケーションの挙動を効率的に解析することができる。
また、アプリケーションが送信するリクエストを受信したサーバから送信されるレスポンスを解析に利用することによって、アプリケーションの挙動の解析をより効率的に行うことができる。
また、動的解析部20によって取得されたリクエストに含まれる端末情報を特定し、その端末情報と同一種類の端末情報として使用される情報を含むリクエストを生成することによって、異なる端末情報を含むリクエストをより効率的に生成することができる。
以上、図面を参照して本発明の実施形態について詳述してきたが、具体的な構成は上記の実施形態に限られるものではなく、本発明の要旨を逸脱しない範囲の設計変更等も含まれる。