JP2015537298A - 演算子のないコンパイラ - Google Patents

演算子のないコンパイラ Download PDF

Info

Publication number
JP2015537298A
JP2015537298A JP2015540106A JP2015540106A JP2015537298A JP 2015537298 A JP2015537298 A JP 2015537298A JP 2015540106 A JP2015540106 A JP 2015540106A JP 2015540106 A JP2015540106 A JP 2015540106A JP 2015537298 A JP2015537298 A JP 2015537298A
Authority
JP
Japan
Prior art keywords
computer program
compiler
code
generated
computer
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
JP2015540106A
Other languages
English (en)
Other versions
JP6429785B2 (ja
JP2015537298A5 (ja
Inventor
パウルス マティアス フベルトス メヒティルディス アントニウス ホリッセン
パウルス マティアス フベルトス メヒティルディス アントニウス ホリッセン
ルドヴィクス マリヌス ヘラルドス マリア トルフイゼン
ルドヴィクス マリヌス ヘラルドス マリア トルフイゼン
ミナ デン
ミナ デン
ウィルヘルムス ペトルス アドリアヌス ヨハヌス ミヒールス
ウィルヘルムス ペトルス アドリアヌス ヨハヌス ミヒールス
ウィヘル イド ヤン ヒスペン
ウィヘル イド ヤン ヒスペン
コンスタント パウル マリー ヨゼフ バッヘン
コンスタント パウル マリー ヨゼフ バッヘン
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Koninklijke Philips NV
Original Assignee
Koninklijke Philips NV
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Family has litigation
First worldwide family litigation filed litigation Critical https://patents.darts-ip.com/?family=47757443&utm_source=google_patent&utm_medium=platform_link&utm_campaign=public_patent_search&patent=JP2015537298(A) "Global patent litigation dataset” by Darts-ip is licensed under a Creative Commons Attribution 4.0 International License.
Application filed by Koninklijke Philips NV filed Critical Koninklijke Philips NV
Publication of JP2015537298A publication Critical patent/JP2015537298A/ja
Publication of JP2015537298A5 publication Critical patent/JP2015537298A5/ja
Application granted granted Critical
Publication of JP6429785B2 publication Critical patent/JP6429785B2/ja
Expired - Fee Related legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Images

Classifications

    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/42Syntactic analysis
    • G06F8/425Lexical analysis
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/41Compilation
    • G06F8/44Encoding
    • G06F8/447Target code generation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/10Protecting distributed programs or content, e.g. vending or licensing of copyrighted material ; Digital rights management [DRM]
    • G06F21/12Protecting executable software
    • G06F21/14Protecting executable software against software analysis or reverse engineering, e.g. by obfuscation
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F8/00Arrangements for software engineering
    • G06F8/40Transformation of program code
    • G06F8/52Binary to binary

Landscapes

  • Engineering & Computer Science (AREA)
  • Theoretical Computer Science (AREA)
  • General Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Physics & Mathematics (AREA)
  • General Physics & Mathematics (AREA)
  • Multimedia (AREA)
  • Technology Law (AREA)
  • Computer Hardware Design (AREA)
  • Computer Security & Cryptography (AREA)
  • Devices For Executing Special Programs (AREA)

Abstract

第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラム110をマシン言語において記述される第2のコンピュータプログラムにコンパイルするためのコンパイラ134は、テーブル142及びマシン言語コード144を生成することにより第2のコンピュータプログラムを生成するためのコードジェネレータを有し、生成されたテーブル及び生成されたマシン言語コードは、第2のコンピュータプログラムを一緒に形成し、生成されたマシン言語コードはテーブルを参照し、生成されたマシン言語コードは算術又は論理マシン命令を含まず、テーブルは、算術及び/又は論理マシン命令の予め計算された結果を有する。

Description

本発明は、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを第2のコンピュータプログラムにコンパイルするためのコンパイラに関する。コンパイラは、マシン言語コードを生成することにより第2のコンピュータプログラムを生成するためにコードジェネレータを有する。
本発明は、更に、コンパイラ及びコンパイル方法として構成されるコンピュータに関する。
コンピュータシステムがいわゆるサイドチャネルを介して一部の情報を漏らすことは長い間知られている。コンピュータシステムの入出力動作を観察することは、コンピュータシステムにより使用される秘密鍵のような機密情報に関する何らかの有益な情報を供給しないかもしれない。しかし、コンピュータシステムは、観察され得る他のチャネル、例えばその電力消費又は電磁放射を有し、これらのチャネルは、サイドチャネルと呼ばれる。例えば、異なる命令により消費される電力の小さな変動及び命令を実行している間に消費される電力の変動が測定され得る。測定された変動は、機密情報(例えば、暗号鍵)に相関され得る。観察可能な及び意図された入出力動作の背後にある機密情報に関するこの追加の情報は、サイドチャネルと称される。
サイドチャネルを介して、コンピュータシステムは、その使用の間、機密情報を"漏らす"かもしれない。サイドチャネルを観察及び解析することは、入出力動作のみの暗号解析から取得され得るよりも良好な情報へのアクセスを攻撃者に与え得る。サイドチャネル攻撃の1つの既知のタイプは、いわゆる差動電力分析(DPA;differential power analysis)である。
コンピュータハードウェア及びコンピュータソフトウェアの機能の双方の実装は、サイドチャネル攻撃に対して弱い。しかしながら、問題は、ソフトウェアにおいて最も厳しい。ハードウェア実装と比較して、ソフトウェアは、比較的遅く、電力の比較的大きな量を消費する。双方のファクタは、サイドチャネル攻撃を支持する。
試みは、これらのコンパイルを変えることによりサイドチャネル攻撃に対するコンピュータプログラムの抵抗を増大させるよう行われている。
米国特許7996671号は、向上したコンパイルによりサイドチャネル攻撃に対するコンピュータプログラムの抵抗を増大させることを提案している。電力分析攻撃が測定された電力消費に依存するので、抵抗は、電力消費を低減させるようにコンパイルすることにより増大される。コンパイラは、最も効率的なエネルギになるコンパイルを予測し、これを選択する。エネルギ消費削減は、電力ノイズ/変動を増大させ、サイドチャネル抵抗を向上させることが観察される。
エネルギ削減アプローチが、単独で十分な電力ノイズ/バリエーションを取り込むのに十分でない場合、その後、エネルギ最適化のために用いられるコンパイラアプローチが、コード(例えば、暗号アルゴリズム)の重要な部分における電力コストをランダム化するために用いられ得る。これは、異なる電力要件によりコードを故意に生成により、コンパイル時に達成される。
計算にランダム性を取り込むサイドチャネル問題に対する現在のアプローチは、満足なものには満たないと判明した。隠されるにもかかわらず、電力消費と機密計算との間の一部の関係は残る。充分な電力測定及び統計解析が与えられた場合、ランダム性に基づく対策は効果がないかもしれない。
これら及び他のセキュリティ関心事に対処するために向上したコンパイラを有することが有利であるだろう。
発明者らは、秘密データ(例えば、暗号鍵)に関する情報の漏出が、秘密のデータに基づき動作するマシンコード命令の演算及び論理回路の使用により第一にもたらされることを観測した。第一に斯様な命令を回避することが可能であった場合、サイドチャネル漏出の根本的原因のうち1つは対処されるだろう。
本発明の態様は、独立請求項において規定される。従属請求項は、有利な実施形態を規定する。
第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを第2のコンピュータプログラムにコンパイルするためのコンパイラが提供される。第2のコンピュータプログラムは、マシンプログラミング言語であってもよいが、より一般に任意のコンピュータプログラミング言語であってもよい。コンパイラは、テーブル及びマシン言語コードを生成することにより前記第2のコンピュータプログラムを生成するためのコードジェネレータを有し、生成されたテーブル及び生成されたマシン言語コードは、前記第2のコンピュータプログラムを一緒に形成し、生成されたマシン言語コードは、テーブルを参照し、当該コンパイラは、前記第1のコンピュータプログラムにおける演算又は論理表現を識別するように構成され、前記の表現は、少なくとも1つの変数又はデータアイテムに依存し、前記コードジェネレータは、前記変数の複数の値のための識別された表現の予め計算された結果を表す1又はそれ以上のテーブルを生成し、予め計算された結果を表す生成された1又はそれ以上のテーブルにアクセスすることにより前記第2のコンピュータプログラムにおいて前記識別された表現を実装するためのマシン言語コードを生成するように構成される。
少ない演算又は論理演算しか含まないので、第2のコンピュータプログラムのサイドチャネル漏出はより低くなる。理想的には、全ての演算及び論理表現及び下位表現がテーブルアクセスに置換される。演算又は論理表現又は下位表現を構成するこれらの命令がないので、これらは如何なる情報も漏らし得ない。テーブルは事前計算される。即ち、テーブルに囲まれる演算又は論理的動作を実行するために消費される電力は、プログラムの実行中に可視ではない。
更に、命令セットが削減されるので、実行されるプログラムを非常によりしっかりと復元する。実際に、サイドチャネル情報は、過去において、埋め込まれたプロセッサ上で実行されるプログラムの大部分を回復するために用いられていた。例えば、Thomas Eisenbarth, Christof Paar, and Bjorn Weghenkelによる"Building a Side channel Based Disassembler", Springer Transactions on Computational Science, Special Issue on "Security in Computing", 2010を参照。サイドチャネルに基づく分解は、典型的には、オペランドではなく命令のタイプを示す。その理由は、オペランドが(言わばDPAを用いた)よりきめ細かい統計分析を必要とするためである。したがって、使用される命令のタイプの数を低減することにより、命令のタイプを知ることからはあまり情報は示されない。極端には、演算子のないコンパイルが用いられるときには、その分解は、ロード及びストア動作が用いられるよりも、分解の前に明瞭である何かが始まることをほとんど示さないだろう。従って、例えば、所有者の暗号アルゴリズムがより少ない命令を用いて実装される場合、サイドチャネル情報から暗号アルゴリズムをリバースエンジニアリングするのがより難しくなるだろう。
コンパイラは、第1のプログラムと少なくとも意味的に等価である第2のプログラムを生成する。但し、第2のプログラムは、第1のプログラムより多くのことを行い得る。
第1のコンピュータプログラムは、より大きなコンピュータプログラムの部分であってもよい。その場合、コンパイラは、より大きなコンピュータプログラムの部分のみをコンパイルする。これは、演算子のないコンパイルが典型的には大きな量のメモリを必要とするので、利点である。それ故、演算子のないコンパイルをより大きなプログラムのより重要な部分に限定することが有利である。同様に、第2のコンピュータプログラムは、より大きな第2のコンピュータプログラムの部分であってもよい。より大きな第2のコンピュータプログラムは、全体として演算子のない状態でコンパイルされる必要はない。
通常、コンパイラは、1つを超える表現(例えば、演算又は論理表現)を識別するだろう。予め計算された結果は、識別された表現に関連していてもよい。表現が依存する1つを超える変数があってもよい。この場合、テーブルは、変数の複数の値のための予め計算された結果を表してもよい。コンパイラは、複数の変数に依存して、表現を、より少ない変数に依存するより小さな表現の組み合わせに分割することを決めるための決定論理を有してもよい。
一実施形態において、表現が依存する変数は、セキュリティに関連したデータ(例えば、暗号鍵)と相関される。
一実施形態において、第2のコンピュータプログラムは、マシン言語において記述される。
一実施形態において、識別された表現を実装するために生成されるマシン言語コードは、演算又は論理マシン命令を含まない。
一実施形態において、識別された表現を実装するために生成されるマシン言語コードは、演算又は論理を含まない、及び、条件文のマシン命令を含まない。演算又は論理マシン命令も条件文の命令も回避することが有利であることに注意されたい。一実施形態において、第2のコンピュータプログラムは、演算又は論理を含まない、及び/又は、条件文のマシン命令を含まない。好ましくは、暗号鍵の少なくとも部分に依存するか又はこれと相関される入力を有する少なくとも表現は、演算を伴わない第2のコンピュータプログラム又は論理マシン命令及び/又は条件文の命令において実装される。
コンパイラは、計算機読み取り可能媒体上に格納されてもよい。即ち、マシン読み取り可読格納デバイスにおいて明白に具現化される。コンパイラは、例えばネットワーク(例えば、ワイヤレスネットワーク又はインターネット等)を介して受信されるデジタル信号としてダウンロードされてもよい。コンパイラは、コンパイルするためのコンピュータ制御の方法として表されてもよい。
マシン言語は、場合により更なる関連付けステップを必要とする、コンピュータプロセッサ上で実行可能な言語である。第2のコンピュータプログラムは、異なるコンパイラによってコンパイルされた他のコンピュータプログラムに関連付けられてもよいことに留意されたい。第2のプログラムは、例えば、1又はそれ以上のメモリ及びプロセッサを有するコンピュータ上で実行されてもよく。プロセッサは、レジスタを有する。プロセッサは、マシン命令セットを解釈するように構成される。一部のマシン命令は、メモリとレジスタとの間でデータを転送する。マシン命令がデータ(典型的にはレジスタ)に影響する命令をサポートする場合であっても、コンパイラはそれらを用いる必要はない。例えば、コンパイラは、演算及び論理命令をサポートするプロセッサのためのコードを生成するために用いられてもよい。しかしながら、コンパイラは、それらを用いることを回避する。また、コンパイラは、演算及び論理命令をサポートしないプロセッサの使用を可能にする。コードジェネレータは、マシンコード命令のストリームを生成してもよい。
コンパイラは、第1のコンピュータプログラミング言語において記述されたプログラムを受信するための入力部を有してもよい。コンパイラは、第1のコンピュータプログラミング言語を構文解析するように構成されるパーサを有してもよく、コードジェネレータは、パーサの制御下でマシン言語コードを生成するように構成されてもよい。構文解析は、文法に従うものであってもよい。例えば、パーサは、パーサにより検出される言語要素に対応するコードを生成するためのコードジェネレータルーチンを呼び出し得る。パーサは、例えば構文解析ツリーを生成することにより、第1のプログラムの内部表現を生成し有る。
コンパイラは、第1のプログラムの一連の文字を第1のコンピュータプログラミング言語の一連のトークンに変換することを有する、語彙解析のための語彙スキャナを有し得る。語彙スキャナは、パーサの前で実行されてもよく、又は、パーサの部分であってもよい。
一実施形態において、生成されたマシン言語コードは、条件文のマシン命令を含まない。条件文のマシン命令は、条件文が特定の値を有する場合、及び、そうでない場合に、或る動作を実行する命令である。条件文の命令は、以下のものを含む;或るレジスタが或る値を有する場合にのみジャンプする条件付きのジャンプ命令、条件付きの代入、及び、レジスタが或る値を有する場合に繰り上げビットをセット又はリセットするいわゆる比較命令。コンパイラは、予め計算された分岐テーブルを用いて条件文の命令を回避してもよい。分岐テーブルは、好ましくは、必要とされるジャンプアドレスが取り出されるポインタのテーブルとして実装される。取り出されるアドレスは、条件文に依存する。分岐テーブルは、条件文に依存するオフセットを用いて分岐される無条件の分岐命令のシリアルのリストとして実装されてもよい。オフセットは、テーブルを用いることにより、又は、必要とされた加算を実現するために1又はそれ以上のテーブルを用いるルーチンによりベースアドレスに追加される。32ビットオフセット加算が小さな加算テーブルの繰り返された使用により実装され得ることに留意されたい。
また、条件文の命令は、これらの電力消費が特定の条件が真か否かに関連付けられるので、サイドチャネル情報の重要なソースであり、それ故、条件に関する情報を直接漏らす。
好ましい実施形態において、第2のコンピュータプログラムコードは、いわゆる"演算子のない"ものである。演算子のないコードは、移動(即ち、ロード、演算、レジスタとメモリとの間でデータを転送するためのストア演算、ジャンプ演算)のみを有する。演算及び論理命令のような命令を漏らす演算子のないコード情報の使用は回避される。移動、ロード及びストア演算は、例えば使用されるテーブルをエンコードすることにより、エンコーディングに非常に従うことに留意されたい。それ故、任意の残りの電力漏出は、テーブルをエンコードすることにより低減され得る。演算子のないコードは、以下を含んでもよい:定数を伴うロードレジスタ、他のレジスタを伴うロードレジスタ、メモリアドレスで格納される値を伴うロードレジスタ、1又はそれ以上のレジスタにより示される1又はそれ以上のメモリアドレスに1又はそれ以上のレジスタの格納、レジスタ(又は直接アドレス)により示されたメモリアドレスまでのジャンプ。
プロセッサが、好ましくは移動、又はストア演算を介して、プログラムカウンタの操作の一部のタイプを可能にする場合、ジャンプ命令は回避されてもよいことに留意されたい。例えば、このアドレスレジスタの全ての下位レジスタが、並列にロードされるか、又は、少なくとも次の命令のロードが効力を有する前にロードされる、プログラムカウンタに対するロードが可能である場合、ジャンプがもたらされてもよい。好ましい実施形態において、命令セットは、アドレスレジスタにストアされるメモリアドレスまでのジャンプを有する。これは、条件付きのジャンプが、レジスタ又はその部分へのロード及びストアを介して実装されるのを可能にする。
一実施形態において、ロード演算は、以下のうちの1つを伴うレジスタをロードするためのものである:定数、メモリアドレスにストアされた値及び他のレジスタ。メモリアドレスは、1又はそれ以上の定数及び/又はレジスタにより示される。一実施形態において、ストア演算は、1又はそれ以上のメモリアドレスにおける1又はそれ以上の定数及び/又はレジスタをストアするためのものである。メモリアドレスは、1又はそれ以上のレジスタ値、及び/又は、定数により示される。一実施形態において、ジャンプ演算は、メモリアドレスまでジャンプするためのものである。メモリアドレスは、1又はそれ以上の定数及び/又はレジスタにより示されるか、又は、メモリアドレスは、更なるメモリアドレスから取り出される。
一実施形態において、マシン言語はレジスタに作用し、レジスタのサブセットが、メモリアドレスを含めるためのアドレスレジスタを形成する。例えば、各レジスタは、多数のビット(即ち、8ビット)を含む。及び、各アドレスレジスタは、多数のレジスタ(即ち、4)を含む。これは、アドレス計算を必要とすることなくテーブルアクセスを可能にし、レジスタに依存するテーブルアクセスは、アドレスレジスタのレジスタをロードすることにより実装され得る。これは、アドレス算出ユニットの加算(演算)を除去するので、重要である。また、この加算は、情報を明らかにすることができる。
一実施形態において、幾つかのテーブルは、2の累乗の倍数であるメモリアドレスに格納される。テーブルの開始は、レジスタにビットがあるので、ゼロ最下位ビットの同じ数を有するアドレスに格納される。一実施形態において、テーブルの幾つかの開始は、レジスタにビットがあるので、ゼロ最下位ビットの数の2倍を有するアドレスに格納される。それ故、定数及びレジスタを効果的に連結することにより、テーブルにおける索引を可能にし、それ故計算が回避される。複数のオペランドを用いたオペランドは、複数のゼロビットを有するアドレスにテーブルを配置することによりサポートされてもよい。
例えば加算及び乗算のテーブルが2の累乗の境界に格納される一実施形態においては、2の累乗の境界に他のテーブルも置く必要がない。テーブル化された加算及び乗算を用いて、我々は、プロセッサによりサポートされた演算又は論理の使用を伴うことなく、テーブル化された加算又は乗算の使用を介して、任意の基数+タイプサイズ(typesize)*オフセットを計算する。従って、プログラム1のテーブルアクセスの他のテーブルアクセス、又は、少なくとも意味論的に等価なプログラム2の取り込まれたテーブルは、演算子のないコード加算、及び/又は、テーブル駆動される乗算の使用を介して生成され得る。
一実施形態において、コンパイラは、第1のコンピュータプログラムにおいて、1又はそれ以上のデータアイテムに影響する算術又は論理マシン演算のような演算子を識別するように構成され、コードジェネレータは、同じアドレスレジスタのそれぞれのレジスタにおけるデータアイテムのそれぞれをロードするためのマシン言語コードを生成するように構成され、アドレスレジスタがテーブル入力を示すようにアドレスレジスタの他のレジスタにおけるデータをロードし、アドレスレジスタにより示されたメモリアドレスからレジスタへのデータアイテムに影響する演算子の結果をロードする。第1のプログラムが演算を明示的に含むという点で、第1のコンピュータプログラムにおける演算子を識別することは、直接識別することであり得る。しかし、識別することは、黙示的であってもよく、コンパイラが、マシン言語コードを生成する前に第1のコンピュータプログラムを中間の表現に変換したことを意味する。斯様な中間言語は、レジスタ伝達言語であってもよい。
一実施形態において、コンパイラは、第1のコンピュータプログラムにおいて条件付きのジャンプを識別するように構成され、コードジェネレータは、アドレスレジスタのレジスタにおいて条件を示す値を保持するレジスタをロードするためのマシンコードを生成するように構成され、アドレスレジスタがテーブル入力を示すようにアドレスレジスタの他のレジスタにおけるデータをロードし、アドレスレジスタにより示されたメモリアドレスにおけるメモリに格納されたメモリアドレスまでジャンプする。
本発明の一態様は、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを、算術及び/又は論理命令を伴わない及び/又は条件付きの命令を伴わない形式に、オプションとして演算子のない形式で、コンパイルするためのコンパイラとして構成されるコンピュータに関する。
本発明の態様は、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを第2のコンピュータプログラミング言語において記述される第2のコンピュータプログラムにコンパイルするためのコンパイラに関する。コンパイラは、テーブル及び第2のプログラミング言語コードを生成することにより第2のコンピュータプログラムを生成するためのコードジェネレータを有し、生成されたテーブル及び生成された第2のプログラミング言語コードは、第2のコンピュータプログラムを一緒に形成し、生成された第2のプログラミング言語コードは、前記テーブルを参照し、生成された第2のプログラミング言語コードは、算術又は論理マシン命令を含まず、前記テーブルは、算術及び/又は論理マシン命令の予め計算された結果を有する。第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを第2のコンピュータプログラミング言語において記述される第2のコンピュータプログラムにコンパイルするためのコンパイラは、マシン言語命令のために第2のプログラミング言語からの等価物が選択されなければならないことを除き、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムをマシン言語において記述される第2のコンピュータプログラムにコンパイルするためのコンパイラと同じ技術を用いることができる。
一実施形態において、コンパイラは、例えば、中央処理ユニット(CPU)と、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムをマシン言語において記述される第2のコンピュータプログラムにコンパイルするために前記CPUに結合されたメモリとを有する、電子装置である。装置は、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを受信するための入力部と、テーブル及びマシン言語コードを生成することにより第2のコンピュータプログラムを生成するためのコードジェネレータとを有し、生成されたテーブル及び生成されたマシン言語コードは、第2のコンピュータプログラムを一緒に形成する。生成されたマシン言語コードは、テーブルを参照し、生成されたマシン言語コードは、算術又は論理マシン命令を含まず、テーブルは、算術及び/又は論理マシン命令の予め計算された結果を有する。
本発明の態様は、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムをマシン言語において記述される第2のコンピュータプログラムにコンパイルするための方法に関し、当該方法は、テーブル及びマシン言語コードを生成することにより前記第2のコンピュータプログラムを生成するステップを有し、生成されたテーブル及び生成されたマシン言語コードは、前記第2のコンピュータプログラムを一緒に形成し、生成されたマシン言語コードは、テーブルを参照し、生成されたマシン言語コードは、算術又は論理マシン命令を含まず、前記テーブルは、算術及び/又は論理マシン命令の予め計算された結果を有する。
本発明の一態様は、第1のコンピュータプログラムをコンパイルするためのコンパイル方法に関し、当該方法は、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを、算術又は論理マシン命令を含まない第2のコンピュータプログラミング言語において記述される第2のコンピュータプログラムにコンパイルするステップであって、前記テーブルは、算術及び/又は論理マシン命令の予め計算された結果を有する、ステップと、第1のテーブル及び第2のプログラミング言語コードを取得するステップと、前記第2のコンピュータプログラムを解釈するためにバーチャルマシンプログラムを算術又は論理マシン命令を含まないマシン言語にコンパイルするステップであって、前記バーチャルマシンプログラムは、更なる第1のコンピュータプログラミング言語において書き込まれる、ステップと、生成されたマシン言語コード及び第2のテーブルを取得するステップとを有し、前記テーブルは、算術及び/又は論理マシン命令の予め計算された結果を有する。
コンピュータプログラムがバーチャルマシン上での実行に適している(及び、バーチャルマシンのためのインタプリタのコンパイルと組み合わせる)第2のコンピュータプログラムにコンパイルされるこの構造、好ましくは演算子のないコンパイラは、"von Munchhausen"コンパイルと呼ばれる。これは、演算子のないプログラムにより与えられる保護を提供するが、例えばsandboxingのようなバーチャルマシン実行により与えられる保護も提供する。VM及びプログラムは、スタンドアロンであってもよい。また、VMのフィーチャは、それ故、組み合わせられた結果、例えば実行の間のコード確認、難読化等に対して与えられてもよい。
von Munchhausen構造に従ってコンパイルされたプログラムは、特別な形式を有する。即ち、これらは、2セットのテーブル、各コンパイルから1つ、及び、1つの実行ファイルを有する。本発明の態様は、コンパイラにより、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを第2のコンピュータプログラミング言語において記述される第2のコンピュータプログラムにコンパイルすることにより生成される第1のテーブル及び第2のプログラミング言語コードと、コンパイラにより、前記第2のコンピュータプログラムを解釈するためにバーチャルマシンプログラムをマシン言語にコンパイルすることにより生成される第2のテーブル及びマシン言語コードとを有し、前記バーチャルマシンプログラムは、更なる第1のコンピュータプログラミング言語において記述される、コンピュータプログラムに関する。1つは、プログラムとVMとの間でテーブルを共有するかしないかの選択を有する。そうでもあっても、分岐テーブルは、典型的には、プログラム及びVMの専用である。
本発明の方法は、コンピュータに実装された方法としてのコンピュータ上で、若しくは、専用のハードウェアにおいて、又は、これらの組み合わせにおいて、実装されてもよい。本発明の方法のための実行可能なコードは、コンピュータプログラム製品上に格納されてもよい。コンピュータプログラム製品の例としては、メモリデバイス、光学格納デバイス、集積回路、サーバ、オンラインソフト等が挙げられる。好ましくは、コンピュータプログラム製品は、前記プログラム製品がコンピュータ上で実行されたときに本発明の方法を実行するためにコンピュータ読み取り可能な媒体上に格納される非一時的プログラムコード手段を有する。
好ましい実施形態において、コンピュータプログラムは、コンピュータプログラムがコンピュータ上で実行されたときに本発明の方法の全てのステップを実行するように適合されたコンピュータプログラムコード手段を有する。好ましくは、コンピュータプログラムは、コンピュータ読み取り可能な媒体上に具現化される。
一実施形態において、生成されたテーブルは、明細書において示されるように、難読化される。例えば、Oが難読化しているエンコーディングを表す場合、テーブルは、表現又は演算子fに対して以下のように構成され得る:O (f( O-1(x), O-1(y)))。
一実施形態において、難読化は、鍵により制御され、これは、コンパイラに入力される。例えば、鍵は、疑似ランダムストリームを生成するために用いられてもよく、これは、難読化するエンコーディングを選択するために用いられる。面白いことに、これは、特定のコンパイルを鍵に関連付ける。関連付けは、例えば、特定のユーザが特定のソフトウェアのコンパイルに含まれたことを証明するために、ソフトウェアから指紋をとるために後に用いられてもよい。鍵は、場合によりホワイトボックスの実装において、コンパイラに埋め込まれてもよい。例えば、破壊工作ソフトの製作者は、コンパイルされた製品において使用されるエンコーディングを介して追跡され得る。
本発明のこれらの及び他の態様は、以下で述べられる実施形態から明らかになり、これらを参照して説明されるだろう。
コンパイルシステムを示すブロック図である。 コンパイルシステムを示すブロック図である。 テーブルを示すブロック図である。 コンピュータを示すブロック図である。 コンパイルを示すフローチャートである。 コンパイルを示すフローチャートである。
異なる図面において同一の参照番号を有するアイテムは、同じ構造的なフィーチャ及び同じ機能を有するか、又は、同じ信号であることに留意されるべきである。斯様なアイテムの機能及び/又は構造が説明された場合、詳細な説明においてその反復説明の必要がない。
本発明は、多くの異なる形式における実施形態を可能とする一方で、これらは、図面において示され、本開示が、本発明の原理の例示的なものであるとみなされ、本発明を示され述べられた特定の実施形態に限定することを意図しないという理解のもとで、1又はそれ以上の特定の実施形態がここで詳細に述べられるだろう。
図1は、コンパイルシステム100を示している。システム100は、コンパイラ134を有する。また、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラム110が示される。コンパイラ134は、第1のコンピュータプログラミング言語において記述されるコンピュータプログラムをマシン言語にコンパイルするように構成される。好ましくは、第1のコンパイラは、オペランドのない形式にコンパイルするが、この制限は、例えば、条件文演算を可能にすることにより、緩和されてもよい。コンパイラ134は、テーブル142及び第2のコンピュータプログラム144を生成し、第2のコンピュータプログラム144は、テーブル142との使用のために、マシン言語にコンパイルされる第1のコンピュータプログラム110のオペランドのない形式である。
コンピュータプログラム144及びテーブル142は、コンピュータ160上で一緒に実行され得る。コンピュータ160は、マシン言語を実行し、実行するための入力オペランドのないプログラム144及びテーブル142を受信するように構成される。
図4は、演算子のないマシン言語コードの実行に適しているコンピュータ400を示している。
図4は、バス430を介してメモリ440に接続されたコンピュータプロセッサ410を示している。この特定の実施形態において、メモリ440は、2つのより小さなメモリ(不揮発性メモリ442及び揮発性メモリ444)を有する。
プロセッサ410は、汎用レジスタ422及びアドレスレジスタ424を有する。また、プログラムカウンタPCが示される。アドレスレジスタは、複数の汎用レジスタ(この場合、4つのレジスタ)で作られることに留意されたい。PCは、アドレスレジスタのように実装されてもよいが、全体としてアドレス指定可能であってもよい。
図4は、UL(unlink)及びSPとしてマークされる2つのアドレスレジスタを示している。ULレジスタは、自身でサブルーチンを呼び出さないサブルーチンへのジャンプのために、PCの値を保存するために用いられてもよい。この最適化は、一部のアドレス計算を回避し、これは、とりわけ、演算子のないものである場合に有益である。unlinkレジスタとしてのアドレスレジスタ6の使用はオプショナルである。図4は、更に、オプショナルなスタックポインタ(SP)を示す。スタックポインタは、スタックの最上位の値を指す。スタックは、パラメータを渡すため又は入れ子になったサブルーチンのために用いられてもよい。
メモリ440が2つのメモリ(より多くてもより少なくてもよい)で作られるにも関わらず、説明の容易さのために、我々は、メモリ440が平坦なアドレス空間においてアドレス指定可能であることを前提とするだろう。また、我々は、メモリ440が実行ユニット420及び対応するテーブルによる実行のための実行可能マシンコードを有することを前提とするだろう。リニアメモリモデルとも呼ばれる平坦なアドレス空間において、CPUは、メモリ分割又はページングに頼る必要なく利用可能なメモリ位置の全てに直接的に及びリニアにアドレスすることができる。しかしながら、これは必要ではなく、より小さなアドレス空間がサポートされてもよく、例えば平坦ではないアドレス空間が、例えばテーブルにおいてアドレス空間を考慮することによりサポートされてもよい。
この実施形態において、汎用レジスタは、全て同一のサイズ(即ち、双方が汎用レジスタ)を有する。レジスタのサイズがそれほど大きくない場合に、大きなテーブルをもたらすので、有利である。レジスタのための良好なサイズは8ビットである。4ビットも可能であるが、より長い実行時間をもたらすだろう。16ビットも可能であるが、これはより大きなテーブルをもたらすだろう。より大きなレジスタも考えられるが、その場合においては、使っていないレジスタ(例えば、ゼロ)の部分を残すことが好ましいかもしれない。図4は、32の汎用レジスタ(R0−R31)を示している。アドレスレジスタは、複数の汎用レジスタから作られる。
プロセッサ410は、マシン言語をサポートする。即ち、マシン言語コードを実行することができる。プロセッサ410は、レジスタ(少なくとも汎用レジスタ並びにロード及びストアアドレスレジスタ)とメモリ440との間でデータを転送するための少なくともロード及びストア演算をサポートする。一例の実施形態において、プロセッサ410は、以下の代入をサポートする:Ri :=#定数(示された場合においては0..255)、Ri := Rj; ARi := ARj; PC := ARi; ARi := PC。PCへのアドレスレジスタの代入は、ジャンプ命令と解釈されてもよい。命令は、別々のジャンプ命令としてラベル付けされてもよいが、移動演算として記録されてもよい。
また、プロセッサ410は、例えばアドレスレジスタによりアドレスされる、メモリに対する書込レジスタをサポートする。例えば、@ARi := Riは、アドレスレジスタAriを介したストアを表す。一部の他の非演算命令がサポートされてもよい(例えば、NOP、又は、データに影響しない、例えば割り込みを開始及び停止する幾つかの制御命令)。
幾つかの従来のプロセッサが上記の命令をサポートすることに注意されたい。しかしながら、斯様なプロセッサは、演算子のないプログラムにおいて用いられない多くの命令もサポートする(第1にはそれらの中の算術及び論理命令、第2には条件文の命令)。しかしながら、多くのアドレス指定モードは、演算子のないプログラムにおいては用いられない。例えば、インデックス付けされたアドレス指定モードは、算術演算である加算をもたらす。それにもかかわらず、斯様なプロセッサは、問題のある命令を用いないことにより、用いられてもよい。有利なプロセッサは、前記の命令のみをサポートする。
以下のテーブルは、幾つかの共通の演算が演算子のない態様においてどのように実装され得るかを示す。
Figure 2015537298
Figure 2015537298
サブルーチンの使用はオプショナルであることに注意されたい。
上で与えられた値(即ち、特定の値の加算又は減算)は、とりわけワードサイズ及びコンピュータアーキテクチャに合わせるために、所望の実装に適合されてもよい。
図5は、コンパイル方法500としてのフローチャートを示している。ステップ510において、第1のコンピュータプログラムが受信される。ステップ520において、例えばトークンを識別するために、語彙の分析が実行される。場合によりマクロ展開のような処理も行われる。ステップ530において、プログラムが解析される。例えば、パーサは、第1のプログラムのプログラミング言語の形式文法に従って構文解析ツリーを生成する。パーサは、プログラムにおける異なる言語構造を識別し、適切なコード生成ルーチンを呼び出す。ステップ540においてコード生成が行われる。コード生成の間、一部のコード及び必要に応じて付随するテーブルが生成される。ステップ555において、生成されたテーブルは、テーブルベースに統合される。幾つかのテーブルが複数回生成されることが生じ得るので、この場合、これらを複数回ストアすることは必要ではない。例えば、加算テーブルが必要とされてもよく、一度だけ生成されてもよい。ステップ560において、コードが生成される。ステップ565において、コードと統合することが実行される。全てのコードが統合され、全てのテーブルが統合されたときに、コンパイルは終了する。オプションとして、最適化ステップがあってもよい。
図6は、コンパイラを生成するための興味深い手段であるコンパイル方法600としてのフローチャートを示している。ステップ535において、中間コンパイルが行われる。これは、中間言語(例えば、レジスタ伝達言語等)であってもよいが、マシン言語コードコンパイルであってもよい。これは、図6のステップ510−535に関して、演算子のないものではない従来のコンパイラが用いられ得ることを意味する。しかしながら、ステップ540において、コード生成は、中間コンパイルに基づいて行われる。例えば、マシン言語コードが用いられた場合、各命令は、その命令の対応する演算子のない実装と置換される。これは、コンパイラを生成するための特定の直接的な手段を表す。図5及び6は、マシン言語ではなく第2のプログラミング言語を生成するコンパイラを生成するために用いられてもよい。
図3は、テーブルを有するメモリ310を示している。複数の単項テーブル320が示される(テーブル321,322及び323)。単項テーブルは、単一の入力に適用される演算の全ての結果をリストアップする。リストは、自然な(即ち、経時的な)順序であってもよいが、例えばサイドチャネル及びリバースエンジニアリング攻撃に対する抵抗を増大させるランダム化及び/又は難読化を増大させるために、エンコーディングが適用されてもよいことに留意されたい。
また、複数の2個一組のテーブル330が示される(2個一組のテーブル331,332,333)。テーブルは、仕上げられ、オペランドを固定して他のものを変化させることにより取得される複数の単項テーブルを有する。例えば、2個一組のテーブル331は、テーブル3311−3313(一の各々の考えられる値のための1つのテーブル、即ち、第1のオペランド)を含む。
"n"がレジスタのビットサイズであることを前提とする。単項テーブル321−323は、少なくともnゼロで終わる開始アドレスを有する。例えば、テーブル321−323は、aa, bb及びccの幾つかの値に関してそれぞれ0xaa 0xbb 0xcc 0x00のような開始アドレスを有する。2個一組のテーブルは、少なくとも2nゼロで終わる開始アドレスを有する。例えば、テーブル3311,3321及び3331は、aa, bbの幾つかの値に関してそれぞれ0xaa 0xbb 0x00 0x00のような開始アドレスを有する。これは、2個一組のテーブルにおけるテーブル検索が定数及び/又はレジスタのアドレス計算のみの連結を必要としないという利点を有する。最下位端の代わりに、ゼロビットが、他の場所に配置されてもよく、これは、メモリを介してテーブルを広げる効果を有し、難読化を増大させる。
図2は、コンパイルシステム200を示している。図2において、いわゆるMunchhausen構造が用いられる。
システム200は、第2のコンピュータプログラミング言語において記述されるコンピュータプログラムをマシン言語にコンパイルするように構成される第2のコンパイラ234を有し、第2のコンパイラは、オペランドのない形式にコンパイルするように構成される。コンパイラ234は、コンパイラ134と同じタイプでもよい。
システム200は、第1のコンピュータプログラミング言語において記述されるコンピュータプログラムをバーチャルマシンプログラム言語にコンパイルするように構成される第1のコンパイラ232を有し、第1のコンパイラは、オペランドのない形式にコンパイルするように構成される。例えば、バーチャルマシンプログラム言語は、ジャババイトコードであってもよい。コンパイラ232を構成することは、コード生成がバーチャルマシンプログラム言語において表されるコードを用いることを除いて、コンパイラ134及び234を構成することと非常に類似している。
システム200は、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラム210を示している。第1のコンピュータプログラミング言語は、コンパイラ232によりテーブル242及びコンピュータプログラム244にコンパイルされる。コンピュータプログラム244は、テーブル242との使用のために、バーチャルマシンプログラム言語にコンパイルされた第1のコンピュータプログラム210のオペランドのない形式である。
また、システム200は、バーチャルマシンプログラミング言語を解釈するように構成されるバーチャルマシンコンピュータプログラム220を示し、バーチャルマシンコンピュータプログラムは、第2のコンピュータプログラミング言語において記述される。
バーチャルマシンコンピュータプログラム220は、テーブル252及びコンピュータプログラム254にコンパイルされ、コンピュータプログラム254は、テーブル252との使用のために、マシン言語にコンパイルされたバーチャルマシンコンピュータプログラム220のオペランドのない形式である。
プログラム254は、マシン言語を実行するように構成されるコンピュータ260により実行可能である。プログラム254は、テーブル242及び252と一緒に実行し、プログラム244を解釈する。
面白いことに、テーブル242及び252は統合されてもよく、その結果、バーチャルマシンは、実行するプログラムとテーブルを共有する。典型的には、仮想マシン(VM;virtual machine)、インタプリタ又はエミュレータは、命令に関して明確に定義されたインタフェースを与えるプログラムである。
典型的に、コンパイラは、デバイスで格納される適切なソフトウェアを実行するマイクロプロセッサ(図示省略)を有するデバイスとして実装される。例えば、ソフトウェアは、ダウンロードされてもよく、対応するメモリ(例えば、RAM(図示省略))に格納されてもよい。
以下の詳細は、図2に示された実施形態を更に改良する実施形態である。制御フロー命令から離れて、VMの最も一般的な命令は、演算を実行し、その結果をストアする。これらの演算は、加算(+)、減算(-)、乗算(*)等のような良く知られた演算を含む。コンパイラは、これらの命令を対象とする。即ち、これは、一部の高いレベルの言語において記述される表現をこれらの既知の演算に分解する。
テーブルは、全ての含まれた演算(プログラムにおける演算及びプログラムが実行されるVMの演算)のために用いられ得る。セキュリティは、これらのテーブルに独自の特徴又は特性を与えることにより更に向上され得る。
あらゆる演算に関して、テーブルが用いられてもよい。テーブルは、演算に従って規定される。例えば、単項演算子に関して、Opm tableOpm [x] == Opm(x)、又は、2個一組の演算子に関して、Opd tableOpd [x][y] == Opd(x,y)。非単項演算のために、コンパイラがテーブルへのアクセスを複数のアクセスとして実装することができることに注意されたい(Curryとして知られる処理)。それは、X[y]に続くX = tableOpd[x]である。注:記憶方法は、8ビットのデータ経路、14の2個一組の演算子に関して、1メガバイトに等しいメモリ使用量を必要とするだろう。これは許容可能であるとみなされる。揮発性又は不揮発性に関わらず、幾つか又は全てのテーブルがROMにストアされてもよく、幾つか又は全てのテーブルが他のメモリにストアされてもよい点に留意されたい。
コンパイラ/リンカー及びVMの結合体は、演算使用を演算のテーブルアクセスに置換することにより維持される。根本的なプラットフォームは、ジャンプ命令並びにレジスタ及び記憶から/へ読み取り/書き込みのためにのみ用いられる必要がある。
より高度な実施形態において、コンパイラは、完全な表現をテーブルとして実装することができる。例えば、表現:X+Yは、2つの乗算及び1つの加算を介して実装され、少なくとも3つの(又はCurriedである場合にはより多くの)演算をもたらす。
しかしながら、これは、X+Yのテーブルとして実装され、このテーブルのアクセスに対してコンパイルされてもよい。これは、1つの(Curriedの場合には2つの)テーブルアクセスをもたらすだろう。コンパイラ/リンカー及びVMの間の結合体は、テーブルをVMに渡すことにより維持され得る。ラベル付けされたテーブルは、コンパイラの出力及びVMへの入力になる。コンパイラにより供給されるコードにおいて、その後、これらのラベルが参照される。これは、使っていない演算のテーブルが省略され得るので、改善記憶方法であり得る。一実施形態において、コンパイラは、第1のプログラムにおいて、値を1、2又は複数の数字の入力に割り当てる表現を識別するための表現ユニットを有し、コードジェネレータは、数字の入力の全ての値のための表現の結果を表すテーブルを生成するように構成される。面白いことに、表現は、既存のマシンコード命令に等しい必要はない。
VMは、プログラムでもあり、それ故、これらのプログラムは、例えばテーブル化された演算に向かって、演算子のない形式においてコンパイルされ得ることに再び留意されたい。VM上で実行されるべきプログラムPのためにそれを行うこと、及び、VM自体は、図2に示される4つの結果を与えるだろう。
1.VM(プログラム244)により解釈されようとするPコード
2.Pのテーブル242
3.根本的なプラットフォーム上で実際に実行するコードである、演算子のないVMコード254
4.VMテーブル252(これらのVMテーブルは、演算子のないVMコードに関連付けられる)
テーブル242は、そのコンパイルの前であっても、VMプログラム220に含まれてもよいことに注意されたい。VMのデコーダは、これらのラベル付けされたテーブルを、解釈されたコードにおけるラベルに連結する。生ずるコードは、テーブルアクセス及び場合により制御命令を行う命令のみを含める必要がある。プログラム及びVMのためのコンパイラによりそれぞれ出力されるテーブルは、VMのフレームへの設定方法及びリスト方法として加えられ得る。テーブルの設定方法の追加は、少ないテーブルしか必要としないという利点を有し、従って、格納資源が削減される。設定方法の追加は、このリストの追加が用いられる(P及びVMが共有されない自己のテーブルを有する)のを回避するために、VM及びPがテーブルに対して同じエンコーディングを用いることを必要とするという欠点を有する。
非実際的に巨大であるテーブルが必要な場合において、これらは、取り込まれた特性又は機能に関するマイクロ命令として機能する、より小さなテーブルに関してプログラムされ得る。
このセクションにおいて、我々は、高いレベルで、図2の構造のために用いられ得るVMについて述べる。VMを介して、追加の特性又は機能がプログラムに付けられてもよい。簡潔さの理由のために、我々は、加算にフォーカスする。他の演算は、同様に処理される。VMの説明の後、我々は、命令を介して特性を取り込み、特性がどのように伝播されるかについて述べるだろう。例として、我々は、難読化の特性を利用した。
簡潔さの理由のために、我々は、VMの主なコンポーネントのみを述べる。これらの主なコンポーネントは、メインループ、デコーダ及び根本的なプラットフォームのメモリ及びレジスタの使用である。
メインループは以下のように規定される。
register pc = start;
while(true)
do
{
Instruction x = fetch ( pc, memory );
Decode_and_evaluate( x );
pc = add[ pc,1];
// through the use of brackets we try to indicated that the compiler did his work and changed the operation into a table access
}
ループが始まる前に、我々は、評価されるべき第1の命令のアドレスを含むレジスタpcを参照する。
ループにおいて、我々は、以下のものを観察する。
1.pcの値によりラベル付けされた位置に配置された命令の記憶からのフェッチ
2.命令のデコード及び評価
3.レジスタ(pc)に次の命令を参照させる、レジスタpcに含まれる値のインクリメント
更に、我々は、一部のレジスタx及びyと、開始アドレスにおいて加算命令が配置されるメモリとを有する。
Registers
register x:
register y:
Memory:
...
address start add_instruction
address start+1 jmp_relative_8
...
フェッチ演算は
x = memory[ pc ];
である。
示された単純なVMの評価及びデコードのうち、我々は、演算子である加算により行われた評価及び(Cのようなスイッチによる)デコードのみを与える。
Decode_and_execute (instruction)
{
switch(instruction)
{ ...
case add_instruction: x := add[ x, y ];
...
}
}
加算は、
Add[ x, y ] == x + y;
である命令を表す。
上記のものは、用いられ得る一例のVMであり、他方で、既存のVMが述べられた態様において用いられてもよい。
面白いことに、Munchhausen VMに、難読化が与えられてもよい。命令を分かり難くするために、第1のステップは、難読化の特性を命令の既存の機能に追加することであってもよい。提示された場合においては加算命令。我々が1つの難読化関数Oを用いると仮定する。関数Oの目的は、入出力値の順序付けにより演算のセマンティックスを隠すことである。Oは、入力及び出力のセットの入替えであり得る。(addとして示される)分かり難くされた加算は、以下のように見ることができる。
add( x, y ) == O( add[O-1( x ) , O-1( y )] )
add()の入力及び出力は、分かり難くされた領域にあることに留意されたい。これは、命令自体のための結果を有する。元のセマンティックスを保つために、我々は、正しい時点で難読化及び脱難読化を行う必要があるだろう。
case add_instruction: x := O-1 ( add[O(x), O(y)] );
しかしながら、レジスタにおいて難読化された値を保つことにより、我々は、脱難読化及び難読化を省略することができ、その場合、add_instruction: x := add[ x, y ];をもたらす。
VMは、難読化された命令に関して再定義されてもよい。例えば、1つは、VM自体のメインループを実装するためにバーチャルマシンの命令を用いてもよい。再び、我々は、難読化された追加命令の使用に限定する。他命令は同様に対処される。
1つは、VMのメインループにおいて"add"があることを識別してもよい(即ち、pc := add[ pc,1];)。
同等に、難読化されたaddを用いて、我々は、pc := O-1( add[ O(pc), O(1)] );を有する。
レジスタにおいて難読化された値を保つことにより、PC = O(pc)。置換は、PC := add[ PC, O(1) ];になり得る。
注:定数は、難読化された領域に向かって上昇されなければならない。
(この単純な例におけるような)pcの他の発生は、以下のようになるだろう。
1.x = memory[ pc ];
2.pc = start;
第1のケース
x = memory[ pc ];
これは、x = memory[ O-1 ( O(pc) ) ];に等しい。
前と同じように、置換は以下のようになるだろう。
x = memory[ O-1 ( PC ) ];
memory[] over O-1を再構成することにより、我々は、x = MEMORY[ ( PC ) ];を得る。ここで、全てのx に関して、MEMORY[x] == memory[O-1(x)]。
Memory:
...
address O(start+1) ...
...
address O(start) add_instruction
...
をもたらす。
O(start+1)がO(start)の前に示されるという事実は、まさに入れ換えることを示すものである。これは、選ばれた難読化入替えに依存する。addを用いることにより互いの後に連続的に並べられた命令は、メモリにおいてランダムに分配されることに留意されたい。我々は、Oの領域及び範囲が記憶インデックスと一致するとここで暗に想定する。
第2のケースは、まさに当然の結果である。同等の命令文は、O( pc ) = O( start )になるだろう。置換することは、PC = O( start );を与える。
従って、startは、難読化された領域に上昇される(及び、メモリは、前のステップにおいて適宜入れ換えられる)。pcの全ての発生が扱われたあと、好ましくは、我々は、memory[ ]の全ての発生も扱うべきであることは明瞭であるべきである。それは、memory[ ] をMEMORY[ ]に置換することである。これは、前と同じように幾つかの他の命令のための結果を有し得る。これらの結果は、有限の数の命令しかないので、終了まで及ぶ。
我々は、命令の元の位置の間の距離及びaddを暗示的に用いるジャンプに関する命令のような命令があることを述べる。この距離は、減算により計算される。
1つは、以下のような命令を特定することができる。
jmp_relative(distance) { pc = add[ pc, distance ] }
難読化方式を適用することは、jmp_relative(y) { PC = add[ PC, y ]; }をもたらすだろう。ここで、PCは、難読化されたpcである。
しかしながら、引数yにおける問題が依然として存在する。この引数は、O (元のジャンプ命令のアドレス) - O (ターゲット==元のジャンプ命令のアドレス+距離))を介した連結で再計算されるべきである。プロセスは、根本的なプラットフォームに関する命令をテーブルに変換することにより完了される。
一部のワードは、命令及びそのデコーダの表現である。命令の表現が難読化され得ることは明らかである。これは、任意の入替えによって難読化され得る。命令及びデコーディングの表現は結合されるが、これらは、VMの他のコンポーネントへのリンクを有しない。それ故、独立した難読化であっても、命令表現とデコーダとの間で用いられ得る。
当業者にとって明らかなように、方法を実行する多くの異なる手段が考えられることに注意されたい。例えば、ステップの順序は変えられてもよく、又は、一部のステップが並列に実行されてもよい。更に、ステップの間において、他の方法ステップが挿入されてもよい。挿入されたステップは、ここで述べられたような方法の改良を表してもよく、又は、方法に無関係であってもよい。例えば、ステップ540、550及び560は、少なくとも部分的に、並列に実行されてもよい。更に、所与のステップは、次のステップが始まる前に、完全に終了していなくてもよい。
本発明による方法は、プロセッサシステムに方法500及び600を実行させることをもたらすための命令を有するソフトウェアを用いて実行されてもよい。ソフトウェアは、システムの特定のサブエンティティにより利用されるそれらのステップのみを含んでもよい。ソフトウェアは、適切な格納媒体(例えば、ハードディスク、フロッピー、メモリ等)に格納されてもよい。ソフトウェアは、有線若しくは無線に沿った信号として送られてもよく、又は、データネットワーク(例えば、インターネット)を用いてもよい。ソフトウェアは、ダウンロードに対して及び/又はサーバに対する遠隔使用に対して利用可能に行われてもよい。
本発明は、本発明を実現するために適合される、コンピュータプログラム、とりわけ担体上の又はそれにおけるコンピュータプログラムにも拡張することはいうまでもないだろう。プログラムは、部分的にコンパイルされた形式のような、ソースコード、オブジェクトコード、コード中間ソース及びオブジェクトコードの形式、又は、本発明の方法の実装における使用に適した任意の他の形式であってもよい。コンピュータプログラム製品に関する一実施形態は、記載された方法のうちの少なくとも1つの処理ステップのそれぞれに対応するコンピュータ実行可能な命令を有する。これらの命令は、サブルーチンに再分割されてもよく、及び/又は、静的又は動的に連結され得る1又はそれ以上のファイルに格納されてもよい。コンピュータプログラム製品に関する他の実施形態は、製品及び/又はシステムのうちの少なくとも1つの手段のそれぞれに対応するコンピュータ実行可能な命令を有する。
上述の実施形態は、本発明を限定するよりはむしろ例示であり、当業者は、多くの代替実施形態を設計することが可能であることが留意されるべきである。
請求項において、括弧間に配置された任意の参照符号は、請求項を限定するものとして考慮されるべきではない。"有する"という動詞の使用及びその活用は、請求項に記載されたもの以外の要素又はステップの存在を除外するものではない。要素の単数標記は、斯様な要素の複数の存在を除外するものではない。本発明は、幾つかの異なる要素を有するハードウェアによって、及び、適切にプログラムされたコンピュータによって実装されてもよい。幾つかの手段を列挙している装置に係る請求項において、これらの手段の幾つかは、ハードウェアの全く同一のアイテムにより具現化されてもよい。特定の手段が相互に異なる従属請求項に記載されるという単なる事実は、これらの手段の組み合わせが有効に用いられ得ないことを示すものではない。
100 コンパイルシステム
110 第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラム
134 第1のコンピュータプログラミング言語において記述されるコンピュータプログラムをマシン言語にコンパイルするように構成された第1のコンパイラ
142 テーブル
144 テーブル用としての第2のコンピュータプログラムのマシン言語コード
160 入力マシンコード144及びテーブル142として受信する、マシン語を実行するように構成されたコンピュータ
200 コンパイルシステム
210 第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラム
220 バーチャルマシンプログラミング言語を解釈するように構成されたバーチャルマシンコンピュータプログラム(バーチャルマシンコンピュータプログラムは、第2のコンピュータプログラミング言語において記述される)
232 第1のコンピュータプログラミング言語において記述されるコンピュータプログラムをバーチャルマシンプログラム言語にコンパイルするように構成された第1のコンパイラ
234 第2のコンピュータプログラミング言語において記述されるコンピュータプログラムをマシン言語にコンパイルするように構成された第2のコンパイラ
242 テーブル
244 テーブル242用としてのバーチャルマシンプログラム言語コード
252 テーブル
254 テーブル252用としてのバーチャルマシンコンピュータプログラム220のマシン言語コード
260 実行するための入力されたオペランドのないプログラム254として受信する、マシン語、テーブル242、252及びプログラム244を実行するように構成されたコンピュータ
310 メモリ
320 複数の単項テーブル
321−323 単項テーブル
330 複数の2個一組のテーブル
331−333 2個一組のテーブル
3311−3333 単項テーブル
400 コンピュータ
410 コンピュータプロセッサ
420 実行ユニット
422 汎用レジスタ
424 アドレスレジスタ
430 バス
440 メモリ
442 不揮発性メモリ
444 揮発性メモリ

Claims (15)

  1. 第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを第2のコンピュータプログラムにコンパイルするためのコンパイラであって、
    当該コンパイラは、テーブル及びマシン言語コードを生成することにより前記第2のコンピュータプログラムを生成するためのコードジェネレータを有し、生成されたテーブル及び生成されたマシン言語コードは、前記第2のコンピュータプログラムを一緒に形成し、生成されたマシン言語コードは、テーブルを参照し、
    当該コンパイラは、前記第1のコンピュータプログラムにおける演算又は論理表現を識別するように構成され、前記の表現は、少なくとも1つの変数に依存し、前記コードジェネレータは、前記変数の複数の値のための識別された表現の予め計算された結果を表す1又はそれ以上のテーブルを生成し、予め計算された結果を表す生成された1又はそれ以上のテーブルにアクセスすることにより前記第2のコンピュータプログラムにおいて前記識別された表現を実装するためのマシン言語コードを生成するように構成される、コンパイラ。
  2. 前記コードジェネレータは、条件文の複数の値のための識別された表現のための1又はそれ以上の予め計算された分岐テーブルを生成し、生成された1又はそれ以上の分岐テーブルにアクセスすることにより前記第2のコンピュータプログラムにおいて前記識別された表現を実装するためのマシン言語コードを生成するように構成される、請求項1に記載のコンパイラ。
  3. 前記識別された表現を実装するために生成される前記マシン言語コードは、算術又は論理マシン命令を含まない、及び/又は、条件文のマシン命令を含まない、請求項1又は請求項2に記載のコンパイラ。
  4. 前記表現を実装するための生成されたマシン言語コードは、演算子のないものであり、演算子のないマシン言語コードは、レジスタとメモリとの間のデータを転送するためのロード及びストア演算と、ジャンプ演算とのみを有する、請求項1−3のうちいずれか一項に記載のコンパイラ。
  5. 前記ロード演算は、定数、メモリアドレスに格納された値及び他のレジスタのうちの1つによりレジスタをロードするためのものであり、
    前記メモリアドレスは、1又はそれ以上のレジスタ及び/又は定数により示される、請求項4に記載のコンパイラ。
  6. 前記ストア演算は、1又はそれ以上のレジスタ及び/又は定数を1又はそれ以上のメモリアドレスにストアするためのものであり、
    前記メモリアドレスは、1又はそれ以上のレジスタ及び/又は定数により示される、請求項4又は請求項5に記載のコンパイラ。
  7. 前記ジャンプ演算は、メモリアドレスへジャンプするためのものであり、
    前記メモリアドレスは、1又はそれ以上のレジスタ及び/又は定数により示されるか、又は、メモリアドレスは、更なるメモリアドレスからの取り出される、請求項4−6のうちいずれか一項に記載のコンパイラ。
  8. 前記マシン言語は、レジスタに作用し、
    前記レジスタのサブセットは、メモリアドレスを含めるためのアドレスレジスタを形成する、請求項1−7のうちいずれか一項に記載のコンパイラ。
  9. 当該コンパイラは、前記第1のコンピュータプログラムにおいて、1又はそれ以上のデータアイテムに作用する表現を識別するように構成され、
    前記コードジェネレータは、同じアドレスレジスタのそれぞれのレジスタにおけるデータアイテムの各一つをロードし、前記アドレスレジスタがテーブル入力を示すように前記アドレスレジスタの他のレジスタにおけるデータをロードし、前記データアイテムに作用する演算子の、前記アドレスレジスタにより示された前記メモリアドレスからレジスタへの結果をロードするためのマシン言語コードを生成するように構成される、請求項1−8のうちいずれか一項に記載のコンパイラ。
  10. 当該コンパイラは、前記第1のコンピュータプログラムにおいて、条件付きのジャンプを識別するように構成され、
    前記コードジェネレータは、アドレスレジスタのレジスタにおいて条件文を示す値を保持するレジスタをロードし、前記アドレスレジスタがテーブル入力を示すように前記アドレスレジスタの他のレジスタにおけるデータをロードし、前記アドレスレジスタにより示されたメモリアドレスにある前記メモリにストアされた前記メモリアドレスまでジャンプするためのマシンコードを生成するように構成される、請求項1−9のうちいずれか一項に記載のコンパイラ。
  11. 請求項1−10のうちいずれか一項に記載のコンパイラを有する、コンピュータ。
  12. 第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを第2のコンピュータプログラムにコンパイルするためのコンパイル方法であって、
    テーブル及びマシン言語コードを生成することにより前記第2のコンピュータプログラムを生成するステップであって、生成されたテーブル及び生成されたマシン言語コードは、前記第2のコンピュータプログラムを一緒に形成し、生成されたマシン言語コードは、テーブルを参照する、ステップと、
    前記第1のコンピュータプログラムにおける算術又は論理的表現を識別するステップであって、前記表現は、少なくとも1つの変数に依存する、ステップと、
    前記変数の複数の値のための識別された表現の予め計算された結果を表す1又はそれ以上のテーブルを生成し、予め計算された結果を表す生成された1又はそれ以上のテーブルにアクセスすることにより前記第2のコンピュータプログラムにおいて前記識別された表現を実装するためにマシン言語コードを生成するステップとを有する、コンパイル方法。
  13. 前記第1のコンピュータプログラムは、第4のコンピュータプログラムを解釈するためのバーチャルマシンプログラムであり、
    当該方法は、
    更なるテーブル及び第4のプログラミング言語コードを生成することにより前記第4のコンピュータプログラムを生成することにより、第3のコンピュータプログラミング言語において記述される第3のコンピュータプログラムを第4のコンピュータプログラミング言語において記述される前記第4のコンピュータプログラムにコンパイルするステップであって、前記更なるテーブル及び前記第4のプログラミング言語コードは、前記第4のコンピュータプログラムを一緒に形成し、生成された第4のプログラミング言語コードは、更なるテーブルを参照する、ステップと、
    前記第3のコンピュータプログラムにおける算術又は論理的表現を識別するステップであって、前記表現は、少なくとも1つの変数に依存する、ステップと、
    前記変数の複数の値のための識別された表現の予め計算された結果を表す1又はそれ以上のテーブルを生成し、予め計算された結果を表す生成された1又はそれ以上のテーブルにアクセスすることにより前記第3のコンピュータプログラムにおいて前記識別された表現を実装するための第4のプログラミング言語コードを生成するステップとを有する、請求項12に記載のコンパイル方法。
  14. 第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを第2のコンピュータプログラムにコンパイルするためのコンパイラにより、第1のコンピュータプログラミング言語において記述される第1のコンピュータプログラムを第2のコンピュータプログラミング言語において記述される第2のコンピュータプログラムにコンパイルすることにより生成される第1のテーブル及び第2のプログラミング言語コードを有し、
    前記コンパイラは、テーブル及び第2のプログラミング言語コードを生成することにより前記第2のコンピュータプログラムを生成するためのコードジェネレータを有し、
    生成されたテーブル及び生成された第2のプログラミング言語コードは、前記第2のコンピュータプログラムを一緒に形成し、
    生成された第2のプログラミング言語コードは、テーブルを参照し、
    前記コンパイラは、前記第1のコンピュータプログラムにおける算術又は論理的表現を識別するように構成され、
    前記表現は、少なくとも1つの変数に依存し、
    前記コードジェネレータは、前記変数の複数の値のための識別された表現の予め計算された結果を表す1又はそれ以上のテーブルを生成し、予め計算された結果を表す生成された1又はそれ以上のテーブルにアクセスすることにより前記第2のコンピュータプログラムにおいて前記識別された表現を実装するための第2のプログラム言語コードを生成するように構成され、
    第2のテーブル及びマシン言語コードは、請求項1−10のうちいずれか一項に記載のコンパイラにより前記第2のコンピュータプログラムをマシン言語に翻訳するためにバーチャルマシンプログラムをコンパイルすることにより生成される、コンピュータプログラム。
  15. コンピュータプログラムがコンピュータ上で実行されたときに請求項12又は請求項13の全てのステップを実行するように適合されたコンピュータプログラムコード手段を有する、コンピュータプログラム。
JP2015540106A 2012-11-07 2013-10-30 演算子のないコンパイラ Expired - Fee Related JP6429785B2 (ja)

Applications Claiming Priority (5)

Application Number Priority Date Filing Date Title
US201261723410P 2012-11-07 2012-11-07
US61/723,410 2012-11-07
EP13156991.5 2013-02-27
EP13156991 2013-02-27
PCT/EP2013/072668 WO2014072209A1 (en) 2012-11-07 2013-10-30 Compiler generating operator free code

Publications (3)

Publication Number Publication Date
JP2015537298A true JP2015537298A (ja) 2015-12-24
JP2015537298A5 JP2015537298A5 (ja) 2016-11-24
JP6429785B2 JP6429785B2 (ja) 2018-11-28

Family

ID=47757443

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2015540106A Expired - Fee Related JP6429785B2 (ja) 2012-11-07 2013-10-30 演算子のないコンパイラ

Country Status (8)

Country Link
US (1) US9921813B2 (ja)
EP (1) EP2917833B1 (ja)
JP (1) JP6429785B2 (ja)
CN (1) CN104823161B (ja)
BR (1) BR112015010016A2 (ja)
MX (1) MX2015005621A (ja)
RU (1) RU2015121749A (ja)
WO (1) WO2014072209A1 (ja)

Families Citing this family (14)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US20160328539A1 (en) * 2015-05-05 2016-11-10 Nxp B.V. Obscuring Software Code With Split Variables
US10068070B2 (en) * 2015-05-05 2018-09-04 Nxp B.V. White-box elliptic curve point multiplication
CN105404497B (zh) * 2015-10-26 2018-05-25 北京锐安科技有限公司 一种逻辑表达式的解析方法及装置
CN105740215A (zh) * 2016-01-23 2016-07-06 北京掌阔移动传媒科技有限公司 一种数据通信编码和解码方法
WO2018236384A1 (en) * 2017-06-22 2018-12-27 Archeo Futurus, Inc. COMPILATION AND OPTIMIZATION OF A COMPUTER CODE BY MINIMIZING A NUMBER OF STATES IN A FINAL MACHINE CORRESPONDING TO THE COMPUTER CODE
US9996328B1 (en) 2017-06-22 2018-06-12 Archeo Futurus, Inc. Compiling and optimizing a computer code by minimizing a number of states in a finite machine corresponding to the computer code
US10481881B2 (en) 2017-06-22 2019-11-19 Archeo Futurus, Inc. Mapping a computer code to wires and gates
SG11202004146WA (en) * 2017-11-09 2020-06-29 Nchain Holdings Ltd System for simplifying executable instructions for optimised verifiable computation
EP3591550A1 (en) * 2018-07-06 2020-01-08 Koninklijke Philips N.V. A compiler device with masking function
US10996981B2 (en) * 2019-03-15 2021-05-04 Toshiba Memory Corporation Processor zero overhead task scheduling
CN110543407B (zh) * 2019-08-21 2021-11-05 杭州趣链科技有限公司 一种Solidity智能合约性能静态分析方法
CN111091612B (zh) * 2019-10-09 2023-06-02 武汉凌久微电子有限公司 一种抽象目标码架构的着色语言机器码生成方法及装置
US11921616B1 (en) * 2022-03-29 2024-03-05 Amazon Technologies, Inc. Retaining Dafny specifications
US11934810B2 (en) * 2022-05-19 2024-03-19 Microsoft Technology Licensing, Llc Translating an edit from a child computer language to a parent computer language while maintaining a semantic meaning of the edit

Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2000047874A (ja) * 1998-03-20 2000-02-18 Sun Microsyst Inc プレロ―ドクラスのフットプリント低減装置及び方法
JP2000194567A (ja) * 1998-12-25 2000-07-14 Toshiba Corp コンパイル装置、コンパイル方法、コンパイルプログラムを格納したコンピュ―タ読み取り可能な記録媒体および目的プログラムを格納したコンピュ―タ読み取り可能な記録媒体
WO2007126049A1 (ja) * 2006-04-28 2007-11-08 Panasonic Corporation プログラム難読化システム、プログラム難読化装置及びプログラム難読化方法

Family Cites Families (11)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US5781752A (en) 1996-12-26 1998-07-14 Wisconsin Alumni Research Foundation Table based data speculation circuit for parallel processing computer
JPH11110224A (ja) 1997-09-29 1999-04-23 Nec Corp 言語処理装置及び方法、並びに情報記憶媒体
CA2298990A1 (en) * 2000-02-18 2001-08-18 Cloakware Corporation Method and system for resistance to power analysis
US7996671B2 (en) 2003-11-17 2011-08-09 Bluerisc Inc. Security of program executables and microprocessors based on compiler-architecture interaction
US7703088B2 (en) * 2005-09-30 2010-04-20 Intel Corporation Compressing “warm” code in a dynamic binary translation environment
US8106463B2 (en) 2005-12-06 2012-01-31 Arm, Inc. Memory cells for read only memories
US20080127142A1 (en) 2006-11-28 2008-05-29 Microsoft Corporation Compiling executable code into a less-trusted address space
US7796671B2 (en) 2008-03-31 2010-09-14 Electro Scientific Industries, Inc. Multi-pass optical power amplifier
US9134977B2 (en) * 2010-02-26 2015-09-15 Red Hat, Inc. Compiler operation for handling conditional statements
CN102043659A (zh) * 2010-12-08 2011-05-04 上海交通大学 消除内存访问冲突的编译装置及其实现方法
EP2482184A1 (en) 2011-02-01 2012-08-01 Irdeto B.V. Adaptive obfuscated virtual machine

Patent Citations (3)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
JP2000047874A (ja) * 1998-03-20 2000-02-18 Sun Microsyst Inc プレロ―ドクラスのフットプリント低減装置及び方法
JP2000194567A (ja) * 1998-12-25 2000-07-14 Toshiba Corp コンパイル装置、コンパイル方法、コンパイルプログラムを格納したコンピュ―タ読み取り可能な記録媒体および目的プログラムを格納したコンピュ―タ読み取り可能な記録媒体
WO2007126049A1 (ja) * 2006-04-28 2007-11-08 Panasonic Corporation プログラム難読化システム、プログラム難読化装置及びプログラム難読化方法

Also Published As

Publication number Publication date
CN104823161A (zh) 2015-08-05
CN104823161B (zh) 2018-10-09
JP6429785B2 (ja) 2018-11-28
US20150277865A1 (en) 2015-10-01
EP2917833A1 (en) 2015-09-16
WO2014072209A1 (en) 2014-05-15
US9921813B2 (en) 2018-03-20
RU2015121749A (ru) 2016-12-27
MX2015005621A (es) 2015-08-20
EP2917833B1 (en) 2018-12-12
BR112015010016A2 (pt) 2017-07-11

Similar Documents

Publication Publication Date Title
JP6429785B2 (ja) 演算子のないコンパイラ
Simon et al. What you get is what you C: Controlling side effects in mainstream C compilers
Homescu et al. Profile-guided automated software diversity
Borrello et al. Constantine: Automatic side-channel resistance using efficient control and data flow linearization
CN108345773B (zh) 基于虚拟机的代码保护方法及装置、电子设备、存储介质
JP5643894B2 (ja) サイドチャネル攻撃および反復起動攻撃に耐える動的可変タイミング演算パスのシステムおよび方法
Gal et al. Trace-based just-in-time type specialization for dynamic languages
US8429637B2 (en) System and method for conditional expansion obfuscation
Van Cleemput et al. Adaptive compiler strategies for mitigating timing side channel attacks
Anckaert et al. A model for self-modifying code
Couroussé et al. Runtime code polymorphism as a protection against side channel attacks
EP2700005A1 (en) Method and apparatus for generating resource efficient computer program code
Agosta et al. A multiple equivalent execution trace approach to secure cryptographic embedded software
US10095847B2 (en) Method, system and device for protection against reverse engineering and/or tampering with programs
CN114416097A (zh) 应用程序加固方法、系统、设备及存储介质
Wichelmann et al. MAMBO–V: Dynamic Side-Channel Leakage Analysis on RISC–V
Hwang et al. Identifying Input-Dependent Jumps from Obfuscated Execution using Dynamic Data Flow Graphs
CN114003868A (zh) 一种处理软件代码的方法和电子设备
Simon et al. The GDSL toolkit: Generating frontends for the analysis of machine code
Protsenko et al. Protecting android apps against reverse engineering by the use of the native code
Barbosa et al. Compiling CAO: from cryptographic specifications to C implementations
Cornero et al. An experimental environment validating the suitability of CLI as an effective deployment format for embedded systems
Kranz et al. Gdsl: A universal toolkit for giving semantics to machine language
Abrath et al. $\Delta $ Δ Breakpad: Diversified Binary Crash Reporting
Gu et al. Constant-Time Wasmtime, for Real This Time: End-to-End Verified Zero-Overhead Constant-Time Programming for the Web and Beyond

Legal Events

Date Code Title Description
A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20161005

A621 Written request for application examination

Free format text: JAPANESE INTERMEDIATE CODE: A621

Effective date: 20161005

RD04 Notification of resignation of power of attorney

Free format text: JAPANESE INTERMEDIATE CODE: A7424

Effective date: 20170214

A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20171030

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20171114

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20180208

A131 Notification of reasons for refusal

Free format text: JAPANESE INTERMEDIATE CODE: A131

Effective date: 20180712

A521 Request for written amendment filed

Free format text: JAPANESE INTERMEDIATE CODE: A523

Effective date: 20180927

TRDD Decision of grant or rejection written
A01 Written decision to grant a patent or to grant a registration (utility model)

Free format text: JAPANESE INTERMEDIATE CODE: A01

Effective date: 20181002

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20181030

R150 Certificate of patent or registration of utility model

Ref document number: 6429785

Country of ref document: JP

Free format text: JAPANESE INTERMEDIATE CODE: R150

LAPS Cancellation because of no payment of annual fees