説明

プログラム難読化方法およびリモートデバッグシステム

【課題】リバースエンジニアリングからデバッグ対象プログラムを保護すると同時に、パフォーマンスを劣化させることなくリモートデバッグを可能にする。
【解決手段】デバッグ対象プログラムの内、プログラムロジックを表す情報と、デバッグ時に必要な情報をそれぞれ別方式で変換する。プログラムロジックを表す情報は既存の難読化方式を用いて難読化し、デバッグ時に必要な情報は既存の暗号化方式を用いて暗号化する。別方式で変換されたプログラムを用いてプログラムロジックを実行し、誤動作発生時は暗号化されたデバッグ情報を用いてリモートデバッグを行う。暗号化されたデバッグ情報は、デバッグを行う保守センタ側で復号化する。

【発明の詳細な説明】
【技術分野】
【0001】
本発明は、プログラム難読化方法およびリモートデバッグシステムに係り、特に、デバッグ対象のソフトウェアプログラム(以下、デバッグ対象プログラム)をリバースエンジニアリングから保護するための技術、およびデバッグ対象プログラムを遠隔からデバッグするための技術に関する。
【背景技術】
【0002】
近年、仮想マシン(Virtual Machine)を搭載した機器の普及が進んでいる。仮想マシンでは、Pentium(登録商標)、PowerPC等のCPUがプログラムを直接実行するのでなく、仮想的な計算機をソフトウェア的に用意し、プログラムがそれによって実行されるようにする。
【0003】
例えば、Java仮想マシン(JavaはJavaTMの略称であり、Oracle Corporation及びその子会社、関連会社の米国及びその他の国における登録商標である)を搭載した機器の普及が進んでいる。Java仮想マシンはCPUやOSの違いを吸収し、中間コードで構成されるJavaプログラムを様々な機器で実行可能にする。多様な機器が存在する携帯電話の多くはJava仮想マシンを搭載し、近年登場したAndroid(AndroidはAndroidTMの略称であり、米国Google社の商標または登録商標である)もJavaの技術を採用している。また、Javaプログラムを機器に配信し、実行開始や実行停止といったプログラムのライフサイクルを管理するための基盤としてOSGi(OSGiはOSGiTMの略称であり、また、米国OSGi Allianceの登録商標である)と呼ばれる技術が注目されている。こうしたAndroidやOSGiといった実行基盤を利用し、様々な機器で動作するプログラムの配信・販売を複数のソフトウェアベンダが開始しつつある。
【0004】
一方、様々なベンダが開発した様々なJavaプログラムをAndroidやOSGi搭載機器にインストールし、同時実行させることにより、プログラムの障害発生要因が複雑化している。CPUリソース、メモリリソースの競合、ストレージ容量、画面表示領域の競合など、その要因は多岐に渡る。プログラム開発者は他にどのようなプログラムが同時実行されるかを事前に予測することができないため、リソース競合に起因するプログラムの誤動作を事前テストによって検査することは困難である。また、プログラムの配布後に誤動作を検出した際も、誤動作発生環境を再現するには他ベンダの開発したプログラムを全て入手しなければならないため、再現環境における事後テストも困難な状況にある。そこで、誤動作が発生した実機環境を用いた遠隔からのプログラムデバッグ(以下、リモートデバッグ)を可能にする技術が求められる。Oracle社が提供するJava標準のデバッガであるJDBは、そのためのリモートデバッグ機能を備えている。
【0005】
しかし、JDB等のデバッガを用いたリモートデバッグを可能にするためには、デバッグに利用される情報(以下、デバッグ情報)をJavaプログラムファイル(以下、クラスファイル)内に含めなければならない。このデバッグ情報の中にはソースコードの行番号やローカル変数名などが格納されるため、悪意のあるユーザがプログラムを解析し、セキュリティ機能を解除するといった、いわゆる「リバースエンジニアリング」が容易になるという課題がある。元々、Javaプログラムはバイトコードと呼ばれる中間コードで構成されており、また、シンボル参照解決による動的リンクを前提としているため、リバースエンジニアリングに弱いという特徴を持つ。これに加え、Javaプログラムにデバッグ情報を含めることにより、悪意のあるユーザはほぼ完全なソースコードを再構築(デコンパイル)できてしまう。代表的なデコンパイルツールとして、JADやJODE、SourceAgainなどが知られている。
【0006】
こうしたリバースエンジニアリングを防ぐ技術として、プログラムの難読化技術がある。例えば特許文献1には、難読化前と同じ演算結果が得られるようなダミーコードを生成し、プログラムを難読化する方法が記載されている。また、特許文献2には、プログラムに暗号化を施し、プログラムの実行前に復号化する方法が記載されている。また、特許文献3には、ソースコードに含まれる連続した命令をブロック単位に切り出し、切り出したブロックの実行順序を制御するための制御変数を設定する難読化方法が記載されている。代表的なプログラム難読化ツールとして、DashOやProGuard、ZelixKlassMasterなどが知られている。Android向けの開発環境には、ProGuardが標準で組み込まれている。
【先行技術文献】
【特許文献】
【0007】
【特許文献1】特開2011−018119号公報
【特許文献2】特開2009−075720号公報
【特許文献3】特開2008−090668号公報
【発明の概要】
【発明が解決しようとする課題】
【0008】
仮想マシンを搭載した機器のリバースエンジニアリングからデバッグ対象プログラムを保護するために、特許文献1および特許文献3記載のように、プログラム全体を難読化する方法では、デバッグ対象プログラムからデバッグ情報が削除されるか、またはデバッグ情報が無意味な情報となるため、リモートデバッグが不可能になるという課題がある。
【0009】
また、リバースエンジニアリングからデバッグ対象プログラムを保護するために、特許文献2記載のようにプログラム全体を暗号化した場合、暗号化に利用した秘密鍵の管理や、復号処理コード自体の保護が必要になるという課題がある。さらに、暗号化されたプログラムを復号化しながら実行する場合は、パフォーマンスが劣化するという課題がある。
【0010】
このような従来技術の課題を解決し、リバースエンジニアリングからデバッグ対象プログラムを保護すると同時に、パフォーマンスを劣化させることなくリモートデバッグを可能にすることが本発明の目的である。
【課題を解決するための手段】
【0011】
本発明の代表的なものの一例を示すと、次のとおりである。本発明のプログラム難読化方法は、デバッグ対象装置で実行するためのデバッグ対象プログラムを、プログラム難読化処理手段を備えた難読化装置において難読化する方法であって、前記デバッグ対象プログラムは、プログラムロジックを表すコード情報と、デバッグに必要な情報を表すデバッグ情報とを含んで構成され、前記プログラム難読化処理手段により、前記デバッグ対象プログラムの前記プログラムロジックを変更することなく、前記コード情報を、リバースエンジニアリングが困難な情報へと難読化し、前記デバッグ情報を、リバースエンジニアリングが不可能な情報へと暗号化することにより、前記デバッグ対象プログラムを難読化することを特徴とする。
【発明の効果】
【0012】
本発明によれば、デバッグ対象プログラムをリバースエンジニアリングから保護すると同時に、デバッグ対象プログラムのリモートデバッグを可能にする。
【図面の簡単な説明】
【0013】
【図1】本発明の実施例1のシステム構成例の図。
【図2】実施例1の、リモートデバッグに関係するソフトウェア構成例の図。
【図3】実施例1の、難読化手順の一例を表すフローチャート。
【図4】図3の難読化手順における、プログラムのデバッグ情報の暗号化の前後の例を示す図。
【図5】実施例1のリモートデバッグ手順を表すシーケンス図。
【図6】本発明の実施例2の、リモートデバッグに関係するソフトウェア構成例の図。
【図7】実施例2の、リモートデバッグ手順の一例を表すシーケンス図。
【図8】本発明の実施例3の、ハードウェア及びソフトウェアの構成例を示す図。
【発明を実施するための形態】
【0014】
本発明の代表的な実施形態によれば、難読化装置において、仮想マシンを実行するデバッグ対象プログラムを難読化する。この難読化において、プログラムロジックを構成するJavaバイトコード等の情報(以下、コード情報)とデバッグ情報をそれぞれ別方式で変換する。コード情報は既存の難読化方式を用いて難読化し、デバッグ情報は既存の暗号化方式を用いて暗号化する。変換したコード情報およびデバッグ情報は従来のクラスファイルフォーマットと同一のフォーマットで、プログラムを実行する実機上のクラスファイル内に格納する。実機は、通常時は難読化されたコード情報を用いてプログラムロジックを実行し、誤動作発生時は、実機とは異なるデバッグ処理装置(保守センタ)が、暗号化されたデバッグ情報を用いてリモートデバッグを行う。暗号化されたデバッグ情報は実機上では復号化せず、デバッグを行うデバッグ処理装置側で復号化する。
【0015】
本実施形態を用いることにより、デバッグ対象装置のプログラムをリバースエンジニアリングから保護すると同時に、該プログラムのリモートデバッグを可能にする。プログラムのコード情報は暗号化しないため、デバッグ処理装置におけるプログラム実行時の復号処理によるパフォーマンスの劣化は起こらない。また、暗号化したデバッグ情報は実機上では復号化しないことから、実機における秘密鍵の管理は不要であり、かつ復号処理コードの保護も不要である。また、実機上ではコード情報の難読化、デバッグ情報の暗号化および復号化のいずれの処理も発生しないことから、プログラム実行環境のロジック改変は不要である。
さらに、本発明の他の実施形態によれば、デバッグ処理装置(保守センタ)側に復号処理を行う専用のプロキシサーバを用いることで、既存のデバッガをそのまま利用できる。
【0016】
以下、本発明の実施例を、図面を用いて詳細に説明する。
【実施例1】
【0017】
図1は、本発明の実施例1になるリモートデバッグシステムの構成例を表す図である。リモートデバッグシステムは、1つの保守センタ(デバッグ処理装置)100と、ネットワーク106を介してこの保守センタ100に接続され各々デバッグ対象装置を具備する複 数のユーザの端末機器すなわち複数の実機105(105A〜105n)と、ネットワーク106に接続されたプログラム開発者提供の難読化装置107とで構成されている。なお、保守センタ100、各ユーザの端末機器105及びプログラム開発者提供の難読化装置107は、各々、コンピュータと、これらのコンピュータに各種の機能・手段を実現させるプログラムとを保有している。保守センタ100、ユーザの端末機器105、及び、難読化装置107は、記憶部にアプリケーションプログラム及びこのアプリケーションプログラムを実行可能なように処理する仮想マシンを記憶し、処理部が前記仮想マシンを実行するプログラム実行装置である。例えば、このリモートデバッグシステムを構成する各機器には、予め、専用のJava仮想マシン(JavaVM)がインストールされており、Javaプログラムの実行時にはJavaVMが起動され、同じJavaプログラムを共通に開発し、実行可能な環境にある。
【0018】
コンピュータは、例えば、演算装置101、記憶部(主記憶装置102、外部記憶装置104)、及び、通信装置103を備えている。演算装置101は、主記憶装置102にロードされた命令を処理する中央演算装置である。主記憶装置102は、外部記憶装置104からロードされたプログラムデータを記憶する揮発メモリまたは不揮発メモリである。通信装置103は、外部のネットワーク106と接続し、ハードウェア上で動作するプログラムが必要とするデータを送受信するための装置である。外部記憶装置104は、プログラムデータを記憶する不揮発メモリである。ここで、外部記憶装置104は、ネットワークを経由した別のマシン上に存在する構成であってもよい。
【0019】
保守センタ100は、コンピュータ上で主記憶装置102に保持されたアプリケーションプログラムを実行することにより実現される機能・手段として、各実機のデバッグ情報の取得手段、及び、デバッグ情報の復号・処理手段を有している。さらに、この保守センタ100に接続された各端末機器のデバッグ対象のプログラムとそのプログラムを特定するID及びデバッグに関する情報を記録したユーザリスト(デバッグ対象プログラムテーブル)とを保持している。各端末機器105は、デバッグ対象プログラムを保持すると共に、コンピュータ上でアプリケーションプログラムを実行することにより実現される機能として、デバッグ対象プログラムの実行手段及び暗号化デバッグ情報の応答処理手段を保持している。プログラム開発者提供の難読化装置107は、デバッグ対象プログラムに対して難読化・暗号化の処理を行う、プログラム難読化処理手段を保有している。
【0020】
Java言語のソースファイルがJava言語用のコンパイラで変換されて、実行用のクラスファイルに変換される。ソースファイルのソースコードは、クラスファイルのバイトコードに変換される。各端末機器105でクラスファイルが実行されるときは、JavaVMが起動され、JavaVMがクラスファイルのバイトコードを読み取って、機械語に翻訳を行いながら、処理を実行する。保守センタ装置201及びデバッグ対象装置202は、デバッグに利用されるソースコードの行番号やローカル変数名などのデバッグ情報をクラスファイル内に保持している。
【0021】
本発明において述べる機器は、一般的に、図1に記載のハードウェア構成をとるが、この構成に限定するものではない。
【0022】
図2は、実施例1のリモートデバッグシステムにおける、保守センタ装置201とデバッグ対象装置202におけるソフトウェア構成例を表すものである。図2において、保守センタ装置201は、ユーザのデバッグ対象装置202に対して、実際にリモートデバッグ処理を行う個人または集団(以下、仮にサービス管理者と呼ぶ)が利用する装置である。サービス管理者はリモートデバッガ204を用いてデバッグ対象装置202のプログラムのデバッグ処理を行う。リモートデバッガ204は、サービス管理者にデバッグ処理のためのユーザインタフェースを提供するデバッグ要求処理部205と、暗号化されたデバッグ情報を復号化するデバッグ情報復号処理部206、及びユーザリスト(図示略)により構成される。
【0023】
デバッグ対象装置202は、リモートデバッグの対象となるデバッグ対象プログラム207を実行する装置である。デバッグ対象装置202では、デバッグ対象プログラム207の実行環境であるプログラム実行環境208が動作する。プログラム実行環境208のデバッグ応答処理部209は、保守センタ装置201のデバッグ要求処理部205から送信されるデバッグ要求メッセージを受信し、当該メッセージの種類に応じてデバッグ対象プログラム207のデバッグ処理を行い、その結果をデバッグ要求処理部205に返す。
【0024】
ネットワーク203は、保守センタ装置201とデバッグ対象装置202を繋ぐEthernet(登録商標)等の一般的なネットワークである。但し、保守センタ装置201とデバッグ対象装置202は同一のコンピュータシステム上で動作する装置(第1の機器)であっても良く、その場合、ネットワーク203は論理的な通信パイプを表す。あるいはまた、難読化装置と保守センタ装置とが同一のコンピュータシステム上で動作する装置(第2の機器)であっても良い。
【0025】
本発明において述べるリモートデバッグシステムは、一般的に図2記載のソフトウェア構成をとるが、この構成に限定するものではない。
【0026】
図3は、本発明におけるプログラム難読化処理のフローチャートである。このプログラム難読化処理300は、ここでは、難読化装置107において、Javaプログラムの開発者が専用ツールを用いて行うことを想定する。各端末機器105に保持されるデバッグ対象プログラムは、予め、このプログラム難読化処理300が施されたプログラムである。
【0027】
難読化処理300では、まず、ステップ301でデバッグ対象プログラム207として動作させるプログラムデータを読み込む。読み込む手段としては例えば外部記憶装置104から読み込む手段が考えられるが、一般的に考えられる別の手段を用いても良い。例えば通信装置103を用いてネットワーク上に存在するプログラムデータをダウンロードしても良い。プログラムデータの例として、例えばJavaのクラスファイルやアーカイブファイル(JARファイル)などが挙げられる。アーカイブファイルは、変換された複数のJavaバイトコード及びそれが使用する画像などのリソースを、一つに纏め圧縮したファイルである。
【0028】
ステップ302は、ステップ301で読み込んだプログラムデータのコード情報を取得するステップである。例えばJavaのクラスファイルではCode属性と呼ばれる部分に、プログラミング言語と機械言語の中間の形式で記述された、Java仮想マシンが理解できる、バイトコードが格納される。
【0029】
ステップ303は、ステップ302で取得したクラスファイルやアーカイブファイルのコード情報を難読化するステップである。難読化は、逆アセンブルや逆コンパイルされてもそのコードを無意味なものにし、出力されたソースコードの解析を意図的に分かり難くすることである。難読化手段の種類や構成に限定は無く、「オブファスケータ」と呼ばれる一般的な難読化ツールを用いることができる。代表的なオブファスケータとして、DashOやProGuardなどが挙げられるが、これらに限定するものではない。難読化後のコード情報は、難読化前のコード情報と同じロジックを表すが、人間にとっては解析が困難な情報となる。難読化前のプログラムデータと難読化後のプログラムデータに構造上の変更はない。
【0030】
図4に、プログラムのコード情報の難読化の前(a)、及び、後(b)の例を示す。この例では、難読化前のコード情報の文字列String title=”a”が、難読化後はString abcde = ”a”に変換されている。コード部分は難読化されるものの暗号化はしないので、プログラムデータに構造上の変更はない。
【0031】
ステップ304は、プログラムデータにステップ302で取得したコード情報に関連するデバッグ情報が存在するかどうかを判定するステップである。例えば、JavaではLineNumberTable属性と呼ばれる部分にソース行番号の情報が格納され、LocalVariableTable属性と呼ばれる部分にローカル変数名が格納される。ステップ304でデバッグ情報が存在すると判定されるとステップ305に進み、存在しないと判定されるとステップ308に進む。ここで、デバッグ情報が存在しないと判定されたプログラムコードはリモートデバッグの対象にはならないが、デバッグ情報を含むコードと含まないコードが一つのプログラムデータ内に混在する可能性は考えられる。
【0032】
ステップ305は、ステップ304でデバッグ情報が存在すると判定された場合に遷移するステップであり、プログラムデータからデバッグ情報を取得する処理を行う。デバッグ情報の格納場所は、Javaにおいては前述の通りクラスファイル内のLineNumberTable属性やLocalVariableTable属性などであるが、これに限定するものではない。例えばデバッグ情報を別のファイルに出力するコンパイラなどが考えられるが、デバッグ情報の種類や格納場所については限定しない。
【0033】
ステップ306は、ステップ305で取得したクラスファイルのデバッグ情報を、ステップ303で難読化したコード情報に対応付ける形式に編集するステップである。例えば、ステップ303で複数の無意味なダミーコードを生成した場合、これらのダミーコード全体に同じソース行番号を対応付けるといった処理が考えられる。この対応付け手段は複数考えられるが、正常なリモートデバッグ処理が可能であればよく、特定の手段に限定するものではない。
【0034】
ステップ307は、ステップ305で取得し、ステップ306で編集したデバッグ情報を暗号化するステップである。暗号化の手段としては、3DES等を利用した一般的な秘密鍵暗号方式であっても、RSA等を利用した一般的な公開鍵暗号方式であっても、それらを組み合わせた一般的な暗号方式であってもよい。また、元のデバッグ情報のデータ型と同一のデータ型に変換する独自の暗号化方式を利用することも考えられる。例えばソース行番号を表す整数値を、予め決められた数だけビットシフトさせることにより別の整数値に変換するといった手段が考えられる。データ型を変更しないことで、既存のリモートデバッグ向けインタフェースをそのまま利用できるという利点がある。このように暗号化の手段は特に限定しないが、暗号化されたデバッグ情報は元の格納場所に格納される。例えばJavaのLocalVariableTable属性の値を暗号化した場合、暗号化後の値もLocalVariableTable属性に格納される。
【0035】
図4に、プログラムのデバッグ情報を記録した圧縮ファイルJAR (JavaARchive)の、暗号化の前(a)、及び、後(b)の例を示す。この例では、デバッグ情報の<Attribute>, line number=17, var name=readable が、<Attribute>, line number=XXXX, var name =XXXXに変換されている。クラスファイルのデバッグ情報は暗号化されるものの、暗号化後もデバッグ情報がバイナリに含まれる。
【0036】
ステップ308は、ステップ302で取得したコード情報と別のコード情報がプログラムに含まれているかどうかを判定するステップである。別のコード情報が存在する場合はステップ302に進み、存在しない場合は処理を終了する。処理を終了する場合、変換元のプログラムがアーカイブファイルであった場合は同様にアーカイブファイルとして出力するのが一般的である。こうして変換したプログラムがデバッグ対象プログラム207として本発明におけるリモートデバッグの対象となる。
【0037】
なお、図3に記載のプログラム難読化処理は、専用ツールを用いてプログラム開発者が行うことを想定しているが、一般的に考えられる手段であれば、難読化方法および難読化のタイミングについては限定しない。例えば、デバッグ対象プログラムのインストール時にプログラム配信システムが自動で難読化する手段も考えられる。
【0038】
図5は、保守センタ装置201とデバッグ対象装置202における、リモートデバッグ処理のシーケンスの一例を示す図である。
デバッグ開始処理401は、サービス管理者によってリモートデバッガ204が起動され、デバッグ対象プログラム207のデバッグ処理が開始されるシーケンスを表す。例えばEclipseなどの一般的な統合開発環境を起動し、デバッグ対象装置202上で動作するJavaプログラムのリモートデバッグを開始する手順がこれに該当する。
【0039】
デバッグ情報取得要求402は、リモートデバッガ204のデバッグ要求処理部205が、ユーザリストの情報に基づき、ネットワーク203を介し、プログラム実行環境208のデバッグ応答処理部209に対し、デバッグ情報の取得要求メッセージを送信するシーケンスである。これは例えばJava標準デバッガであるJDBがネットワークを介してJava仮想マシンのJVMTI(Java Virtual Machine Tool Interface)と呼ばれるデバッグ向けインタフェースに対してメッセージを送信する処理に該当する。
【0040】
デバッグ情報取得処理403は、デバッグ応答処理部209が受信したメッセージの種類に応じてデバッグ対象プログラム207から暗号化されたデバッグ情報を取得するシーケンスである。例えば一般的なJava仮想マシンでは、リモートからのデバッグ情報取得要求を受信してJVMTIを通じてデバッグ情報を取得する機能が提供されており、本シーケンスはこの処理に該当する。
【0041】
デバッグ情報取得応答404は、デバッグ情報取得要求402に対する応答メッセージを送信するシーケンスである。本シーケンスでは、デバッグ情報取得処理403のシーケンスで取得した暗号化されたデバッグ情報をリモートデバッガ204のデバッグ要求処理部205に返信する。暗号化されたデバッグ情報はここでは復号化せず、そのまま返信する。
【0042】
デバッグ情報復号化処理405は、デバッグ情報取得応答404で返信された、暗号化されたデバッグ情報を、リモートデバッガ204のデバッグ情報復号処理部206が復号化するシーケンスである。本シーケンスは一般的なJavaデバッガが備える機能にはなく、独自に拡張が必要な部分である。デバッグ情報復号処理部206は、図3のステップ307で暗号化されたデバッグ情報の暗号化方式およびその秘密鍵を知っていることが前提となる。図3の処理を行う難読化手段(難読化ツール)と、デバッグ情報復号処理部206が秘密鍵を共有する手段については特に限定しない。例えば、ユーザにパスワード入力を求めることにより秘密鍵を共有する手段や、外部記憶装置104に格納される秘密鍵データを予め設定ファイル等により共有する手段などが一般的に考えられる。
【0043】
デバッグ処理要求406は、一般的なデバッグ処理要求をプログラム実行環境208のデバッグ応答処理部209に送信するシーケンスである。これは例えばJava標準デバッガであるJDBを利用し、ブレークポイントを設定するといった一般的なデバッグ要求を表す。デバッグ処理応答407はその応答メッセージである。
【0044】
このようにして、通常時は難読化されたクラスファイルのコード情報を用いて各デバッグ対象装置202でプログラムロジックを実行する。そして、デバッグ対象装置202のプログラムに誤動作が発生した時には、暗号化されたデバッグ情報を用いてそのデバッグ対象装置202のプログラムに対してリモートデバッグを行うことができる。
【0045】
図5では、保守センタ装置201からデバッグ対象装置202へのメッセージのみを記載しているが、非同期でデバッグ対象装置202から保守センタ装置201へメッセージが送信されることも考えられる。例えばJVMTIが発行するBreakpointイベントなどの送信が考えられる。
【0046】
なお、図5は最も単純なシーケンスについて記載したものであり、メッセージの処理順序や回数、送受信の方向について限定するものではない。デバッグ情報復号化処理405を除き、標準のJavaのリモートデバッグシステムに準じた動作を想定したものである。
【0047】
図3に示す難読化方法により難読化されたプログラムを利用し、図5に示すようなシーケンスを繰り返すことにより、本発明が対象とする課題を解決したリモートデバッグシステムを実現できる。すなわち、本実施例によれば、デバッグ対象のプログラムをリバースエンジニアリングから保護すると同時に、プログラムのリモートデバッグを可能にする。デバッグ対象プログラムのコード情報は暗号化しないため、プログラム実行時の復号処理によるパフォーマンスの劣化は起こらない。また、暗号化したデバッグ情報は実機上では復号化しないことから、実機における秘密鍵の管理は不要であり、かつ復号処理コードの保護も不要である。また、実機上ではコード情報の難読化、デバッグ情報の暗号化および復号化のいずれの処理も発生しないことから、プログラム実行環境のロジック改変は不要である。
【実施例2】
【0048】
本実施例では、既存のリモートデバッガをそのまま利用可能なリモートデバッグシステムの例を説明する。本実施例のリモートデバッグシステムは、実施例1と同様の、ネットワークを介したデバッグ処理が可能なデバッガ、及びネットワークを介したデバッグ処理が可能なプログラム実行環境を備えている。さらに、ネットワークを介して送信されたデバッグ要求を別の装置にネットワークを介して転送可能なプロキシサーバであって、難読化装置で難読化されたプログラムの暗号化されたデバッグ情報を復号可能な、プロキシサーバを備えている。
【0049】
図6は、実施例2におけるソフトウェア構成を示す。
中継装置501はプロキシサーバにより構成され、保守センタ装置201とネットワーク203を介して接続している。また、中継装置501は、デバッグ対象装置202とネットワーク203を介して接続している。各機器間を繋ぐネットワーク203は同一ネットワークであってもよく、別のネットワークであってもよい。また、保守センタ装置201、中継装置501、デバッグ対象装置202は同一マシン上に存在していてもよく、その場合、ネットワーク203は論理的な通信パイプを表す。
【0050】
リモートデバッグプロキシ502は、中継装置501上で動作し、デバッグメッセージ転送部503およびデバッグ情報復号処理部206により構成される。デバッグメッセージ転送部503は、デバッグ要求処理部205から受信したメッセージをそのままデバッグ応答処理部209に転送する処理を行う。また、デバッグメッセージ転送部503は、デバッグ応答処理部から受信したメッセージの種類を識別し、暗号化されたデバッグ情報であればデバッグ情報復号処理部206を用いてデバッグ情報を復号化してデバッグ要求処理部205に復号化したメッセージを送信し、それ以外の場合はそのままメッセージをデバッグ要求処理部205に送信する。
【0051】
保守センタ装置201の構成は実施例1記載の構成と同様であるが、唯一異なる点はデバッグ情報復号処理部206を備えない点である。デバッグ情報復号処理部206が行っていた処理を中継装置501に委譲することで、既存のリモートデバッガをそのまま利用することが可能となる。
【0052】
デバッグ対象装置202の構成は、実施例1と同じである。実施例1と異なる点は、接続元装置が保守センタ装置201ではなく、中継装置501であるという点のみである。
【0053】
図7は、実施例2におけるリモートデバッグ処理のシーケンスを表す。デバッグ開始処理401は実施例1記載の処理内容と同一であるが、リモートデバッガ204の接続先が中継装置501であるという点でのみ異なる。
【0054】
中継装置501に送信されたデバッグ情報取得要求402は、そのままデバッグ対象装置202に転送される。デバッグ対象装置202は実施例1記載と同じデバッグ情報取得処理403を行い、実施例1記載と同じデバッグ情報取得応答404を中継装置501に返す。中継装置501はデバッグ情報取得応答404により受信した暗号化されたデバッグ情報を実施例1記載と同じデバッグ情報復号処理405により復号化し、復号化したデバッグ情報を用いてデバッグ情報取得応答404を保守センタ装置201に返す。このように、暗号化されたデバッグ情報を中継装置501が復号化することにより、保守センタ装置201上で既存のリモートデバッガ204を利用できる。既存のリモートデバッガ204とは、例えばJava標準のJDBや、リモートデバッグ機能を有するEclipse等の統合開発環境である。
【0055】
デバッグ処理要求406およびデバッグ処理応答407は、中継装置501がそのメッセージを中継するという点でのみ異なっており、処理内容は実施例1記載と同じである。
【0056】
図7は最も単純なシーケンスについて記載したものであり、メッセージの処理順序や回数、送受信の方向について限定するものではない。中継装置501を介してメッセージを送受信する点を除き、標準のJavaのリモートデバッグシステムに準じた動作を想定したものである。
【0057】
図3に示す難読化方法により難読化されたプログラムを利用し、図7に示すようなシーケンスを繰り返すことにより、本発明が対象とする課題を解決し、かつ既存のリモートデバッガを利用可能なリモートデバッグシステムを実現できる。すなわち、実施例2によれば、実施例1の効果に加えて、さらに、保守センタ側に復号処理を行う専用のプロキシサーバを用いることで、既存のデバッガをそのまま利用できる、という効果がある。
【実施例3】
【0058】
実施例3は、本発明を自動車のナビケーションシステムに適用した例を示すものである。実施例2と異なり、保守センタ装置100がプロキシサーバを備えている。このナビケーションシステムには、専用JavaVMがインストールされており、Javaプログラムの実行時にはJavaVMが起動され、同じJavaプログラムを共通に開発し、実行可能な環境にある。実機105mは、デバッグ処理が可能なプログラム実行環境として、車載のCPUにJava仮想マシンを搭載し、アプリケーションとしてカーナビケーションシステムを備えている。保守センタ装置100と実機105mは、無線通信によるネットワークで接続されている。実機105mのデバッグ情報の取得にはJava標準API(JVMTI)を利用する。デバッグ情報は、実機105mでは復号化せず、保守センタ装置100のデバッガで復号化する。保守センタ装置100側には復号処理を行う復号プロシキを備えることで、Java標準のデバッガ(JDB)を利用することができる。
【0059】
保守センタ装置100は、難読化装置で難読化されたデバッグ対象プログラムの暗号化されたデバッグ情報を復号可能で、かつ、ネットワークを介したデバッグ処理が可能なプログラム実行環境を有する。保守センタ装置100が、難読化されたプログラムのデバッグ情報を取得するためのデバッグ要求をカーナビケーションシステム105mのプログラム実行環境に送信し、このデバッグ要求を受けたプログラム実行環境は、難読化されたプログラムからデバッグ要求の求める暗号化されたデバッグ情報を取得し、暗号化されたデバッグ情報を保守センタ装置100に返信する。保守センタ装置100は、プログラム実行環境から受信した暗号化されたデバッグ情報を復号化する。
【0060】
このようにして、リバースエンジニアリングからカーナビケーションシステムのプログラムを保護すると同時に、パフォーマンスを劣化させることなく、JDB対応の既存ツールでカーナビケーションシステムのリモートデバッグを行うことができる。
【0061】
また、本発明のリモートデバッグシステムを、Java仮想マシンを搭載した各家庭内のパソコン、ディジタル家電、電話機など各種の端末機器間をホームネットワークで繋いだ、ホーム・ゲートウエイに適用することもできる。このホーム・ゲートウエイには、専用JavaVMがインストールされており、Javaプログラムの実行時にはJavaVMが起動され、同じJavaプログラムを共通に開発し、実行可能な環境にある。本発明を適用することで、リバースエンジニアリングから各家庭内のホーム・ゲートウエイを構成するJava仮想マシン搭載機器のデバッグ対象プログラムを保護すると同時に、パフォーマンスを劣化させることなく各機器のリモートデバッグを可能にすることができる。
【0062】
あるいはまた本発明のリモートデバッグシステムを、電力の流れを供給側・需要側の両方から制御し、需要家と供給側との双方から電力のやりとりができるようにして最適化できる送電網を構築する、スマートグリッドに適用することもできる。このスマートグリッドシステムには、Java仮想マシンを搭載した専用の機器やソフトウェアが、送電網の一部に組み込まれている。本発明を適用することで、スマートグリッドの欠点であるセキュリティの脆弱性の克服に効果がある。例えば、リバースエンジニアリングから需要家のスマートグリッドシステムを構成するJava仮想マシン搭載機器のデバッグ対象プログラムを保護すると同時に、パフォーマンスを劣化させることなく各機器のリモートデバッグを可能にすることができる。
【符号の説明】
【0063】
100 保守センタ
101 演算装置
102 主記憶装置
103 通信装置
104 外部記憶装置
105 ユーザの端末機器
106 ネットワーク
107 プログラム開発者提供の難読化装置
201 保守センタ装置
202 デバッグ対象装置
203 ネットワーク
204 リモートデバッガ
205 デバッグ要求処理部
206 デバッグ情報復号処理部
207 デバッグ対象プログラム
208 プログラム実行環境
209 デバッグ応答処理部
300 難読化処理
301 プログラム読み込み
302 コード情報取得
303 コード情報難読化
304 デバッグ情報有
305 デバッグ情報取得
306 デバッグ情報編集
307 デバッグ情報暗号化
308 コード情報有
401 デバッグ開始処理
402 デバッグ情報取得要求
403 デバッグ情報取得処理
404 デバッグ情報取得応答
405 デバッグ情報復号化処理
406 デバッグ処理要求
407 デバッグ処理応答
501 中継装置
502 リモートデバッグプロキシ
503 デバッグメッセージ転送部。

