(57)【特許請求の範囲】
【請求項１】
複数の基本ブロックにまとめられたコンピュータコード命令を含むコンパイルされたコンピュータコードを難読化させる方法であって：
第１の基本ブロックのジャンプ命令を、少なくとも１つのパラメータを有するファンクションコールに置換する、置換ステップであって、前記ファンクションコールは、実行されるときに、前記パラメータに依存して、実行する次のファンクションのアドレスを決定する、置換ステップと；
前記パラメータに値を割り当てる命令を前記コンパイルされたコンピュータコードに挿入する、挿入ステップであって、前記値により、前記ファンクションコールによって決定される前記アドレスが前記置換されたジャンプ命令の行き先アドレスに対応することとなる、挿入ステップと；
を有し、
前記割り当てる命令が、前記第１の基本ブロックとは異なる第２の基本ブロックの前記コンピュータコードに挿入され、かつ前記第１の基本ブロックの前に実行されることになっている、方法。
【請求項２】
前記ジャンプ命令は、無条件ジャンプファンクションである、
請求項１記載の方法。
【請求項３】
条件付ジャンプ命令を有する先行する第３の基本ブロックと、前記第１の基本ブロックとの間の実行パス内で、前記第２の基本ブロックを選択するステップ、
を更に有する請求項１記載の方法。
【請求項４】
前記コンパイルされたコンピュータコードの制御フローグラフの情報が、前記第２の基本ブロックを選択するために使用される、
請求項３記載の方法。
【請求項５】
複数の基本ブロックにまとめられたコンピュータコード命令を含むコンパイルされたコンピュータコードを難読化させるためのデバイスであって：
第１の基本ブロックのジャンプ命令を、少なくとも１つのパラメータを有するファンクションコールに置換する、置換ユニットであって、前記ファンクションコールは、実行されるときに、前記パラメータに依存して、実行する次のファンクションのアドレスを決定する、置換ユニットと；
前記パラメータに値を割り当てる命令を前記コンパイルされたコンピュータコードに挿入する、挿入ユニットであって、前記値により、前記ファンクションコールによって決定される前記アドレスが前記置換されたジャンプ命令の行き先アドレスに対応することとなる、挿入ユニットと；
前記第１の基本ブロックとは異なり、前記第１の基本ブロックの前に実行することになっている、前記挿入ユニットが前記割り当てる命令を挿入する、第２の基本ブロックを発見する発見ユニットと；
を有するデバイス。
【請求項６】
前記置換ユニットは、無条件ジャンプファンクションを置換する、
請求項５記載のデバイス。
【請求項７】
前記発見ユニットは、条件付ジャンプ命令を有する先行する第３の基本ブロックと、前記第１の基本ブロックとの間の実行パス内で、前記第２の基本ブロックを発見する、
請求項５記載のデバイス。
【請求項８】
前記発見ユニットは、前記第２の基本ブロックを発見するために、前記コンパイルされたコンピュータコードの制御フローグラフの情報を使用する、
請求項７記載のデバイス。
【請求項９】
前記置換ユニット、前記挿入ユニット、及び前記発見ユニットは、少なくとも１つのプロセッサによってインプリメントされる、
請求項５記載のデバイス。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は一般的にソフトウェアに関し、より詳細にはソフトウェアの難読化に関する。
【背景技術】
【０００２】
この章は、本発明の様々な側面を説明するためのものである。そして、添付の請求項に記載された本発明の様々な側面に関連する。この説明は、本発明の様々な側面をよりよく理解するための役に立つ背景情報を提供するものとなろう。したがって、ここでの記載は、この観点から認識されなければならず、先行技術の存在を認めるものではない。
【０００３】
非特許文献１は、２つの主要な技術を用いて、逆アセンブラを混乱させることを提案している。第１の技術は、通常のランタイムの実行でアクセスされない位置に、ジャンクコードバイトを挿入することである。第２の技術は、ブランチファンクションを使用して通常のプロシージャーコールを修正することである。いくらか簡単化して説明すると、ブランチファンクションは、その関数の値に依存して、ターゲットを決定するということである。例えば、コール命令の位置によるハッシュ値が挙げられる。ランタイムにおいて、スタックの最上部から、この位置は容易に決定されてもよい。加えて、ブランチファンクションは、戻りアドレスもオフセットによって修正する。これによって、中間スペース（ｉｎｔｅｒｖｅｎｉｎｇ  ｓｐａｃｅ）にジャンク・コードを満たすことを可能とする。
【０００４】
非特許文献２は、Ｌｉｎ及びＤｅｂａｙにより提案された難読化を克服することを提案している。この文献の筆者は、Ｌｉｎ及びＤｅｂａｙのジャンプ関数は、基本的に、コールインストラクションの後のアドレスが入力パラメータとしてスタックの最上部にパスされるプロシジャーであると認識している。それから、ブランチファンクションはダイナミック入力から独立している。これは、つぎのようにシミュレーションし得る。すなわち、その出力が１つの入力パラメータに依存しており、かつ、静的ルックアップテーブルがバイナリのイニシャライズされたデータセグメントに存在しているということである。このオフセットは、したがって、計算し得る。そしてこれは逆アセンブラがジャンク・コードをスキップし、次の有効な命令から続けることを可能とする。
【０００５】
当業者は、Ｋｒｕｅｇｅｌによって提供される逆アセンブリ・テクニックに対して対向できる難読化の方法の必要性を認識している。
【０００６】
特許文献１において、Ｊａｋｕｂｏｗｓｋｉ、及びＪａｃｏｂは、とりわけ、どんな命令にジャンプするべきかについて決めるためにブランチファンクションを使用するコード難読化方法を開示している。Ｌｉｎ及びＤｅｂａｙとの相違点としては、Ｊａｋｕｂｏｗｓｋｉ、及びＪａｃｏｂの方法はダイナミック入力を採用するファンクションを使用する。そして、これは静的にコードを逆アセンブルすることを非常に難しくする。
【０００７】
非特許文献３は、類似の解決策を開示している。彼らの解決策は、ネストしたブランチファンクションを使用する。これによって、「一番奥の」ファンクションは、ダイナミックであり、これは、戻りアドレスのハッシュを用い、新たな戻りアドレスを生成する。
【０００８】
特許文献２は、従来技術として、他の類似の解決策を提示している。この文献では、ジャンプは、データのテーブルのエントリにアクセスするインテグリティファンクションへのコールに置き換えられ、そして、このエントリの値をハッシュし、戻りアドレスを計算する。
【先行技術文献】
【特許文献】
【０００９】
【特許文献１】米国特許公開公報２００６／０２５３６８７号明細書
【特許文献２】米国特許公開公報２００８／０１４８０６１号明細書
【非特許文献】
【００１０】
【非特許文献１】“Obfuscation  of  Executable  Code  to  Improve  Resistance  to  Static  Disassembly”,  10th  ACM  Conference  of  Computer  and  Communications  Security  (CCS),  pages  290-299,  October  2003,  Linn  and  Debray
【非特許文献２】“Proceedings  of  the  13th  USENIX  Security  Symposium”,  San  Diego,  CA,  USA,  August  9-13,  2004,  Kruegel  et  al.
【非特許文献３】C.  Collberg  et  al.  Section  4  of  “Dynamic  Path-Based  Software  Watermarking”,  ACM  Sigplan  Notices,  ACM,  Association  for  Computing  Machinery,  New  York,  NY,  US,  XP009084970
【発明の概要】
【発明が解決しようとする課題】
【００１１】
本発明は、Ｌｉｎ及びＤｅｂａｙの方法の改良を提供するものであり、同時に、他の従来技術に取って代わるものである。複数の方法が用いられれば、コードの難読化は、より効果が期待できる。都合のよいことに、当業者は、改良された解決策の必要性を認識している。
【課題を解決するための手段】
【００１２】
［発明の開示］
第１の態様において、本発明は、複数の基本ブロックで構成されるコンパイルされたコンピュータコードを含むコンピュータコード命令を難読化させる方法を実現することを目的とする。第１の基本ブロックのジャンプ命令は、少なくとも１つのパラメータを有するファンクションコールと置換される。ここで、ファンクションコールは、実行されるときに、パラメータに依存して、実行される次のファンクションのアドレスを決定する。パラメータに値を割り当てる命令は、コンパイルされたコンピュータコードに挿入する。パラメータの値は、ファンクションコールによって決定されるアドレスが置換されたジャンプ命令の行き先アドレスに対応するものである。この割り当てる命令は、第１の基本ブロックと異なる第２の基本ブロックのコンピュータコードに挿入され、かつ第１の基本ブロックの前に実行されることになっている。
【００１３】
好ましい第一実施例において、ジャンプファンクションは、無条件ジャンプファンクションである。
【００１４】
第２の好ましい実施例において、第２の基本ブロックは、先行する条件付ジャンプ命令を含む第３の基本ブロックと、第１の基本ブロックとの間の実行パス内に選択される。コンパイルされたコンピュータコードのための制御フローグラフの情報が第２の基本ブロックを選択するために使用することが有利である。
【００１５】
第２の態様において、本発明は、複数の基本ブロックで構成されるコンパイルされたコンピュータコードを有するコンピュータコード命令を難読化させるためのデバイスの実現を目的とする。
【００１６】
デバイスは、第１の基本ブロックのジャンプ命令を、少なくとも１つのパラメータを有するファンクションコールに置換する、置換ユニットであって、前記ファンクションコールは、実行されるときに、前記パラメータに依存して、実行する次のファンクションのアドレスを決定する、置換ユニットと；前記パラメータに値を割り当てる命令を前記コンパイルされたコンピュータコードに挿入する、挿入ユニットであって、前記値により、前記ファンクションコールによって決定される前記アドレスが前記置換されたジャンプ命令の行き先アドレスに対応することとなる、挿入ユニットと；前記第１の基本ブロックとは異なり、前記第１の基本ブロックの前に実行することになっている、前記挿入ユニットが前記割り当てる命令を挿入する第２の基本ブロックを発見する発見ユニットと；を有している。
【００１７】
好ましい第一実施例において、置換ユニットは、無条件ジャンプファンクションを置換するのに適している。
【００１８】
第２の好ましい実施例において、前記発見ユニットは、条件付ジャンプ命令を有する先行する第３の基本ブロックと、前記第１の基本ブロックとの間の実行パス内で、前記第２の基本ブロックを発見するのに適している。
【００１９】
前記発見ユニットは、前記第２の基本ブロックを発見するために、前記コンパイルされたコンピュータコードの制御フローグラフの情報を使用するのに適していることは、有利である。
【００２０】
第３の好ましい実施例において、置換ユニット、挿入ユニット、及び発見ユニットは、少なくとも１つのプロセッサにおいてインプリメントされる。
【００２１】
本発明の好適な特徴は、添付の図面を参照し、非制限的な実施例として、本明細書に記載されている
図において、示されたブロックは単に機能エンティティである。そして、それらは、必ずしも物理的に別々のエンティティに対応するというわけではない。これらの機能エンティティは、ハードウェア、ソフトウェア又はソフトウェア及びハードウェアの組合せとしてインプリメントされてもよい。さらに、それらは、１つ以上の集積回路でインプリメントされてもよい。
【図面の簡単な説明】
【００２２】
【図１】ソフトウェアをコンパイルする従来の方法を例示する図である。
【図２】従来技術に従って難読化するコードを例示する図である。
【図３】本発明の好ましい実施例に従って難読化するコードを例示する図である。
【図４】本発明の好ましい実施例に従ってコード難読化の方法を例示する図である。
【図５】本発明の好ましい実施例に従ってコード難読化のためのデバイスを例示する図である。
【発明を実施するための形態】
【００２３】
［本発明の好ましい実施例］
図１は、ソフトウェアをコンパイルする従来の方法を例示する。この手順についてのある程度の基本的知識は、以下の説明の理解を補助するものである。コンパイルによって、ソースコード１１０はマシンコード１５０に変換される。この間に幾つかの中間的なステップを経由する。すなわち、シンタクスツリー１２０、制御フローグラフ１３０、アセンブリ・コード１４０が生成される。
【００２４】
本発明の主たるアイディアは、Ｌｉｎ及びＤｅｂａｙによって使用されるものよりも、より安全なブランチファンクションコールを使用することである。すでに述べたように、それらのブランチファンクションは極めて容易にシミュレーションし得る。Ｊａｋｕｂｏｗｓｋｉ、及びＪａｃｏｂは、ブランチファンクションをダイナミックにすることにより、これらを安全にしたが、これらは依然として算出され得る。本発明の解決案は、異なる方式でブランチファンクションを安全にする。この点を以下に詳細に述べる。
【実施例】
【００２５】
本発明の解決案を理解するために、まず従来技術の難読化を図２に例示する。プログラムコード２００は、制御フローグラフに沿って、多くの基本ブロック２１０−２７０に分けられる。基本ブロックは、順次実行される一組の命令であるといってもよい。これは、他の基本ブロックへのジャンプファンクションによって終了する。例えば、基本ブロック２１０は、３つの命令を有する。すなわち、Ｉ１、Ｉ２、及び条件付きジャンプ、「if  cond  jump」である。全３つの命令が実行され、かつ、条件付きジャンプに依存して、命令実行は、基本ブロック２２０の命令Ｉ４又は基本ブロック２５０の命令Ｉ１７に続く。図示のコードセクション（番号は、基本ブロックの番号を示す）による３つの可能な実行パスが存在する。すなわち、
Ａ：２１０−２２０−２４０−２６０
Ｂ：２１０−２２０−２３０−２６０
Ｃ：２１０−２５０−２７０
である。
【００２６】
基本ブロック２６０、及び２７０の各々は、ジャンプファンクション（Ｊｕｍｐ＠１、及びＪｕｍｐ＠２）と、部分的なコード命令（ｉ２５、及びｉ２８）（小文字ｉによって表されている）を含んでいる。（部分的なコード命令に加えて又はその代わりに）１つ以上の完全な（entire）命令を使用することは可能である。しかし、部分的なコード命令を使うことが有利である。すなわち、これらは、逆アセンブラに対してトリックを行い、少なくとも、後続の「本当」の命令をファンクションパラメータとして誤って解読（misinterpret）させるからである。これらの２つのジャンプファンクションは、Ｌｉｎ及びＤｅｂａｙによる解決策にしたがってインプリメントされてもよい。（すなわちスタック上のアドレスに依存するということである。）あるいは、Ｊａｋｕｂｏｗｓｋｉ及びＪａｃｏｂの他の解決策によってもよい。（すなわち、複素関数（complex  function）であり、この値はランタイムで決定され、リバースエンジニアリングを行うことは困難である。）
図３は、本発明の好ましい実施例に従った難読化を例示する。後述する一部の変更態様以外は、プログラムコード３００は、図２のプログラムコード２００と同一である。同様に７つの基本ブロック３１０−３７０が存在し、かつ基本ブロック３１０乃至３２０は基本ブロック２１０乃至２２０とそれぞれ同一である。
【００２７】
基本ブロック３６０、及び３７０で、しかしながら、図２のジャンプファンクション（Ｊｕｍｐ＠１、及びＪｕｍｐ＠２）は、入力としてのパラメータａを有するファンクションへのコールに置き換えられている。正しいパラメータによって、ファンクションコールは、プログラムフローで実行する次の命令のアドレスを決定する。換言すれば、正しいパラメータ値によって、ファンクションコールは、置き換えられたジャンプファンクションとなる。しかしながら、誤ったパラメータ値では、そうならない。正しいパラメータ値がこの時点で取得されることが好ましい。
【００２８】
本発明の重要な点は、パラメータａの算出を安全にする制御フローグラフの使用である。これは、ファンクションコールを含む基本ブロックとは異なる基本ブロックのパラメータａに特定の値を割り当てる命令を挿入することによって行われる。
【００２９】
例えば、実行パスＡ’（３１０−３２０−３４０−３６０）は、基本ブロック３４０のパラメータａにある値を割り当てる（ａ＝ｙ）。基本ブロック３４０は、ファンクションコールを有する基本ブロック３６０とは別個のものである。
【００３０】
同様に、実行パスＢ’（３１０−３２０−３３０−３６０）は、基本ブロック３３０にパラメータ値（ａ＝ｙ）を割り当てる（同様に、基本ブロック３６０とは別個のものである。）そして、実行パスＣ（３１０−３５０−３７０）は、基本ブロック３５０にパラメータ値（ａ＝ｚ）を割り当てる。（ファンクションコールを有する基本ブロック３７０とは別個のものである。）
当業者は、パラメータ値は、ジャンプ先が基本ブロック３６０に位置する実行パスＡ’及びＢ’に対して同じ（ａ＝ｙ）であることを理解するであろう。このことは、望ましいが、値は異なってもよい。当業者は、２つの実行パスの両者に共通であるが実行パスＣとは別である基本ブロック３２０にパラメータ値を割り当ててもよいと考えるであろう。
【００３１】
当業者は、パラメータ値を割り当てること、及び、ファンクションコールに対して多くの変形例を設定することが可能であることを理解するであろう。第１に、各々異なるパラメータを含む複数の異なるファンクションコールを有することは、可能である。第２に、パラメータ値は、また、複数の実行パスに共通の基本ブロックに割り当てられてもよい。例えば、実行パスＡ’及びＢ’は、共通の基本ブロック３２０（これは実行パスＣの部分でないブロック）にパラメータ値を割り当ててもよい。第３に、パラメータは、ファンクションコールの前に２回以上、値を割り当てられてもよい。例えば、第１の割当はパラメータに第１の値を与えてもよく、かつ、例えばそれを１増やし、第２の割当の値を修正してもよい。第４に、割当は、複数のファクタに依存してもよく、かつ、ファンクション（例えばハッシュ関数）を有してもよい。
【００３２】
当業者は、制御フローグラフを参照せずに、結果として得られるマシンコードをリバースエンジニアリングすることは、非常に困難であることを理解するであろう。なぜなら、パラメータが何処で割り当てられたかを知ることが非常に難しいからである。制御フローグラフは、マシンコードを含むバイナリコードによって通常得ることはできない点に留意すべきである。同時に、これらは、静的コードで提供されておらず、実行中に計算され、ジャンプするアドレスを得ることは困難であるため、制御フローグラフを生成することは困難である点も理解すべきである。図４は、本発明の好ましい実施例に従ったコード難読化の方法を例示する。ステップ４１０において、ジャンプは、基本ブロックＸ（例えば図３の基本ブロック３６０）のファンクションコールと置換される。ステップ４２０において、グラフ（ＣＦＧ）が用いられて、このブロックに先行する可能な実行パスの少なくとも一部を見つけるために、ブロックＸからバックトラックを行う。上述のように、図３の基本ブロック３１０からブロック３６０まで、２つの実行パスが存在する。すなわち、実行パスＡ’（３１０−３２０−３４０−３６０）、及び実行パスＢ’（３１０−３２０−３３０−３６０）である。
【００３３】
ステップ４３０において、少なくとも選択された実行パスのうちの１つ（おそらく複数又は全て）における基本ブロックＹが選択される基本ブロックＹは、好ましくは実行パスに特有である。しかし、これは、複数の実行パスによって共有したものでもよい。基本ブロックＹの複数の候補が実行パスの中に存在する場合、基本ブロックＸから遠く離れたものの１つを使用するのが好ましい。例を示せば、２つの実行パスの基本ブロックＹの候補としては、Ａ’：３１０−３２０−３４０、Ｂ’：３１０−３２０−３３０である。もし基本ブロックＹが実行パスにユニークであることが要求される場合は、Ａ’のために基本ブロック３４０、Ｂ’のために基本ブロック３３０だけを残す。しかしながら、上述のように、２つの実行パスに共通な、例えば、基本ブロック３２０に、パラメータを割り当てることも可能である。そして、このパラメータ値を、基本ブロック３３０、及び３４０のいずれかで、修正または変更することも可能である。
【００３４】
ステップ４４０において、パラメータ割当が基本ブロックＹに挿入される。例を示せば、パラメータが両方の実行パスに割り当てられる。すなわちＡ’の基本ブロック３４０にａ＝ｙ、及びＢ’の基本ブロック３３０にａ＝ｙを割り当てる。
【００３５】
図５は、本発明の好ましい実施例に従ってコード難読化のためのデバイスを例示する。デバイス５００は、少なくとも１つのプロセッサ（以下「プロセッサ」）５１０、メモリ空間５２０、他のデバイスとの通信のための少なくとの１つの通信ユニット（Ｉ／Ｏ）５３０、ユーザとのインターラクションのためのユーザインタフェース（ＵＩ）５４０を有する。好ましくはプロセッサ５１０においてインプリメントされ、デバイス５００は、ジャンプをファンクションコール）と置換するためのユニット５５０（ほぼステップ４１０に対応する、実行パスを見つけるためのユニット５６０（ほぼステップ４２０に対応する）、候補基本ブロックを見つけるためのユニット５７０（ほぼステップ４３０に対応する）、及びパラメータ割当を挿入するためのユニット（ほぼステップ４４０に対応する）を有する。
【００３６】
デバイス５００は、好ましくはまた、ソースコードを得てシンタクスツリー１２０、ＣＦＧ１３０、アセンブリ・コード１４０、及びマシンコード１５０を生成するための（図示せず）ユニットを有する。
【００３７】
図５は、また、コンピュータ・プログラム支援装置５９０、例えばＣＤ−ＲＯＭ又はコンピュータコードを記憶するための支援装置を示している。これは、本発明の好ましい実施例に従った方法を使用して難読化されたコンパイルされたコンピュータコードを記憶する。
【００３８】
したがって、本発明が少なくとも静的逆アセンブリに抵抗するコードの難読化を可能にすることが理解される。
【００３９】
明細書及び（必要に応じて）請求項及び図面において開示される各々の特徴は、別個に提供されてもよく、また、組み合わされて提供されてもよい。ハードウェアにおいてインプリメントされるとして記載されている特徴は、また、ソフトウェアでインプリメントされてもよい。あるいは、その逆にインプリメントされてもよい。接続は、ワイヤレス接続または、有線で接続されてもよい。これは、必ずしも専用のものでなくてもよく、直接的な接続でなくてもよい。
【００４０】
請求項において現れている参照番号は、例示を目的とし、かつ、請求項の範囲に、制限や影響を及ぼさない。
【図１】
0005421370.tif 000002
【図２】
0005421370.tif 000003
【図３】
0005421370.tif 000004
【図４】
0005421370.tif 000005
【図５】
0005421370.tif 000006