(57)【要約】      （修正有）【課題】リバースエンジニアリングからデバッグ対象プログラムを保護すると同時に、パフォーマンスを劣化させることなくリモートデバッグを可能にする。【解決手段】デバッグ対象プログラムの内、プログラムロジックを表す情報と、デバッグ時に必要な情報をそれぞれ別方式で変換する。プログラムロジックを表す情報は既存の難読化方式を用いて難読化し、デバッグ時に必要な情報は既存の暗号化方式を用いて暗号化する。別方式で変換されたプログラムを用いてプログラムロジックを実行し、誤動作発生時は暗号化されたデバッグ情報を用いてリモートデバッグを行う。暗号化されたデバッグ情報は、デバッグを行う保守センタ側で復号化する。【選択図】図２
2013045277.tif 000002
【特許請求の範囲】
【請求項１】
デバッグ対象装置で実行するためのデバッグ対象プログラムを、プログラム難読化処理手段を備えた難読化装置において難読化する方法であって、
前記デバッグ対象プログラムは、プログラムロジックを表すコード情報と、デバッグに必要な情報を表すデバッグ情報とを含んで構成され、
前記プログラム難読化処理手段により、
前記デバッグ対象プログラムの前記プログラムロジックを変更することなく、前記コード情報を、リバースエンジニアリングが困難な情報へと難読化し、
前記デバッグ情報を、リバースエンジニアリングが不可能な情報へと暗号化することにより、前記デバッグ対象プログラムを難読化する
ことを特徴とするプログラム難読化方法。
【請求項２】
請求項１において、
前記デバッグ対象プログラムは、前記デバッグ対象装置で仮想マシンを実行するアプリケーションプログラムである
ことを特徴とするプログラム難読化方法。
【請求項３】
請求項２において、
前記デバッグ対象プログラムはJava言語で記述されたプログラムであり、
前記プログラムロジックを構成するクラスファイルの前記コード情報と前記デバッグ情報とをそれぞれ別方式で変換する
ことを特徴とするプログラム難読化方法。
【請求項４】
請求項３において、
前記プログラム難読化処理手段は、
前記クラスファイルのプログラムデータをその格納場所から読み込み、
該読み込んだプログラムデータのバイトコードから前記コード情報を取得し、
前記取得したクラスファイルのコード情報を、前記難読化手段を用いて、難読化前のコード情報と同じロジックを表すが、人間にとっては解析が困難な情報となるコード情報に変換し、
前記プログラムデータに前記取得したコード情報に関連するデバッグ情報が存在するかどうかを判定し、
前記デバッグ情報を含むコードと判定された場合に、前記プログラムデータから前記デバッグ情報を取得して所定の場所に格納し、
前記取得したクラスファイルのデバッグ情報を、前記難読化したコード情報に対応付ける形式に編集し、
該編集したデバッグ情報を暗号化し、該暗号化されたデバッグ情報を元の格納場所に格納する
ことを特徴とするプログラム難読化方法。
【請求項５】
デバッグ対象プログラムを実行するデバッグ対象装置と、プログラム難読化処理手段を備えた難読化装置と、前記デバッグ対象プログラムをデバッグ処理するデバッグ処理装置とがネットワークを介して相互に接続可能に構成されたリモートデバッグシステムであって、
前記難読化装置の前記プログラム難読化処理手段は、
前記デバッグ対象プログラムの前記プログラムロジックを変更することなく、前記コード情報を、リバースエンジニアリングが困難な情報へと難読化し、前記デバッグ情報を、リバースエンジニアリングが不可能な情報へと暗号化することにより、前記デバッグ対象プログラムを難読化し、
前記デバッグ対象装置は、
前記プログラム難読化処理手段により難読化されたデバッグ対象プログラムを保持すると共に、該デバッグ対象プログラムの実行環境、及び、デバッグ応答処理部を備え、
前記デバッグ処理装置は、
前記デバッグ対象装置の前記デバッグ対象プログラムに関するデバッグ情報の取得手段能、及び、前記デバッグ対象プログラムに関するデバッグ情報の復号・処理手段を有し、
前記ネットワークを介して前記デバッグ対象装置の難読化されたデバッグ対象プログラムのデバッグ処理を行う
ことを特徴とするリモートデバッグシステム。
【請求項６】
請求項５において、
前記デバッグ処理装置が、前記ネットワークを介して前記デバッグ対象装置に接続された保守センタであり、
該保守センタは、難読化された前記プログラムの暗号化されたデバッグ情報を復号化可能なデバッガと、前記ネットワークを介した前記デバッグ処理が可能なプログラム実行環境とを備え、
前記デバッガは、
前記デバッグ処理のためのユーザインタフェースを提供するデバッグ要求処理部と、
暗号化された前記デバッグ情報を復号化するデバッグ情報復号処理部により構成される
ことを特徴とするリモートデバッグシステム。
【請求項７】
請求項６において、
前記デバッグ対象装置は、記憶部と処理部を備え、
前記記憶部に前記プログラムとしてのアプリケーションプログラムおよび該アプリケーションプログラムを実行可能なように処理する仮想マシンを記憶し、前記処理部が前記仮想マシンを実行する環境を備え、
通常時は前記難読化された前記プログラムを実行する
ことを特徴とするリモートデバッグシステム。
【請求項８】
請求項５において、
前記デバッグ応答処理は、前記デバッグ要求処理部から送信されるデバッグ要求メッセージを受信し、当該メッセージの種類に応じてデバッグ対象プログラムのデバッグ処理を行い、その結果を前記デバッグ要求処理部に返す
ことを特徴とするリモートデバッグシステム。
【請求項９】
請求項６において、
前記保守センタは、前記デバッグ対象装置の前記デバッグ対象プログラムに誤動作が発生した時、暗号化された前記デバッグ情報を復号化し、前記デバッグ対象装置のデバッグ対象プログラムに対するリモートデバッグを行う
ことを特徴とするリモートデバッグシステム。
【請求項１０】
請求項６において、
前記デバッガが、前記難読化された前記プログラムの前記デバッグ情報を取得するためのデバッグ要求を前記デバッグ対象装置の前記プログラム実行環境に送信した際、当該デバッグ要求を受けた該デバッグ対象装置の前記プログラム実行環境は前記難読化された前記プログラムから当該デバッグ要求の求める暗号化された前記デバッグ情報を取得し、
暗号化された当該デバッグ情報を前記デバッガに返信し、
前記デバッガは前記デバッグ対象装置の前記プログラム実行環境から受信した暗号化された当該デバッグ情報を復号化する
ことを特徴とするリモートデバッグシステム。
【請求項１１】
請求項５において、
前記デバッグ処理装置が、前記ネットワークを介したデバッグ処理が可能なデバッガと、前記ネットワークを介して送信されたデバッグ要求を前記デバッグ対象装置に該ネットワークを介して転送可能なプロキシサーバとで構成され、
前記プロキシサーバは、前記難読化されたプログラムの暗号化されたデバッグ情報を復号可能で、かつ、ネットワークを介したデバッグ処理が可能なプログラム実行環境を有し、
前記デバッグ対象装置が、前記難読化されたプログラムを実行可能なプログラム実行環境を有し、
前記デバッガが、前記難読化された前記プログラムの前記デバッグ情報を取得するためのデバッグ要求を前記プロキシサーバに送信した際、前記プロキシサーバは当該デバッグ要求を前記デバッグ対象装置の前記プログラム実行環境に転送し、
当該デバッグ要求を受けた前記デバッグ対象装置の前記プログラム実行環境は、前記難読化された前記プログラムから当該デバッグ要求の求める暗号化された前記デバッグ情報を取得し、前記プログラム実行環境は暗号化された当該デバッグ情報を前記プロキシサーバに返信し、
前記プロキシサーバは、前記プログラム実行環境から受信した暗号化された当該デバッグ情報を復号化し、該復号化された当該デバッグ情報を前記デバッガに返信する
ことを特徴とするリモートデバッグシステム。
【請求項１２】
請求項５において、
前記デバッグ処理装置が、前記ネットワークを介したデバッグ処理が可能なデバッガと、前記デバッグ要求を前記デバッグ対象装置に前記ネットワークを介して転送可能なプロキシサーバとを備えた保守センタで構成され、
前記保守センタは、前記難読化されたプログラムの暗号化されたデバッグ情報を復号可能で、かつ、ネットワークを介したデバッグ処理が可能なプログラム実行環境を有し、
前記デバッグ対象装置が、前記難読化されたプログラムを実行可能なプログラム実行環境を有し、
前記保守センタが、前記難読化された前記プログラムの前記デバッグ情報を取得するためのデバッグ要求を前記デバッグ対象装置の前記プログラム実行環境に送信し、
当該デバッグ要求を受けた前記デバッグ対象装置の前記プログラム実行環境は、前記難読化された前記プログラムから当該デバッグ要求の求める暗号化された前記デバッグ情報を取得し、前記プログラム実行環境は暗号化された当該デバッグ情報を前記保守センタに返信し、
前記保守センタは、前記プログラム実行環境から受信した暗号化された当該デバッグ情報を復号化する
ことを特徴とするリモートデバッグシステム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、プログラム難読化方法およびリモートデバッグシステムに係り、特に、デバッグ対象のソフトウェアプログラム（以下、デバッグ対象プログラム）をリバースエンジニアリングから保護するための技術、およびデバッグ対象プログラムを遠隔からデバッグするための技術に関する。
【背景技術】
【０００２】
近年、仮想マシン（Virtual Machine）を搭載した機器の普及が進んでいる。仮想マシンでは、Pentium（登録商標）、PowerPC等のCPUがプログラムを直接実行するのでなく、仮想的な計算機をソフトウェア的に用意し、プログラムがそれによって実行されるようにする。
【０００３】
例えば、Java仮想マシン（JavaはJavaTMの略称であり、Oracle Corporation及びその子会社、関連会社の米国及びその他の国における登録商標である）を搭載した機器の普及が進んでいる。Java仮想マシンはCPUやOSの違いを吸収し、中間コードで構成されるJavaプログラムを様々な機器で実行可能にする。多様な機器が存在する携帯電話の多くはJava仮想マシンを搭載し、近年登場したAndroid（AndroidはAndroidTMの略称であり、米国Google社の商標または登録商標である）もJavaの技術を採用している。また、Javaプログラムを機器に配信し、実行開始や実行停止といったプログラムのライフサイクルを管理するための基盤としてOSGi（OSGiはOSGiTMの略称であり、また、米国OSGi Allianceの登録商標である）と呼ばれる技術が注目されている。こうしたAndroidやOSGiといった実行基盤を利用し、様々な機器で動作するプログラムの配信・販売を複数のソフトウェアベンダが開始しつつある。
【０００４】
一方、様々なベンダが開発した様々なJavaプログラムをAndroidやOSGi搭載機器にインストールし、同時実行させることにより、プログラムの障害発生要因が複雑化している。CPUリソース、メモリリソースの競合、ストレージ容量、画面表示領域の競合など、その要因は多岐に渡る。プログラム開発者は他にどのようなプログラムが同時実行されるかを事前に予測することができないため、リソース競合に起因するプログラムの誤動作を事前テストによって検査することは困難である。また、プログラムの配布後に誤動作を検出した際も、誤動作発生環境を再現するには他ベンダの開発したプログラムを全て入手しなければならないため、再現環境における事後テストも困難な状況にある。そこで、誤動作が発生した実機環境を用いた遠隔からのプログラムデバッグ（以下、リモートデバッグ）を可能にする技術が求められる。Oracle社が提供するJava標準のデバッガであるJDBは、そのためのリモートデバッグ機能を備えている。
【０００５】
しかし、JDB等のデバッガを用いたリモートデバッグを可能にするためには、デバッグに利用される情報（以下、デバッグ情報）をJavaプログラムファイル（以下、クラスファイル）内に含めなければならない。このデバッグ情報の中にはソースコードの行番号やローカル変数名などが格納されるため、悪意のあるユーザがプログラムを解析し、セキュリティ機能を解除するといった、いわゆる「リバースエンジニアリング」が容易になるという課題がある。元々、Javaプログラムはバイトコードと呼ばれる中間コードで構成されており、また、シンボル参照解決による動的リンクを前提としているため、リバースエンジニアリングに弱いという特徴を持つ。これに加え、Javaプログラムにデバッグ情報を含めることにより、悪意のあるユーザはほぼ完全なソースコードを再構築（デコンパイル）できてしまう。代表的なデコンパイルツールとして、JADやJODE、SourceAgainなどが知られている。
【０００６】
こうしたリバースエンジニアリングを防ぐ技術として、プログラムの難読化技術がある。例えば特許文献１には、難読化前と同じ演算結果が得られるようなダミーコードを生成し、プログラムを難読化する方法が記載されている。また、特許文献２には、プログラムに暗号化を施し、プログラムの実行前に復号化する方法が記載されている。また、特許文献３には、ソースコードに含まれる連続した命令をブロック単位に切り出し、切り出したブロックの実行順序を制御するための制御変数を設定する難読化方法が記載されている。代表的なプログラム難読化ツールとして、DashOやProGuard、ZelixKlassMasterなどが知られている。Android向けの開発環境には、ProGuardが標準で組み込まれている。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２０１１−０１８１１９号公報
【特許文献２】特開２００９−０７５７２０号公報
【特許文献３】特開２００８−０９０６６８号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
仮想マシンを搭載した機器のリバースエンジニアリングからデバッグ対象プログラムを保護するために、特許文献１および特許文献３記載のように、プログラム全体を難読化する方法では、デバッグ対象プログラムからデバッグ情報が削除されるか、またはデバッグ情報が無意味な情報となるため、リモートデバッグが不可能になるという課題がある。
【０００９】
また、リバースエンジニアリングからデバッグ対象プログラムを保護するために、特許文献２記載のようにプログラム全体を暗号化した場合、暗号化に利用した秘密鍵の管理や、復号処理コード自体の保護が必要になるという課題がある。さらに、暗号化されたプログラムを復号化しながら実行する場合は、パフォーマンスが劣化するという課題がある。
【００１０】
このような従来技術の課題を解決し、リバースエンジニアリングからデバッグ対象プログラムを保護すると同時に、パフォーマンスを劣化させることなくリモートデバッグを可能にすることが本発明の目的である。
【課題を解決するための手段】
【００１１】
本発明の代表的なものの一例を示すと、次のとおりである。本発明のプログラム難読化方法は、デバッグ対象装置で実行するためのデバッグ対象プログラムを、プログラム難読化処理手段を備えた難読化装置において難読化する方法であって、前記デバッグ対象プログラムは、プログラムロジックを表すコード情報と、デバッグに必要な情報を表すデバッグ情報とを含んで構成され、前記プログラム難読化処理手段により、前記デバッグ対象プログラムの前記プログラムロジックを変更することなく、前記コード情報を、リバースエンジニアリングが困難な情報へと難読化し、前記デバッグ情報を、リバースエンジニアリングが不可能な情報へと暗号化することにより、前記デバッグ対象プログラムを難読化することを特徴とする。
【発明の効果】
【００１２】
本発明によれば、デバッグ対象プログラムをリバースエンジニアリングから保護すると同時に、デバッグ対象プログラムのリモートデバッグを可能にする。
【図面の簡単な説明】
【００１３】
【図１】本発明の実施例１のシステム構成例の図。
【図２】実施例１の、リモートデバッグに関係するソフトウェア構成例の図。
【図３】実施例１の、難読化手順の一例を表すフローチャート。
【図４】図３の難読化手順における、プログラムのデバッグ情報の暗号化の前後の例を示す図。
【図５】実施例１のリモートデバッグ手順を表すシーケンス図。
【図６】本発明の実施例２の、リモートデバッグに関係するソフトウェア構成例の図。
【図７】実施例２の、リモートデバッグ手順の一例を表すシーケンス図。
【図８】本発明の実施例３の、ハードウェア及びソフトウェアの構成例を示す図。
【発明を実施するための形態】
【００１４】
本発明の代表的な実施形態によれば、難読化装置において、仮想マシンを実行するデバッグ対象プログラムを難読化する。この難読化において、プログラムロジックを構成するJavaバイトコード等の情報（以下、コード情報）とデバッグ情報をそれぞれ別方式で変換する。コード情報は既存の難読化方式を用いて難読化し、デバッグ情報は既存の暗号化方式を用いて暗号化する。変換したコード情報およびデバッグ情報は従来のクラスファイルフォーマットと同一のフォーマットで、プログラムを実行する実機上のクラスファイル内に格納する。実機は、通常時は難読化されたコード情報を用いてプログラムロジックを実行し、誤動作発生時は、実機とは異なるデバッグ処理装置（保守センタ）が、暗号化されたデバッグ情報を用いてリモートデバッグを行う。暗号化されたデバッグ情報は実機上では復号化せず、デバッグを行うデバッグ処理装置側で復号化する。
【００１５】
本実施形態を用いることにより、デバッグ対象装置のプログラムをリバースエンジニアリングから保護すると同時に、該プログラムのリモートデバッグを可能にする。プログラムのコード情報は暗号化しないため、デバッグ処理装置におけるプログラム実行時の復号処理によるパフォーマンスの劣化は起こらない。また、暗号化したデバッグ情報は実機上では復号化しないことから、実機における秘密鍵の管理は不要であり、かつ復号処理コードの保護も不要である。また、実機上ではコード情報の難読化、デバッグ情報の暗号化および復号化のいずれの処理も発生しないことから、プログラム実行環境のロジック改変は不要である。  
さらに、本発明の他の実施形態によれば、デバッグ処理装置（保守センタ）側に復号処理を行う専用のプロキシサーバを用いることで、既存のデバッガをそのまま利用できる。
【００１６】
以下、本発明の実施例を、図面を用いて詳細に説明する。
【実施例１】
【００１７】
図１は、本発明の実施例１になるリモートデバッグシステムの構成例を表す図である。リモートデバッグシステムは、１つの保守センタ（デバッグ処理装置）１００と、ネットワーク１０６を介してこの保守センタ１００に接続され各々デバッグ対象装置を具備する複 数のユーザの端末機器すなわち複数の実機１０５（１０５Ａ〜１０５ｎ）と、ネットワーク１０６に接続されたプログラム開発者提供の難読化装置１０７とで構成されている。なお、保守センタ１００、各ユーザの端末機器１０５及びプログラム開発者提供の難読化装置１０７は、各々、コンピュータと、これらのコンピュータに各種の機能・手段を実現させるプログラムとを保有している。保守センタ１００、ユーザの端末機器１０５、及び、難読化装置１０７は、記憶部にアプリケーションプログラム及びこのアプリケーションプログラムを実行可能なように処理する仮想マシンを記憶し、処理部が前記仮想マシンを実行するプログラム実行装置である。例えば、このリモートデバッグシステムを構成する各機器には、予め、専用のJava仮想マシン（ＪａｖａＶＭ）がインストールされており、Javaプログラムの実行時にはＪａｖａＶＭが起動され、同じＪａｖａプログラムを共通に開発し、実行可能な環境にある。
【００１８】
コンピュータは、例えば、演算装置１０１、記憶部（主記憶装置１０２、外部記憶装置１０４）、及び、通信装置１０３を備えている。演算装置１０１は、主記憶装置１０２にロードされた命令を処理する中央演算装置である。主記憶装置１０２は、外部記憶装置１０４からロードされたプログラムデータを記憶する揮発メモリまたは不揮発メモリである。通信装置１０３は、外部のネットワーク１０６と接続し、ハードウェア上で動作するプログラムが必要とするデータを送受信するための装置である。外部記憶装置１０４は、プログラムデータを記憶する不揮発メモリである。ここで、外部記憶装置１０４は、ネットワークを経由した別のマシン上に存在する構成であってもよい。
【００１９】
保守センタ１００は、コンピュータ上で主記憶装置１０２に保持されたアプリケーションプログラムを実行することにより実現される機能・手段として、各実機のデバッグ情報の取得手段、及び、デバッグ情報の復号・処理手段を有している。さらに、この保守センタ１００に接続された各端末機器のデバッグ対象のプログラムとそのプログラムを特定するＩＤ及びデバッグに関する情報を記録したユーザリスト（デバッグ対象プログラムテーブル）とを保持している。各端末機器１０５は、デバッグ対象プログラムを保持すると共に、コンピュータ上でアプリケーションプログラムを実行することにより実現される機能として、デバッグ対象プログラムの実行手段及び暗号化デバッグ情報の応答処理手段を保持している。プログラム開発者提供の難読化装置１０７は、デバッグ対象プログラムに対して難読化・暗号化の処理を行う、プログラム難読化処理手段を保有している。
【００２０】
Java言語のソースファイルがJava言語用のコンパイラで変換されて、実行用のクラスファイルに変換される。ソースファイルのソースコードは、クラスファイルのバイトコードに変換される。各端末機器１０５でクラスファイルが実行されるときは、ＪａｖａＶＭが起動され、ＪａｖａＶＭがクラスファイルのバイトコードを読み取って、機械語に翻訳を行いながら、処理を実行する。保守センタ装置２０１及びデバッグ対象装置２０２は、デバッグに利用されるソースコードの行番号やローカル変数名などのデバッグ情報をクラスファイル内に保持している。
【００２１】
本発明において述べる機器は、一般的に、図１に記載のハードウェア構成をとるが、この構成に限定するものではない。
【００２２】
図２は、実施例１のリモートデバッグシステムにおける、保守センタ装置２０１とデバッグ対象装置２０２におけるソフトウェア構成例を表すものである。図２において、保守センタ装置２０１は、ユーザのデバッグ対象装置２０２に対して、実際にリモートデバッグ処理を行う個人または集団（以下、仮にサービス管理者と呼ぶ）が利用する装置である。サービス管理者はリモートデバッガ２０４を用いてデバッグ対象装置２０２のプログラムのデバッグ処理を行う。リモートデバッガ２０４は、サービス管理者にデバッグ処理のためのユーザインタフェースを提供するデバッグ要求処理部２０５と、暗号化されたデバッグ情報を復号化するデバッグ情報復号処理部２０６、及びユーザリスト（図示略）により構成される。
【００２３】
デバッグ対象装置２０２は、リモートデバッグの対象となるデバッグ対象プログラム２０７を実行する装置である。デバッグ対象装置２０２では、デバッグ対象プログラム２０７の実行環境であるプログラム実行環境２０８が動作する。プログラム実行環境２０８のデバッグ応答処理部２０９は、保守センタ装置２０１のデバッグ要求処理部２０５から送信されるデバッグ要求メッセージを受信し、当該メッセージの種類に応じてデバッグ対象プログラム２０７のデバッグ処理を行い、その結果をデバッグ要求処理部２０５に返す。
【００２４】
ネットワーク２０３は、保守センタ装置２０１とデバッグ対象装置２０２を繋ぐEthernet（登録商標）等の一般的なネットワークである。但し、保守センタ装置２０１とデバッグ対象装置２０２は同一のコンピュータシステム上で動作する装置（第１の機器）であっても良く、その場合、ネットワーク２０３は論理的な通信パイプを表す。あるいはまた、難読化装置と保守センタ装置とが同一のコンピュータシステム上で動作する装置（第２の機器）であっても良い。
【００２５】
本発明において述べるリモートデバッグシステムは、一般的に図２記載のソフトウェア構成をとるが、この構成に限定するものではない。
【００２６】
図３は、本発明におけるプログラム難読化処理のフローチャートである。このプログラム難読化処理３００は、ここでは、難読化装置１０７において、Javaプログラムの開発者が専用ツールを用いて行うことを想定する。各端末機器１０５に保持されるデバッグ対象プログラムは、予め、このプログラム難読化処理３００が施されたプログラムである。
【００２７】
難読化処理３００では、まず、ステップ３０１でデバッグ対象プログラム２０７として動作させるプログラムデータを読み込む。読み込む手段としては例えば外部記憶装置１０４から読み込む手段が考えられるが、一般的に考えられる別の手段を用いても良い。例えば通信装置１０３を用いてネットワーク上に存在するプログラムデータをダウンロードしても良い。プログラムデータの例として、例えばJavaのクラスファイルやアーカイブファイル（JARファイル）などが挙げられる。アーカイブファイルは、変換された複数のJavaバイトコード及びそれが使用する画像などのリソースを、一つに纏め圧縮したファイルである。
【００２８】
ステップ３０２は、ステップ３０１で読み込んだプログラムデータのコード情報を取得するステップである。例えばJavaのクラスファイルではCode属性と呼ばれる部分に、プログラミング言語と機械言語の中間の形式で記述された、Java仮想マシンが理解できる、バイトコードが格納される。
【００２９】
ステップ３０３は、ステップ３０２で取得したクラスファイルやアーカイブファイルのコード情報を難読化するステップである。難読化は、逆アセンブルや逆コンパイルされてもそのコードを無意味なものにし、出力されたソースコードの解析を意図的に分かり難くすることである。難読化手段の種類や構成に限定は無く、「オブファスケータ」と呼ばれる一般的な難読化ツールを用いることができる。代表的なオブファスケータとして、DashOやProGuardなどが挙げられるが、これらに限定するものではない。難読化後のコード情報は、難読化前のコード情報と同じロジックを表すが、人間にとっては解析が困難な情報となる。難読化前のプログラムデータと難読化後のプログラムデータに構造上の変更はない。
【００３０】
図４に、プログラムのコード情報の難読化の前（ａ）、及び、後（ｂ）の例を示す。この例では、難読化前のコード情報の文字列String title＝”a”が、難読化後はString abcde ＝ ”a”に変換されている。コード部分は難読化されるものの暗号化はしないので、プログラムデータに構造上の変更はない。
【００３１】
ステップ３０４は、プログラムデータにステップ３０２で取得したコード情報に関連するデバッグ情報が存在するかどうかを判定するステップである。例えば、JavaではLineNumberTable属性と呼ばれる部分にソース行番号の情報が格納され、LocalVariableTable属性と呼ばれる部分にローカル変数名が格納される。ステップ３０４でデバッグ情報が存在すると判定されるとステップ３０５に進み、存在しないと判定されるとステップ３０８に進む。ここで、デバッグ情報が存在しないと判定されたプログラムコードはリモートデバッグの対象にはならないが、デバッグ情報を含むコードと含まないコードが一つのプログラムデータ内に混在する可能性は考えられる。
【００３２】
ステップ３０５は、ステップ３０４でデバッグ情報が存在すると判定された場合に遷移するステップであり、プログラムデータからデバッグ情報を取得する処理を行う。デバッグ情報の格納場所は、Javaにおいては前述の通りクラスファイル内のLineNumberTable属性やLocalVariableTable属性などであるが、これに限定するものではない。例えばデバッグ情報を別のファイルに出力するコンパイラなどが考えられるが、デバッグ情報の種類や格納場所については限定しない。
【００３３】
ステップ３０６は、ステップ３０５で取得したクラスファイルのデバッグ情報を、ステップ３０３で難読化したコード情報に対応付ける形式に編集するステップである。例えば、ステップ３０３で複数の無意味なダミーコードを生成した場合、これらのダミーコード全体に同じソース行番号を対応付けるといった処理が考えられる。この対応付け手段は複数考えられるが、正常なリモートデバッグ処理が可能であればよく、特定の手段に限定するものではない。
【００３４】
ステップ３０７は、ステップ３０５で取得し、ステップ３０６で編集したデバッグ情報を暗号化するステップである。暗号化の手段としては、３DES等を利用した一般的な秘密鍵暗号方式であっても、RSA等を利用した一般的な公開鍵暗号方式であっても、それらを組み合わせた一般的な暗号方式であってもよい。また、元のデバッグ情報のデータ型と同一のデータ型に変換する独自の暗号化方式を利用することも考えられる。例えばソース行番号を表す整数値を、予め決められた数だけビットシフトさせることにより別の整数値に変換するといった手段が考えられる。データ型を変更しないことで、既存のリモートデバッグ向けインタフェースをそのまま利用できるという利点がある。このように暗号化の手段は特に限定しないが、暗号化されたデバッグ情報は元の格納場所に格納される。例えばJavaのLocalVariableTable属性の値を暗号化した場合、暗号化後の値もLocalVariableTable属性に格納される。
【００３５】
図４に、プログラムのデバッグ情報を記録した圧縮ファイルJAR (JavaARchive)の、暗号化の前（ａ）、及び、後（ｂ）の例を示す。この例では、デバッグ情報の<Attribute>, line number＝１７, var name＝readable が、<Attribute>, line number＝XXXX, var name ＝XXXXに変換されている。クラスファイルのデバッグ情報は暗号化されるものの、暗号化後もデバッグ情報がバイナリに含まれる。
【００３６】
ステップ３０８は、ステップ３０２で取得したコード情報と別のコード情報がプログラムに含まれているかどうかを判定するステップである。別のコード情報が存在する場合はステップ３０２に進み、存在しない場合は処理を終了する。処理を終了する場合、変換元のプログラムがアーカイブファイルであった場合は同様にアーカイブファイルとして出力するのが一般的である。こうして変換したプログラムがデバッグ対象プログラム２０７として本発明におけるリモートデバッグの対象となる。
【００３７】
なお、図３に記載のプログラム難読化処理は、専用ツールを用いてプログラム開発者が行うことを想定しているが、一般的に考えられる手段であれば、難読化方法および難読化のタイミングについては限定しない。例えば、デバッグ対象プログラムのインストール時にプログラム配信システムが自動で難読化する手段も考えられる。
【００３８】
図５は、保守センタ装置２０１とデバッグ対象装置２０２における、リモートデバッグ処理のシーケンスの一例を示す図である。  
デバッグ開始処理４０１は、サービス管理者によってリモートデバッガ２０４が起動され、デバッグ対象プログラム２０７のデバッグ処理が開始されるシーケンスを表す。例えばEclipseなどの一般的な統合開発環境を起動し、デバッグ対象装置２０２上で動作するJavaプログラムのリモートデバッグを開始する手順がこれに該当する。
【００３９】
デバッグ情報取得要求４０２は、リモートデバッガ２０４のデバッグ要求処理部２０５が、ユーザリストの情報に基づき、ネットワーク２０３を介し、プログラム実行環境２０８のデバッグ応答処理部２０９に対し、デバッグ情報の取得要求メッセージを送信するシーケンスである。これは例えばJava標準デバッガであるJDBがネットワークを介してJava仮想マシンのJVMTI（Java Virtual Machine Tool Interface）と呼ばれるデバッグ向けインタフェースに対してメッセージを送信する処理に該当する。
【００４０】
デバッグ情報取得処理４０３は、デバッグ応答処理部２０９が受信したメッセージの種類に応じてデバッグ対象プログラム２０７から暗号化されたデバッグ情報を取得するシーケンスである。例えば一般的なJava仮想マシンでは、リモートからのデバッグ情報取得要求を受信してJVMTIを通じてデバッグ情報を取得する機能が提供されており、本シーケンスはこの処理に該当する。
【００４１】
デバッグ情報取得応答４０４は、デバッグ情報取得要求４０２に対する応答メッセージを送信するシーケンスである。本シーケンスでは、デバッグ情報取得処理４０３のシーケンスで取得した暗号化されたデバッグ情報をリモートデバッガ２０４のデバッグ要求処理部２０５に返信する。暗号化されたデバッグ情報はここでは復号化せず、そのまま返信する。
【００４２】
デバッグ情報復号化処理４０５は、デバッグ情報取得応答４０４で返信された、暗号化されたデバッグ情報を、リモートデバッガ２０４のデバッグ情報復号処理部２０６が復号化するシーケンスである。本シーケンスは一般的なJavaデバッガが備える機能にはなく、独自に拡張が必要な部分である。デバッグ情報復号処理部２０６は、図３のステップ３０７で暗号化されたデバッグ情報の暗号化方式およびその秘密鍵を知っていることが前提となる。図３の処理を行う難読化手段（難読化ツール）と、デバッグ情報復号処理部２０６が秘密鍵を共有する手段については特に限定しない。例えば、ユーザにパスワード入力を求めることにより秘密鍵を共有する手段や、外部記憶装置１０４に格納される秘密鍵データを予め設定ファイル等により共有する手段などが一般的に考えられる。
【００４３】
デバッグ処理要求４０６は、一般的なデバッグ処理要求をプログラム実行環境２０８のデバッグ応答処理部２０９に送信するシーケンスである。これは例えばJava標準デバッガであるJDBを利用し、ブレークポイントを設定するといった一般的なデバッグ要求を表す。デバッグ処理応答４０７はその応答メッセージである。
【００４４】
このようにして、通常時は難読化されたクラスファイルのコード情報を用いて各デバッグ対象装置２０２でプログラムロジックを実行する。そして、デバッグ対象装置２０２のプログラムに誤動作が発生した時には、暗号化されたデバッグ情報を用いてそのデバッグ対象装置２０２のプログラムに対してリモートデバッグを行うことができる。
【００４５】
図５では、保守センタ装置２０１からデバッグ対象装置２０２へのメッセージのみを記載しているが、非同期でデバッグ対象装置２０２から保守センタ装置２０１へメッセージが送信されることも考えられる。例えばJVMTIが発行するBreakpointイベントなどの送信が考えられる。
【００４６】
なお、図５は最も単純なシーケンスについて記載したものであり、メッセージの処理順序や回数、送受信の方向について限定するものではない。デバッグ情報復号化処理４０５を除き、標準のJavaのリモートデバッグシステムに準じた動作を想定したものである。
【００４７】
図３に示す難読化方法により難読化されたプログラムを利用し、図５に示すようなシーケンスを繰り返すことにより、本発明が対象とする課題を解決したリモートデバッグシステムを実現できる。すなわち、本実施例によれば、デバッグ対象のプログラムをリバースエンジニアリングから保護すると同時に、プログラムのリモートデバッグを可能にする。デバッグ対象プログラムのコード情報は暗号化しないため、プログラム実行時の復号処理によるパフォーマンスの劣化は起こらない。また、暗号化したデバッグ情報は実機上では復号化しないことから、実機における秘密鍵の管理は不要であり、かつ復号処理コードの保護も不要である。また、実機上ではコード情報の難読化、デバッグ情報の暗号化および復号化のいずれの処理も発生しないことから、プログラム実行環境のロジック改変は不要である。
【実施例２】
【００４８】
本実施例では、既存のリモートデバッガをそのまま利用可能なリモートデバッグシステムの例を説明する。本実施例のリモートデバッグシステムは、実施例１と同様の、ネットワークを介したデバッグ処理が可能なデバッガ、及びネットワークを介したデバッグ処理が可能なプログラム実行環境を備えている。さらに、ネットワークを介して送信されたデバッグ要求を別の装置にネットワークを介して転送可能なプロキシサーバであって、難読化装置で難読化されたプログラムの暗号化されたデバッグ情報を復号可能な、プロキシサーバを備えている。
【００４９】
図６は、実施例２におけるソフトウェア構成を示す。  
中継装置５０１はプロキシサーバにより構成され、保守センタ装置２０１とネットワーク２０３を介して接続している。また、中継装置５０１は、デバッグ対象装置２０２とネットワーク２０３を介して接続している。各機器間を繋ぐネットワーク２０３は同一ネットワークであってもよく、別のネットワークであってもよい。また、保守センタ装置２０１、中継装置５０１、デバッグ対象装置２０２は同一マシン上に存在していてもよく、その場合、ネットワーク２０３は論理的な通信パイプを表す。
【００５０】
リモートデバッグプロキシ５０２は、中継装置５０１上で動作し、デバッグメッセージ転送部５０３およびデバッグ情報復号処理部２０６により構成される。デバッグメッセージ転送部５０３は、デバッグ要求処理部２０５から受信したメッセージをそのままデバッグ応答処理部２０９に転送する処理を行う。また、デバッグメッセージ転送部５０３は、デバッグ応答処理部から受信したメッセージの種類を識別し、暗号化されたデバッグ情報であればデバッグ情報復号処理部２０６を用いてデバッグ情報を復号化してデバッグ要求処理部２０５に復号化したメッセージを送信し、それ以外の場合はそのままメッセージをデバッグ要求処理部２０５に送信する。
【００５１】
保守センタ装置２０１の構成は実施例１記載の構成と同様であるが、唯一異なる点はデバッグ情報復号処理部２０６を備えない点である。デバッグ情報復号処理部２０６が行っていた処理を中継装置５０１に委譲することで、既存のリモートデバッガをそのまま利用することが可能となる。
【００５２】
デバッグ対象装置２０２の構成は、実施例１と同じである。実施例１と異なる点は、接続元装置が保守センタ装置２０１ではなく、中継装置５０１であるという点のみである。
【００５３】
図７は、実施例２におけるリモートデバッグ処理のシーケンスを表す。デバッグ開始処理４０１は実施例１記載の処理内容と同一であるが、リモートデバッガ２０４の接続先が中継装置５０１であるという点でのみ異なる。
【００５４】
中継装置５０１に送信されたデバッグ情報取得要求４０２は、そのままデバッグ対象装置２０２に転送される。デバッグ対象装置２０２は実施例１記載と同じデバッグ情報取得処理４０３を行い、実施例１記載と同じデバッグ情報取得応答４０４を中継装置５０１に返す。中継装置５０１はデバッグ情報取得応答４０４により受信した暗号化されたデバッグ情報を実施例１記載と同じデバッグ情報復号処理４０５により復号化し、復号化したデバッグ情報を用いてデバッグ情報取得応答４０４を保守センタ装置２０１に返す。このように、暗号化されたデバッグ情報を中継装置５０１が復号化することにより、保守センタ装置２０１上で既存のリモートデバッガ２０４を利用できる。既存のリモートデバッガ２０４とは、例えばJava標準のJDBや、リモートデバッグ機能を有するEclipse等の統合開発環境である。
【００５５】
デバッグ処理要求４０６およびデバッグ処理応答４０７は、中継装置５０１がそのメッセージを中継するという点でのみ異なっており、処理内容は実施例１記載と同じである。
【００５６】
図７は最も単純なシーケンスについて記載したものであり、メッセージの処理順序や回数、送受信の方向について限定するものではない。中継装置５０１を介してメッセージを送受信する点を除き、標準のJavaのリモートデバッグシステムに準じた動作を想定したものである。
【００５７】
図３に示す難読化方法により難読化されたプログラムを利用し、図７に示すようなシーケンスを繰り返すことにより、本発明が対象とする課題を解決し、かつ既存のリモートデバッガを利用可能なリモートデバッグシステムを実現できる。すなわち、実施例２によれば、実施例１の効果に加えて、さらに、保守センタ側に復号処理を行う専用のプロキシサーバを用いることで、既存のデバッガをそのまま利用できる、という効果がある。
【実施例３】
【００５８】
実施例３は、本発明を自動車のナビケーションシステムに適用した例を示すものである。実施例２と異なり、保守センタ装置１００がプロキシサーバを備えている。このナビケーションシステムには、専用ＪａｖａＶＭがインストールされており、Javaプログラムの実行時にはＪａｖａＶＭが起動され、同じＪａｖａプログラムを共通に開発し、実行可能な環境にある。実機１０５ｍは、デバッグ処理が可能なプログラム実行環境として、車載のＣＰＵにJava仮想マシンを搭載し、アプリケーションとしてカーナビケーションシステムを備えている。保守センタ装置１００と実機１０５ｍは、無線通信によるネットワークで接続されている。実機１０５ｍのデバッグ情報の取得にはJava標準ＡＰＩ（JVMTI）を利用する。デバッグ情報は、実機１０５ｍでは復号化せず、保守センタ装置１００のデバッガで復号化する。保守センタ装置１００側には復号処理を行う復号プロシキを備えることで、Java標準のデバッガ（JDB）を利用することができる。
【００５９】
保守センタ装置１００は、難読化装置で難読化されたデバッグ対象プログラムの暗号化されたデバッグ情報を復号可能で、かつ、ネットワークを介したデバッグ処理が可能なプログラム実行環境を有する。保守センタ装置１００が、難読化されたプログラムのデバッグ情報を取得するためのデバッグ要求をカーナビケーションシステム１０５ｍのプログラム実行環境に送信し、このデバッグ要求を受けたプログラム実行環境は、難読化されたプログラムからデバッグ要求の求める暗号化されたデバッグ情報を取得し、暗号化されたデバッグ情報を保守センタ装置１００に返信する。保守センタ装置１００は、プログラム実行環境から受信した暗号化されたデバッグ情報を復号化する。
【００６０】
このようにして、リバースエンジニアリングからカーナビケーションシステムのプログラムを保護すると同時に、パフォーマンスを劣化させることなく、JDB対応の既存ツールでカーナビケーションシステムのリモートデバッグを行うことができる。
【００６１】
また、本発明のリモートデバッグシステムを、Java仮想マシンを搭載した各家庭内のパソコン、ディジタル家電、電話機など各種の端末機器間をホームネットワークで繋いだ、ホーム・ゲートウエイに適用することもできる。このホーム・ゲートウエイには、専用ＪａｖａＶＭがインストールされており、Javaプログラムの実行時にはＪａｖａＶＭが起動され、同じＪａｖａプログラムを共通に開発し、実行可能な環境にある。本発明を適用することで、リバースエンジニアリングから各家庭内のホーム・ゲートウエイを構成するJava仮想マシン搭載機器のデバッグ対象プログラムを保護すると同時に、パフォーマンスを劣化させることなく各機器のリモートデバッグを可能にすることができる。
【００６２】
あるいはまた本発明のリモートデバッグシステムを、電力の流れを供給側・需要側の両方から制御し、需要家と供給側との双方から電力のやりとりができるようにして最適化できる送電網を構築する、スマートグリッドに適用することもできる。このスマートグリッドシステムには、Java仮想マシンを搭載した専用の機器やソフトウェアが、送電網の一部に組み込まれている。本発明を適用することで、スマートグリッドの欠点であるセキュリティの脆弱性の克服に効果がある。例えば、リバースエンジニアリングから需要家のスマートグリッドシステムを構成するJava仮想マシン搭載機器のデバッグ対象プログラムを保護すると同時に、パフォーマンスを劣化させることなく各機器のリモートデバッグを可能にすることができる。
【符号の説明】
【００６３】
１００  保守センタ
１０１  演算装置
１０２  主記憶装置
１０３  通信装置
１０４  外部記憶装置
１０５  ユーザの端末機器
１０６  ネットワーク
１０７  プログラム開発者提供の難読化装置
２０１  保守センタ装置
２０２  デバッグ対象装置
２０３  ネットワーク
２０４  リモートデバッガ
２０５  デバッグ要求処理部
２０６  デバッグ情報復号処理部
２０７  デバッグ対象プログラム
２０８  プログラム実行環境
２０９  デバッグ応答処理部
３００  難読化処理
３０１  プログラム読み込み
３０２  コード情報取得
３０３  コード情報難読化
３０４  デバッグ情報有
３０５  デバッグ情報取得
３０６  デバッグ情報編集
３０７  デバッグ情報暗号化
３０８  コード情報有
４０１  デバッグ開始処理
４０２  デバッグ情報取得要求
４０３  デバッグ情報取得処理
４０４  デバッグ情報取得応答
４０５  デバッグ情報復号化処理
４０６  デバッグ処理要求
４０７  デバッグ処理応答
５０１  中継装置
５０２  リモートデバッグプロキシ
５０３  デバッグメッセージ転送部。
【図１】
2013045277.tif 000003
【図２】
2013045277.tif 000004
【図３】
2013045277.tif 000005
【図４】
2013045277.tif 000006
【図５】
2013045277.tif 000007
【図６】
2013045277.tif 000008
【図７】
2013045277.tif 000009
【図８】
2013045277.tif 000010