【特許請求の範囲】
【請求項1】
デバッグ対象装置で実行するためのデバッグ対象プログラムを、プログラム難読化処理手段を備えた難読化装置において難読化する方法であって、
前記デバッグ対象プログラムは、プログラムロジックを表すコード情報と、デバッグに必要な情報を表すデバッグ情報とを含んで構成され、
前記プログラム難読化処理手段により、
前記デバッグ対象プログラムの前記プログラムロジックを変更することなく、前記コード情報を、リバースエンジニアリングが困難な情報へと難読化し、
前記デバッグ情報を、リバースエンジニアリングが不可能な情報へと暗号化することにより、前記デバッグ対象プログラムを難読化する
ことを特徴とするプログラム難読化方法。
【請求項2】
請求項1において、
前記デバッグ対象プログラムは、前記デバッグ対象装置で仮想マシンを実行するアプリケーションプログラムである
ことを特徴とするプログラム難読化方法。
【請求項3】
請求項2において、
前記デバッグ対象プログラムはJava言語で記述されたプログラムであり、
前記プログラムロジックを構成するクラスファイルの前記コード情報と前記デバッグ情報とをそれぞれ別方式で変換する
ことを特徴とするプログラム難読化方法。
【請求項4】
請求項3において、
前記プログラム難読化処理手段は、
前記クラスファイルのプログラムデータをその格納場所から読み込み、
該読み込んだプログラムデータのバイトコードから前記コード情報を取得し、
前記取得したクラスファイルのコード情報を、前記難読化手段を用いて、難読化前のコード情報と同じロジックを表すが、人間にとっては解析が困難な情報となるコード情報に変換し、
前記プログラムデータに前記取得したコード情報に関連するデバッグ情報が存在するかどうかを判定し、
前記デバッグ情報を含むコードと判定された場合に、前記プログラムデータから前記デバッグ情報を取得して所定の場所に格納し、
前記取得したクラスファイルのデバッグ情報を、前記難読化したコード情報に対応付ける形式に編集し、
該編集したデバッグ情報を暗号化し、該暗号化されたデバッグ情報を元の格納場所に格納する
ことを特徴とするプログラム難読化方法。
【請求項5】
デバッグ対象プログラムを実行するデバッグ対象装置と、プログラム難読化処理手段を備えた難読化装置と、前記デバッグ対象プログラムをデバッグ処理するデバッグ処理装置とがネットワークを介して相互に接続可能に構成されたリモートデバッグシステムであって、
前記難読化装置の前記プログラム難読化処理手段は、
前記デバッグ対象プログラムの前記プログラムロジックを変更することなく、前記コード情報を、リバースエンジニアリングが困難な情報へと難読化し、前記デバッグ情報を、リバースエンジニアリングが不可能な情報へと暗号化することにより、前記デバッグ対象プログラムを難読化し、
前記デバッグ対象装置は、
前記プログラム難読化処理手段により難読化されたデバッグ対象プログラムを保持すると共に、該デバッグ対象プログラムの実行環境、及び、デバッグ応答処理部を備え、
前記デバッグ処理装置は、
前記デバッグ対象装置の前記デバッグ対象プログラムに関するデバッグ情報の取得手段能、及び、前記デバッグ対象プログラムに関するデバッグ情報の復号・処理手段を有し、
前記ネットワークを介して前記デバッグ対象装置の難読化されたデバッグ対象プログラムのデバッグ処理を行う
ことを特徴とするリモートデバッグシステム。
【請求項6】
請求項5において、
前記デバッグ処理装置が、前記ネットワークを介して前記デバッグ対象装置に接続された保守センタであり、
該保守センタは、難読化された前記プログラムの暗号化されたデバッグ情報を復号化可能なデバッガと、前記ネットワークを介した前記デバッグ処理が可能なプログラム実行環境とを備え、
前記デバッガは、
前記デバッグ処理のためのユーザインタフェースを提供するデバッグ要求処理部と、
暗号化された前記デバッグ情報を復号化するデバッグ情報復号処理部により構成される
ことを特徴とするリモートデバッグシステム。
【請求項7】
請求項6において、
前記デバッグ対象装置は、記憶部と処理部を備え、
前記記憶部に前記プログラムとしてのアプリケーションプログラムおよび該アプリケーションプログラムを実行可能なように処理する仮想マシンを記憶し、前記処理部が前記仮想マシンを実行する環境を備え、
通常時は前記難読化された前記プログラムを実行する
ことを特徴とするリモートデバッグシステム。
【請求項8】
請求項5において、
前記デバッグ応答処理は、前記デバッグ要求処理部から送信されるデバッグ要求メッセージを受信し、当該メッセージの種類に応じてデバッグ対象プログラムのデバッグ処理を行い、その結果を前記デバッグ要求処理部に返す
ことを特徴とするリモートデバッグシステム。
【請求項9】
請求項6において、
前記保守センタは、前記デバッグ対象装置の前記デバッグ対象プログラムに誤動作が発生した時、暗号化された前記デバッグ情報を復号化し、前記デバッグ対象装置のデバッグ対象プログラムに対するリモートデバッグを行う
ことを特徴とするリモートデバッグシステム。
【請求項10】
請求項6において、
前記デバッガが、前記難読化された前記プログラムの前記デバッグ情報を取得するためのデバッグ要求を前記デバッグ対象装置の前記プログラム実行環境に送信した際、当該デバッグ要求を受けた該デバッグ対象装置の前記プログラム実行環境は前記難読化された前記プログラムから当該デバッグ要求の求める暗号化された前記デバッグ情報を取得し、
暗号化された当該デバッグ情報を前記デバッガに返信し、
前記デバッガは前記デバッグ対象装置の前記プログラム実行環境から受信した暗号化された当該デバッグ情報を復号化する
ことを特徴とするリモートデバッグシステム。
【請求項11】
請求項5において、
前記デバッグ処理装置が、前記ネットワークを介したデバッグ処理が可能なデバッガと、前記ネットワークを介して送信されたデバッグ要求を前記デバッグ対象装置に該ネットワークを介して転送可能なプロキシサーバとで構成され、
前記プロキシサーバは、前記難読化されたプログラムの暗号化されたデバッグ情報を復号可能で、かつ、ネットワークを介したデバッグ処理が可能なプログラム実行環境を有し、
前記デバッグ対象装置が、前記難読化されたプログラムを実行可能なプログラム実行環境を有し、
前記デバッガが、前記難読化された前記プログラムの前記デバッグ情報を取得するためのデバッグ要求を前記プロキシサーバに送信した際、前記プロキシサーバは当該デバッグ要求を前記デバッグ対象装置の前記プログラム実行環境に転送し、
当該デバッグ要求を受けた前記デバッグ対象装置の前記プログラム実行環境は、前記難読化された前記プログラムから当該デバッグ要求の求める暗号化された前記デバッグ情報を取得し、前記プログラム実行環境は暗号化された当該デバッグ情報を前記プロキシサーバに返信し、
前記プロキシサーバは、前記プログラム実行環境から受信した暗号化された当該デバッグ情報を復号化し、該復号化された当該デバッグ情報を前記デバッガに返信する
ことを特徴とするリモートデバッグシステム。
【請求項12】
請求項5において、
前記デバッグ処理装置が、前記ネットワークを介したデバッグ処理が可能なデバッガと、前記デバッグ要求を前記デバッグ対象装置に前記ネットワークを介して転送可能なプロキシサーバとを備えた保守センタで構成され、
前記保守センタは、前記難読化されたプログラムの暗号化されたデバッグ情報を復号可能で、かつ、ネットワークを介したデバッグ処理が可能なプログラム実行環境を有し、
前記デバッグ対象装置が、前記難読化されたプログラムを実行可能なプログラム実行環境を有し、
前記保守センタが、前記難読化された前記プログラムの前記デバッグ情報を取得するためのデバッグ要求を前記デバッグ対象装置の前記プログラム実行環境に送信し、
当該デバッグ要求を受けた前記デバッグ対象装置の前記プログラム実行環境は、前記難読化された前記プログラムから当該デバッグ要求の求める暗号化された前記デバッグ情報を取得し、前記プログラム実行環境は暗号化された当該デバッグ情報を前記保守センタに返信し、
前記保守センタは、前記プログラム実行環境から受信した暗号化された当該デバッグ情報を復号化する
ことを特徴とするリモートデバッグシステム。

【図1】
image rotate

【図2】
image rotate

【図3】
image rotate

【図4】
image rotate

【図5】
image rotate

【図6】
image rotate

【図7】
image rotate

【図8】
image rotate


【公開番号】特開2013−45277(P2013−45277A)
【公開日】平成25年3月4日(2013.3.4)
【国際特許分類】
【出願番号】特願2011−182504(P2011−182504)
【出願日】平成23年8月24日(2011.8.24)
【出願人】(000233055)株式会社日立ソリューションズ (1,610)
【Fターム(参考)】