[go: up one dir, main page]

JP5458184B2 - 動的ファンクションコールシステムにおけるアグレッシブな自動修正のためのシステムおよび方法 - Google Patents

動的ファンクションコールシステムにおけるアグレッシブな自動修正のためのシステムおよび方法 Download PDF

Info

Publication number
JP5458184B2
JP5458184B2 JP2012532425A JP2012532425A JP5458184B2 JP 5458184 B2 JP5458184 B2 JP 5458184B2 JP 2012532425 A JP2012532425 A JP 2012532425A JP 2012532425 A JP2012532425 A JP 2012532425A JP 5458184 B2 JP5458184 B2 JP 5458184B2
Authority
JP
Japan
Prior art keywords
program
function
function call
original
call
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.)
Expired - Fee Related
Application number
JP2012532425A
Other languages
English (en)
Other versions
JP2013507670A (ja
Inventor
リム クリフォード
Original Assignee
イルデト カナダ コーポレーション
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
Application filed by イルデト カナダ コーポレーション filed Critical イルデト カナダ コーポレーション
Publication of JP2013507670A publication Critical patent/JP2013507670A/ja
Application granted granted Critical
Publication of JP5458184B2 publication Critical patent/JP5458184B2/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
    • G06F9/00Arrangements for program control, e.g. control units
    • G06F9/06Arrangements for program control, e.g. control units using stored programs, i.e. using an internal store of processing equipment to receive or retain programs
    • G06F9/44Arrangements for executing specific programs
    • G06F9/448Execution paradigms, e.g. implementations of programming paradigms
    • G06F9/4482Procedural
    • G06F9/4484Executing subprograms
    • G06F9/4486Formation of subprogram jump address
    • GPHYSICS
    • G06COMPUTING; CALCULATING OR COUNTING
    • G06FELECTRIC DIGITAL DATA PROCESSING
    • G06F21/00Security arrangements for protecting computers, components thereof, programs or data against unauthorised activity
    • G06F21/50Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems
    • G06F21/52Monitoring users, programs or devices to maintain the integrity of platforms, e.g. of processors, firmware or operating systems during program execution, e.g. stack integrity ; Preventing unwanted data erasure; Buffer overflow

Landscapes

  • Engineering & Computer Science (AREA)
  • Software Systems (AREA)
  • Theoretical Computer Science (AREA)
  • Computer Security & Cryptography (AREA)
  • Physics & Mathematics (AREA)
  • General Engineering & Computer Science (AREA)
  • General Physics & Mathematics (AREA)
  • Computer Hardware Design (AREA)
  • Debugging And Monitoring (AREA)
  • Stored Programmes (AREA)
  • Devices For Executing Special Programs (AREA)

Description

本発明は、一般に、コンピュータセキュリティの分野に関連する。より詳細には、本発明は、ファンクションコールシステムの制御フロー難読化のための方法およびシステムに関する。
難読化は、ソフトウェアコードのリバースエンジニア、コピーまたはタンパリング(以降タンパリングと称する)を複雑にすることによりソフトウェアのタンパリングを防止または遅延させる変換である。多くの場合、ソフトウェアコードのタンパリングは、遅延させるだけで十分で、ソフトウェアが、通常完了に数秒しかかからない金融取引を保護するアプリケーションである場合、特に十分である。著作権があるものの場合、タンパリングプロセスにかかる時間を十分に長くし、ソフトウェアを正規のコピーに比べて、極端に費用がかかるようにしておけば、難読化は成功である。
ソフトウェアのタンパリングには、主に2種類の攻撃が存在する。すなわち、静的攻撃と動的攻撃である。静的攻撃には、パーシャルエバリュエータ等を用いてソフトウェアを実行せずに静的に解析することを含む。動的攻撃には、メモリ内で実行されるコードを監視しかつリフティングして、リフティングした部分をキャプチャしてコードを再構成することを含む。
動的攻撃では、ファンクションコール、コールサイトならびに入口点および出口点が、攻撃者にとってプログラムの制御フローを解析し、そのコールグラフを回収するための戦略的ターゲットである。
既存の制御フローの難読化方法は、基本的にブランチとジャンプを含むローカル制御フローに適用される。これは、関数スコープに限定される。より大きな侵入の脅威は、コードのリフティングや再実装を可能にする、攻撃者によるコール構造の発見能力である。従来の呼び出しの約束についてはよく理解されているため、ファンクションコールのバウンダリ(boundary)が攻撃しやすいポイントになっている。
既存の自動修正コード技術は、主にデータオペレーションを行う直線命令ブロックに適用される。これは、オペレーションを隠す助けになり得る一方で、アプリケーションのマクロ制御レベルを隠すためにはほとんど役立たない。
C++のようなより高水準の抽象的言語の広範な使用では、アプリケーションはより低水準の言語の等価なアプリケーションに比べて、一般により多くの関数とより深い呼び出しツリーを有する。これは、現在、アプリケーションの関数バウンダリがより高いリスクにさらされていることを意味する。
たとえば、エケル他のPCT国際出願公開第2008/074483A1号公報(ここに全文を引用により援用)は、コンピュータプログラムの難読化について記載するが、たとえばデバッガを使用する、コードリフティング攻撃、動的およびステップ攻撃については扱っていない。
エケルらの文献は、アドレスを計算する方法を変更することによりファンクションコールシステムを修正する方法を開示する。修正されたファンクションコールは、実行時に代数式により計算される。その結果が、実行時に決定される関数のアドレスによるコールバイポインタファンクションコールである。
この方法は、コードリフティング攻撃からコールグラフを保護する能力を有していない。たとえば、関数定義本体が修正されることはない。簡単に静的にリフティングされ、他のプログラムで悪用され得る。また、デバッガまたは監視プログラムを使用する動的攻撃においては、ファンクションコールシーケンスが、ステップバイステップで追従されて、コードリフティングおよび/またはタンパリングのための対象の呼び出された関数を見つけられてしまう可能性がある。
また、エケルらの発明によれば、静的コールサイトは、コールバイポインタで置き換えられる。それでも、それらは依然としてコールサイトのままである。コールサイトであれば、その独自の命令の特徴により攻撃者の有用なブレークポイントとして識別されてしまう可能性がある。攻撃者が、すべてのコールサイトは、その独自の命令の特徴により攻撃者にとって有用なブレークポイントとして識別され得る。攻撃者がすべてのコールサイトをブレークし、プログラムを実行するとすれば、動的手段によってコールグラフ情報を回収することができる。
2007年発行の、マシアス・マドウによる「プログラム難読化によるアプリケーションセキュリティ(Application Security through Program Obfuscation)」と題する刊行物(ここに全文を引用により援用)は、その第5章で、データオペレーションを変更することにより命令レベルで行われるいくつかの技術を組み合わせるトレース難読化の方法を記載する。これらの技術には、多様なコードの挿入、コードファクタリングおよび難読化述語の挿入を含む。
多様なコードの挿入は、命令が存在する基本ブロックに向かって取られる経路に基づき、命令を複数の等価な命令の1つで上書きするために使用される。
コードファクタリングは、1つの命令だけが異なるコードの2つの条件ブロックを合体させる技術である。コードからなる合体ブロックへ至る条件経路には、1つの命令が上書きされて、実行される直前に正しい挙動を提供する。
第3の技術は、多様性を作り出すために、難読化述語を構成しかつこれらをコードに挿入することを含む。述語は、偽に評価したり真に評価したりする条件を有する。述語の後続部は等価だが、多様なコードを有する。
マドウの技術は、上記3つの技術すべてを組み合わせて、プログラムのトレース難読化を行うためのものである。しかしながら、マドウによる多様性技術は、データ命令の修正に限定される。難読化述語の挿入は、その挙動が予め定められたブランチの挿入のみを含む。
さらに、マドウのシステムでは、関数が呼び出されて実行されるシーケンス、順序、時期および態様が同じままである。したがって、動的攻撃は、マドウの方法で保護されるソフトウェアに対しては、依然として成功する可能性がある。
また、マドウの方法は、静的攻撃に対してはプログラムを保護しない。分離された関数は依然としてその全体に渡ってリフティングが可能であり、リフティングをされた後も継続してその元の態様で挙動する可能性がある。
したがって、プログラムのコールグラフの包括的な変換を行う、静的および動的攻撃に対抗する制御フロー難読化のための方法およびシステムの提供が求められる。
本発明の目的は、プログラムを静的および動的攻撃から保護するための、プログラムの包括的な変換を含む保護方法を提供することである。
本発明の実施例によれば、方法は、プログラムを変換するため、元のプログラムのファンクションコール構造、ファンクションコールグラフ全体およびファンクションコールレイアウトという3つのプログラム特性を理解する複雑な予備解析ステップを含む。実施例において、プログラムの変換は、構築時の関数に関連する命令の動的挿入、置換および修正の編成を含んでもよく、それにより変換されたプログラムの静的解析(静的攻撃)は、適切なファンクションコールレイアウトを示さずかつメモリで実行する際のプログラムの挙動も表示しない。構築時に計画された動的変更が、実行時に実行され、それにより変換されたプログラムの実行を監視する動的攻撃では、メモリで実行される変換されたプログラムの適切なファンクションコールグラフまたはファンクションコールレイアウトの判別は成功しない。
ある局面において、本発明は、ソフトウェアプログラムを静的および動的攻撃から保護するために、プログラムの制御フロー構造を変更することによって、プログラムを元の形式からよりセキュアな形式へ変換する方法を提供する。この方法は、プログラムの元のファンクションコール構造およびファンクションコールレイアウトを解析するステップと、元のファンクションコールレイアウトを新しいレイアウトに変換するステップと、元のファンクションコール構造を、動的自己修正を実行することができる新しい構造へ変換するステップと、変換された制御フロー構造を有するが意味的には元のプログラムと等価な変換されたプログラムを生成するステップと、プログラム実行の際に元のファンクションコールグラフを新しいファンクションコールグラフに変換するステップとを含む。
この文脈では、「意味的に等価」という用語は、「同じ結果または出力を生成する」ことと解釈する。
実施例において、動的自己修正により関数が呼び出される時期と態様が変更される。元のプログラムの解析および変換ならびに変換されたプログラムを生成するステップを、構築時に行い、かつ元のコールグラフを新しいグラフに変換するステップを、実行時に行ってもよい。プログラムの元のレイアウトおよび構造を変更するステップには、ファンクションコールレイアウトを偽装するための関数バウンダリを変更するステップを含んでもよい。実施例では、関数バウンダリを変更するステップには、関数バウンダリを壊して、2つ以上の関数を1つの関数に結合するステップを含んでもよい。他の実施例では、関数バウンダリを変更するステップが、新たな関数バウンダリを挿入して関数を2つ以上の関数に分割するステップを含む。
方法は、プログラムにダメージを行うステップをさらに含み、そのダメージが、ファンクションコール構造をさらに偽装しかつ元のプログラムに対して機能的等価性を維持するための1以上のフィックスアップダメージにより追随される1以上の改変性のダメージを含んでもよい。
実施例において、元のプログラムを解析するステップが、プログラムを修正するためのプログラムにおける戦略ポイントを決定しかつ/または複雑な予備解析工程を行って、プログラムのファンクションコール構造、ファンクションコールレイアウトおよびファンクションコールグラフ全体を理解するステップ含む。修正ポイントが、対応の実行ポイントから物理的かつ時間的に遠いポイントに配置されてもよい。実施例において、1つの実行ポイントについて複数の修正ポイントを設ける。
他の局面では、本発明は、静的および動的攻撃からプログラムを保護するために、プログラムの制御フロー構造を変更することにより、ソフトウェアプログラムを元の形式からよりセキュアな形式に変換する方法を提供する。この方法は、構築時フェーズと実行時フェーズを含む。構築時フェーズは、プログラムの元のファンクションコール構造およびファンクションコールレイアウトを解析するステップと、プログラムの元のファンクションコールレイアウトを新しいファンクションコールレイアウトに変換するステップと、ファンクションコール構造を動的修正を行うことができる新しいファンクションコール構造に変換するステップと、変換された制御フロー構造を有するが、意味的には元のプログラムに等価な変換されたプログラムを生成するステップとを含む。実行時フェーズが、プログラムの実行に際して、プログラムの元のファンクションコールグラフを新しいファンクションコールグラフに変換するステップを含み、実行時に行われる動的修正が、構築時に行われる変更に相補的で、元のプログラムに対して意味的に等価な変換されたプログラムを生成する。
さらに他の局面では、本発明は、ステートメントおよび命令を記録したコンピュータ可読メモリを提供し、これは、ソフトウェアプログラムを動的および静的攻撃から保護するためプログラムの制御フロー構造を変更することにより、プログラムを元の形式からよりセキュアな形式に変換するためのものであり、前記ステートメントおよび命令は、プロセッサにより実行されると、プロセッサが、プログラムの元のファンクションコール構造およびファンクションコールレイアウトを解析するステップと、元のファンクションコールレイアウトを新しいレイアウトに変換するステップと、元のファンクションコール構造を、動的自己修正を行うことができる新しい構造に変換するステップと、変換された制御フロー構造を有するが、元のプログラムに意味的には等価な変換されたプログラムを生成するステップと、プログラムの実行に際して、元のファンクションコールグラフを新しいファンクションコールグラフに変換するステップとを実行する。
本発明の他の局面および特徴については、添付の図面とともに以下の本発明の特定の実施例の説明を参照すれば、当業者には明らかになるであろう。
本発明の実施例について、添付の図面を参照し、もっぱら例示を目的として、以下に説明する。
元の形式のプログラムの従来のファンクションレイアウト、コールグラフおよびファンクションコールシーケンスを示す図である。 本発明の実施例により、図1に示すプログラムが変換されたバージョンを示す図である。 図2の変換されたプログラムの実行時プロセスおよび動的修正を示す図である。 本発明の実施例により、すでに実行された命令について、プログラムにダメージを施すことができる方法の例を示す図である。 図1に示す元のプログラムのコールシーケンスと図2、図3aおよび図3bに示す変換されたプログラムの動的コールシーケンスを対比して示すフロー図である。 (a)から(c)は、本発明の実施例による、メインエントリ関数以外の関数を有していないプログラムのための動的コールシステムを実装する場合の実行時プロセスを示す図である。 本発明の実施例によるプログラムを変換するステップを示すフローチャートである。 従来のシステム上で実行するためのアプリケーションプログラムを構築するために使用する従来のツールのセットを示す図である。 本発明の実施例による動的ファンクションコールシステムにおいて使用される構築ツールの例を示す図である。 本発明の実施例による、元のプログラムを、静的および動的攻撃に対してセキュアな保護されたプログラムに変換するためのシステムの例示的実施例を示す図である。 動的ファンクションコールシステムのための代替的オペレーションセットアップを示す図である。 動的ファンクションコールシステムのための代替的オペレーションセットアップを示す図である。 動的ファンクションコールシステムのための代替的オペレーションセットアップを示す図である。
本発明の実施例は、プログラムを第1の形式から静的および動的攻撃に耐性があるよりセキュアな形式に変換するためのソフトウェア難読化のためのシステムおよび方法を提供する。実施例において、この方法は、プログラムを変更するためのプログラムにおける戦略的ポイントを判別するため、プログラムのファンクションコール構造、ファンクションコールレイアウトおよびファンクションコールグラフ全体を理解する複雑な予備解析ステップを使用する。この方法は、元のファンクションコールレイアウトを新たなレイアウトに変換することにより静的攻撃に対する耐性を付与する。実施例において、レイアウトの変更は、関数バウンダリを変更することを含んでもよい。この方法はまた、元のファンクションコール構造を、変換されたプログラムをメモリで実行すると自己修正することができる新しい構造に変換することにより静的攻撃に対する耐性を付与する。実施例において、ファンクションコール構造の変更は、関数を呼び出す時期と方法を修正することおよび/または同じ結果に至る実行のランダムな経路を選択することを含んでもよい。変換されたプログラムは、意味的には元のプログラムと等価でも、静的および動的攻撃に対してより耐性のあるものになる。
これ以降の説明において、ファンクションコールグラフ、ファンクションコール構造、ファンクションコールレイアウトおよび制御フロー構造は、以下のように解釈する。
・ファンクションコールグラフとは、プログラムをメモリ内で実行する際に、関数の識別と実行のために呼び出される関数の態様、順序、時期、および継続時間との関係である。ファンクションコールグラフは、通常ハッカーが動的攻撃を行うために監視する。
・ファンクションコール構造は、実行の際のプログラムの挙動を決定する構造である。関数の構造を構成するプログラムコード、バウンダリ、入力/出力の約束および呼び出しの約束ならびに関数が呼び出され実行される方法および時期を含む。
・ファンクションコールレイアウトは、プログラムがストアされ、実行されていない時、静的観点から、ファンクションコール構造がどのように見えるか、すなわち、関数の数、順序、およびバウンダリ他である。ファンクションコールレイアウトは、攻撃者がコードリフティングおよびタンパリング等の静的攻撃を行うために調べるものである。
・制御フロー構造は、プログラムを介する制御の変更を可能にするオペレーションのセットである。ローカルレベルでは、これには、ブランチとジャンプとが含まれる。プログラムレベルでは、制御フロー構造は、ファンクションコール構造、ファンクションコールレイアウト、ジャンプおよびブランチ、リターン、スレッディングならびに例外処理が含まれる。
本発明の実施例によれば、プログラムの変換は、以下の2つのフェーズを含む。
・構築時−実行前にプログラムを静的に解析し変更する時。このフェーズには、戦略ポイントを決定するためのプログラムの解析ならびにデコイの挿入、新関数の創出、ファンクションコールの挿入、関数バウンダリ等の変更およびファンクションコール構造の変更によるプログラムの変換を含む。
・実行時−変換されたプログラムをメモリ内で実行する時。新しいファンクションコール構造は、自己修正を行いかつファンクションコールグラフを変更する。プログラムが実行されると、関数が呼び出される時期と方法が修正されることにより、ファンクションコールグラフ全体が、修正される。
本発明の実施例によれば、方法は、元のプログラムのファンクションコール構造、ファンクションコールグラフ全体およびファンクションコールレイアウトの3つのプログラム特性を理解するための複雑な予備解析ステップを含む。実施例において、上記のマドウの発明のように、もっぱらブランチレベルのみでデータ命令を変更する場合とは異なり、方法はプログラム全体のレベルで制御フローを考える。プログラムが元のままでかつ難読化や隠されていない場合には、予備解析ステップによって、対応のファンクションコールグラフおよび関数バウンダリのための適切なファンクションコール構造を検出することができる。したがって、プログラムがその元の形式である場合は、これら3つのプログラム特性が互いに一致する。
本発明の実施例によれば、プログラムの変換は、構築時の関数関連の命令の動的挿入、置換および修正の編成を含む。したがって、プログラムが構築時に変換された後は、変換後のプログラムにおいて、3つのプログラム特性は、いずれも相互に一致しない。変換されたプログラムは、新しいファンクションコール構造と、新しいファンクションコールレイアウトを有する。言い換えれば、プログラムの適切なファンクションコール構造は、静的または動的攻撃を行うことによってはもはや判別することができない。特に、変換されたプログラムの静的解析(静的攻撃)では、適切なファンクションコールレイアウトを表示しないので、メモリで実行されるプログラムの挙動も表示しない。その後も、静的攻撃では、変換されたプログラムの適切なファンクションコール構造を表示できない。一方で、メモリにおける変換されたプログラムの実行を監視する動的攻撃は、監視するファンクションコールグラフからは、変換されたプログラムの適切なファンクションコール構造も、ファンクションコールレイアウトの判別にも成功しない。これは、変換されたプログラムが、メモリで実行される際に、自己修正を行うからである。この修正には、異なる順序、異なる時期で関数を実行することと、同じ結果に至る実行のランダムパスを選択することとを含んでもよい。したがって、変換されたプログラムは、静的および動的攻撃に対してよりセキュアであり、かつ適切なファンクションコール構造はよりよく保護される。
好ましい実施例では、変換された制御フロー構造は、新しいファンクションコールレイアウトおよび新しいファンクションコール構造を含む。他の実施例では、変換されたファンクションコール構造は、ジャンプおよびブランチ、例外ならびにリターンのうち1つ以上を含んでもよい。
変換されたプログラムをメモリで実行する場合、プログラムレベルでは、プログラムの実行を監視する攻撃者は、適切なファンクションコールグラフを検出できないし、元のプログラムの適切なファンクションコールレイアウトや構造も判別できない。したがって、攻撃者は、非常にローカルなレベル、すなわちコードの現在の実行ポイントで、プログラムの実行を監視するにとどまると考えられる。しかしながら、プログラムレベルでは、攻撃者は、たとえプログラムコードの全実行ポイントについての情報を収集しても、プログラムを再構成することはできない。これは、変換されたプログラムの制御フローおよびファンクションコールグラフが、元のプログラムのものとは異なるためである。
変換されたプログラムをメモリで実行しながら、元のアプリケーションのファンクションコール、リターンステートメント、関数入口点およびファンクションレイアウトバウンダリが動的に変化して、プログラムの作者が意図する元のファンクションコールシステムを静的および/動的攻撃から隠す。こうして、静的解析または動的解析いずれによる場合も、プログラムのタンパリングの容易性は低減される。
ファンクションコールレイアウトは、関数間のバウンダリを壊すかまたは変更することにより新しいファンクションコールレイアウトに変換することができる。結果として、攻撃者は、実行時、動的攻撃を用いて関数の入口および出口を判別することができず、またプログラムがストアされている場合、静的攻撃を用いて変換されたプログラムのファンクションコール構造またはファンクションコールレイアウトを判別することができない。これは、プログラムのファンクションコールレイアウトが偽装されているからである。関数本体に対するこれらの修正により、攻撃者が、完全無傷の関数本体をリフティングする危険性が低減される。
関数本体内のコールサイトも、削除または挿入を含めて修正することが可能である。新たな関数を創出して、新しいコールサイトを用いて呼び出してもよい。コールサイトは、静的には明白になっていない。これらのサイトは、実行時に動的に挿入され得る。さらに、コールサイトがプログラムに挿入されるポイントは、その呼び出しが行われる時期とは無関係である。たとえば、実行時、プログラムは、何らかの呼び出しが行われる前に、プログラムに100を超える数の異なるコールサイトを挿入したり削除したりすることが可能である。実施例では、コールサイトを挿入または削除する時期および態様ならびに関数が呼び出される時期を変更可能である。たとえば、関数への呼び出しを遅延させ、他のコードでコールサイトを置換し、いくつかの関数他より先に呼び出し、これまでに行われたまたはこれから行おうとしている呼び出しの証拠を隠し、実行の順序を変更することが可能で、またこれらの技術を組み合わせることもできる。
従来のファンクションコールリターンABI(アプリケーションバイナリインターフェース、Application-Binary Interface)は、アプリケーションがメモリ内で実行されている時に修正され得る新しいABIへ変換される(実行時プロセス)。また、構築時(セキュリティ要素および反タンパリング技術が保護対象のアプリケーションに適用される時)に関数の複製を構築して、実行時に複数のコードパスが出来るようにする。
構築時、プログラムは、ファンクションコールの約束のバウンダリが動的に修正され得るようにセットアップされる。これらの関数バウンダリは、コールサイト、リターンポイント、エントリ命令、関数の開始および終了等を含む。本発明の実施例では、非決定論を用いてコールグラフによる実行の経路をランダムに選択しており、一方、確実に元のプログラムに意味的に等価になっている。非決定論は、有効な結果に至る複数の経路の1つをランダムに選択するアルゴリズムである。
実施例において、変換されたプログラムを、これが実行される場合は常に異なるファンクションコールグラフを得るよう設定する。こうして、メモリにおける変換されたプログラムの実行を監視する攻撃者は、異なる実行時に異なる結果を得ると考えられる。しかしながら、どの時期に得られた結果でも、攻撃者を元のプログラムの正確なファンクションコール構造またはレイアウトには導かない。
変換されたプログラムを介して実行が進むと、命令は動的に修正され、それによりコールサイトおよび関数バウンダリは、実行の前後で変更される。本発明の実施例では、命令が修正される(挿入、削除または変更される)プログラムのポイントが、修正された命令が実行される前または後の適切なポイントで発生する。修正された命令の実行に先立って発生する修正点については、修正がどれほど早くまたは遅く発生するかが問題ではなく、修正が命令実行に先だって生じることだけが重要である。
本発明の他の実施例では、命令がどのように修正されているかを攻撃者に識別さないようにかつまた修正と修正された命令の実行との関係を判別することができないように、修正ポイントは、少なくとも1命令分対応の命令から離されている。したがって、対応する実行ポイントから物理的に離れたポイントに修正ポイントを置くこと、たとえば間に他の実行点または他のコードを挟んだりすることが好ましい。
実施例において、修正ポイントを、アナライザ/コンパイラが、対応の実行ポイントの前に実行されるとわかっている関数内に置くことにより、対応の実行ポイントから修正ポイントを離してもよい。この解析を、支配関係解析と呼ぶ。修正ポイントは、実行ポイントと一対一対応でなくてもよい。これらは、多数対一または一対多数でもよい。たとえば、ある実行ポイントに到達する前に、追従するいくつかの修正ポイントを設けてもよい。
この方法は、ファンクションレイアウトおよびコールシーケンスを静的系の侵入(ディスアセンブリ、デコンパイラ等)から隠し、ファンクションレイアウトおよびコールシーケンスを動的系の侵入(デバッガ、エミュレータ等)から隠しかつコードリフティングおよびタンパリング攻撃をより困難にすることにより、不正使用の攻撃に対する耐性を付与する。その結果、新しいファンクションコールレイアウトおよび新しいファンクションコール構造を含む新しい制御フロー構造を有する変換されたプログラムが得られる。変換されたプログラムは、元のプログラムに意味的には等価だが、同時にタンパリング、コードリフティングならびに静的および動的攻撃に対してより耐性がある。
図1は、元の調整がされていない形式のプログラムまたはアプリケーションの従来のファンクションレイアウト、コールグラフおよびファンクションコールシーケンスの例である。直線的な従来のシーケンスで、各関数が呼び出され、実行されリターンされる。図1に示すように、元のコールシーケンスは以下のとおりである。すなわち、システムがMainを呼び出し、MainがFunction_1を呼び出すことにより実行を開始、Function_1がFunction_2を呼び出し、Function_2がFunction_1をリターン、その後、Function_1がFunciton_4を呼び出し、Function_4がFunction_1をリターン、その後、Function_1がMainにリターンし、Mainがシステムにリターンする。
図2は、本発明の実施例による図1に示すプログラムの変換されたバージョンを示す。図示のプログラムは、構築時後の、変換され「プリロードされた」プログラムである。図2に例示する変換後のプログラムは、あるファンクションコールシーケンスを有するように見えるが、実行時にコードが動的に修正されるため、実際には別のファンクションコールシーケンスを実行する。構築時、多くのコード操作準備ステップを実行し、その中には、実行時にコード修正を簡素化する新しいABIで従来のファンクションコールの約束を置換するステップと、レイアウトを偽装するよう関数バウンダリを修正するステップと、コールサイトポイントをデコイコール、デコイ命令等で修正するステップと、ストレートライン命令をコールサイトで置換するステップと、複製関数を挿入するステップと、付加的関数を挿入するステップとを含む。
図2に示すとおり、新しいcall function_5を創出して挿入し、かつ以前のcall Function_2(図1に示す)は削除されている。Funciton_1のバウンダリも、call Function_4をFunction_3へのコールサイトで置換することにより元のFuncton_1を修正済みFunction_1および新Function_3に分割し、かつFunction_3内にFunction_4へのコールサイトを挿入することにより、変更されている。上記の手段は構築時に行われ、攻撃者の目を、真のファンクションコールレイアウトおよび呼び出し構造からそらす役割をする。
図3aは、図2の変換されたプログラムの実行時プロセスおよび動的修正の例を示す図である。変換プログラムを実行すると、修正ポイントはファンクションコール特性を変更する。修正ポイントがいくつかのコード部分を修正して、プログラムの適正な実行を確実に行いかつ攻撃者から情報を隠すためいくつかのコード部分にダメージを与える。構築時と実行時との間で行われるこれらの相補的変更により、元のプログラムと意味的には同様でも、攻撃者を混乱させる異なるファンクションコール特性を有する変換されたプログラムが得られる。
図3の例では、mainが実行を開始、続いてFunction_1、これが次にFunction_5を呼び出す。元のプログラムではFunciton_5は発生しなかったが、構築時のプログラム解析の際にコンパイラにより挿入されている。Function_5は、図2に示す通り、構築時図1に示す元のプログラムからは削除されたFunction_2へのコールサイトを挿入することによりFunction_1の修正を行う。制御がFunction_1に戻ると、Function_2が呼び出され、これが、Function_3への呼び出しからの次のコールサイトをFunciton_4への呼び出しに修正することによりFunction_1の修正を行う。Funciton_4が呼び出されると、Returnをno operation(NOP)でかつCall Function_4をNOPで置換することによって、Function_1とFunciton_3との間のバウンダリが削除され、Function_1を再び図1の元のプログラムにあるような1つの大きな関数にする。制御は、Funciton_1に戻り、そしてmainに戻る。
静的および動的攻撃に対してよりセキュアな制御システムを編成するために、同様の方法により動的にダメージを発生させることができる。プログラムへのダメージは、プログラムを改変し、不正確に機能させるプログラムに対する修正である。図2および図3aに例示される動的変更とダメージの差は、動的変更の場合、変換されたプログラムが実行の際にいずれの時期においても静的に十分に正しいが、予期しない態様で実行される。対照的に、図3bにあるような改変性のダメージを含む保護されるプログラムは、改変性ダメージの後は、後に実行時に改変性のダメージを治すフィックスアップ修正が発生するまで不正確に(プログラムの作者が意図したとおりではない等)実行される。
フィックスアップ修正は、対応する改変性ダメージから変換されたプログラムを訂正し、確実に元のプログラムに意味的に等価にする。図2および図3aに示す修正と同様、ダメージは、構築時に計画されかつ実行時に実行される。本発明の実施例において、1つの改変性ダメージについて1を超える数のフィックスアップ修正を有することができる。ダメージとそれらの対応するフィックスアップ修正は、これらに限定されるわけではないが、以下の複数の目的のために役立つ。
1.すでに実行された命令を隠す。
2.後の実行のため命令の状態を準備する。
3.さらなるダメージおよび/または修正のためプログラムを準備する。
図3bは、すでに実行された命令について、プログラムにどのようにダメージを施すことができるかの例を示す図である。プログラムが、解析システムが計画した通りにすでにコードのいくつかのセクションを実行したと仮定して、プログラムの真のコール構造を難読化するために使用するダメージを発生させることができる。図3bを参照して、Function_1が実行を開始したポイントであり、Function_2が実行を終了したポイントであり、Function_4が実行を開始したポイントであるポイント300を考える。Function_4は、次の2つのダメージを行う。
1.Function_4における命令(またはいくつかの命令のセット)が、すでに発生した関数への呼び出し(Call Function_2等)を削除する。
2.また、Function_4は、元のプログラムに発生していないFunction_6への呼び出しを挿入する。
第1のダメージによりFunction_4が呼び出されたとする証拠が削除され、かつ第2のダメージによりさらなるダメージを発生するFunction_6への呼び出しを挿入する。
Function_6への呼び出しに到達すると、Funciton_6が4つのフィックスアップ修正を実行する。
1.Function_6が、元のプログラムに発生しなかったFunction_5への呼び出しを挿入する(第1のステップでは、Function_5が自動修正に使用されることを想起されたい)。
これは、後の起動のためのプログラムの状態の準備である。
2.Function_6が、Call to Function_4を修正して、Call to Function_3になるようにする。
3.Function_6が、すでに実行されているので、自己への呼び出しを削除する。
4.Function_6は、Function_1にリターンステートメントを挿入することによりFunction_3バウンダリを挿入し、Call to Function_4を挿入することにより、効果的にFunciton_1のレイアウトに終了をかつFunciton_3のレイアウトに開始を作り出す。
ダメージのすべてと対応するフィックスアップ修正が発生した後、変更されたプログラムにおける実行の結果は、図2に示す構築時に予め計画した修正と調和のとれたものになる。言い換えれば、ダメージのすべておよびフィックスアップ修正の発生後も、元のプログラムに対する意味的な等価性が維持される。図3bは、構築時に実行される予備修正と調和するように、プログラムのコール構造に対してダメージおよびフィックスアップ修正がどのように行われ得るかの一例のみを示す図である。
動的変更および/またはダメージを実装するコードが、変更されたプログラムに挿入される。コードは、関数の形をとるか、適切なプログラム内のいくつかのコードとして挿入され得る。コード自体は、ホワイトボックス暗号、データ変換、完全性検証または類似の技術を使用して保護される。同一所有者による米国特許第7,397,916号および米国特許出願第11/020,313号および米国特許出願第61/175,945号(ここに全文を引用により援用)を本発明のプログラム内のコードを保護するために使用してもよい。
図4は、図1に示す関数の元のコールシーケンスを、図2および図3aに示す変換されたプログラムの動的コールシーケンスと対比して示すフロー図である。図4に示すとおり、Mainがfunction1を呼び出しした後、メモリにおいて実行されると変換されたプログラムの挙動が動的に変化する。例えば、動的コールシーケンスにおいて、Function_5は、Function_1の後でかつFunction2の前に呼び出されており、元のコールシーケンスでは、Function_5は、存在していない。上記のとおり、Function_5は、構築時に挿入される。さらに、Function_2は、call function_4をcall Function_3で置換することによりFunction_1を修正する。Function_3は、図1および図2に示す元のFunction_1の一区分である。Figure_1を図1にあるような元の大きさにするため、Function_4は、実行時にFunction_1とFunction_3との間のバウンダリを取り除き、これにより構築時に実行した変更を修正する。
図4に示す実施例において、関数は修正され、様々な時期に様々な態様で呼び出され、関数バウンダリは変更され、かつ新しい関数が導入され削除される。
保護されるプログラムの実行を監視する攻撃者は、以下のものを入手すると考えられる。
・見せかけの関数および見せかけのファンクションコールレイアウト。これは、たとえば関数の出入口を変更することにより関数バウンダリが変更され、いくつかの関数が複製され、かつ元のプログラムに含まれていないいくつかの関数が、システムにより創出され得るからである。
・各関数の見せかけの実行時間。これは、関数が予め遅延または呼び出しをされ得るためである。
・見せかけの実行順序。これは、元のプログラムと比較すると、いくつかの関数が他の関数より前に実行され得るからである。
・見せかけのファンクションコールグラフ。これは、関数が分けられかつ/または結合され、かつたとえば非決定論を用いるなどして、ランダムな実行経路を選択でき、元のプログラムと機能的な等価性は維持するものの、メモリで実行する際には異なって見えるためである。
図5(a)は、図5(a)に示すMainエントリ関数以外の関数を有していないプログラムのための動的コールシステムを実装する際の実行時プロセスを示す。実行時、このプログラムを解析して、プログラムを動的に変化するプログラムに変換するための戦略ポイントを決定する。図5(a)に示す、Main内のFunction_Aのためのバウンダリ、入口、出口およびコールサイトを作ることにより、Mainのバウンダリが実行に伴い変更される。図5(b)に示す通り、Function_Aを実行した後で、Function_Aのバウンダリ、コールサイトおよび出入口を削除する。
図5(c)に示す通り、Function_Aのバウンダリ、コールサイトおよび出入口は実行の後削除されており、Mainは、変換がまるでなかったかのように見える。しかしながら、攻撃者の視点からは、タンパリングが成功していないことになる。これは、見せかけのコールグラフ情報を提供されているはずだからである。
他の極端な例では、静的に過剰な数の関数を有するようにプログラムをセットアップすることが考えられる。実行時、関数バウンダリが、より大きな関数に組み込まれる一方で、元のプログラムと意味的には等価な変換されたプログラムを提供する。
図6は、本発明の実施例に従い、プログラムを変換するステップを示すフローチャートである。図6に示す通り、ステップ600で、保護対象のもとのプログラムを解析して、ファンクションコール構造およびファンクションコールレイアウトを理解する。ステップ602で、メモリにストアされた際に、攻撃者が静的に解析すれば、変換後のプログラムが異なって見えるように、元のファンクションコールレイアウトを新しいレイアウトに変更する。ステップ604で、ファンクションコール構造を、変更されたプログラムの実行の際に動的自動修正ができる新しいファンクションコール構造に変換する。ステップ606で、ステップ604および606で予め計画した変更に従って、メモリにおけるプログラムの実行の際に、元のファンクションコールグラフを新しいグラフに変換する。
関数のコールサイト、リターンポイント、エントリ命令、開始および終了等の関数バウンダリを動的に修正してより大きいまたは小さい関数にできるようプログラムを変換する。関数バウンダリ内のコールサイトも削除または挿入を含む修正を行うことができる。関数バウンダリを実行の前後で変更して、静的および動的攻撃に抵抗する。関数複製、デコイおよび追加の命令を挿入して静的および動的攻撃がより困難になるようにする。
ステップ608で、元のプログラムと意味的に等価な変換されたプログラムを生成する。保護されるプログラムは、静的に解析すると元のプログラムとは異なっており、メモリで実行される際に自己修正して、動的攻撃およびコードリフティングに抵抗することができる。
実施例では、プログラムの変換の前に元のプログラムを解析して各関数について重要性のレベルを決定し、セキュリティの目的または性能の目標について重要な関数を強調することにする。
セキュリティ目的については、ある関数がセキュアなアセットを含むかまたはトラストキーのルート(root of trust key)等のセキュリティシステムの重要な部分を計算し得るので、ユーザがこれを重要として識別することができる。これは、その関数がセキュリティ的観点から重要である旨表示するために、言語拡張またはコマンドラインインターフェース等の外部手段を介して行ってもよい。この場合、変換システムはこの特定の関数について、難読化の作業を強調することができる。
性能目的では、コンパイラで静的プロファイリングまたは実プロファイリング手段でしばしば実行される関数を識別することができる。性能に関する考慮を重要とするいくつかの実施例においては、実行の頻度が高い関数については、素早く実行することが知られている変換をその関数用に選択することが考えられる。
図7は、ネイティブシステム上で実行するためのアプリケーションプログラムを構築するために使用される従来のツールのセットを示す。この場合に使用される主要なツールは、コンパイラとリンカであり、これらは、従来は2つの別々のツールであるが、同じツールに組み合わせることができる場合もある。また、これらを、2を超える数のツールに分けられる場合もある。コンパイラの主要な機能は、アプリケーションプログラムファイルの構文および意味解析を行い、最適化を行いかつリンカのためのコードを生成することである。リンカは、プログラムおよびデータセグメントを、組み合わせられると実行に必要なバイナリファイルまたはバイナリファイルのセットを形成するレイアウトに配置転換する。実行は、ヴァーチャルマシン上でネイティブまたはヴァーチャル化することができる。
図8は、本発明の実施例に従う動的ファンクションコールシステムにおける構築ツールの例を示す図である。図8は、図7に示す従来のツールに対する2つの新しいツール、すなわちコンパイラレベルの解析ツールとリンクレベルの解析ツールとを示す。コンパイラレベルの解析ツールは、従来のコンパイラレベルの処理と関連しており、ネイティブコンパイラの前後に独立してまたは従来のコンパイラの代替物として実行され得る。また、これは、ネイティブリンカまたはネイティブリンカの代替物の前後に独立して実行することもできる。図8に示すように、コンパイラレベルの解析ツールは、ネイティブコンパイラの前に実行される。同様に、リンクレベルの解析ツールは、リンクレベルの処理と関連する。また、これは、ネイティブリンカの前後に独立してまたはネイティブリンカの代替物として実行することができる。
コンパイラレベルでは、アプリケーションプログラムのフルファンクションコールグラフを解析して、「メイコール」(may−call)および「マストコール」(must call)表現で表すことができる。これらのコール表現をその後、グローバルに解析して命令の挿入、削除および修正を割り振ることができる。元のプログラムは、動的修正のためにコンパイラレベルで戦略的に修正される。
関数バウンダリを解析し、リンクレベルでの消費に備えて、情報を準備することが可能である。リンクレベルでは、プログラムセグメントは、どの関数を相互にまたどの順序で隣接させる必要があるかを含むコンパイラレベルから伝達されるレイアウト情報に従い配置する。これにより、関数バウンダリの動的修正を行うことができる。さらに、追加の静的ライブラリおよび/またはオブジェクトコードをブログラム内にリンクさせて、命令修正等の副次的オペレーションを行う。リンクレベルでは、動的修正システムに必要なコンポーネントは、実行可能なバイナリまたはバイナリセットで配置される。
図9は、プログラムのファンクションコールレイアウトを変更しかつそのファンクションコール構造を、プログラム実行時に動的に自己修正できる新しい構造に変換することにより、プログラムを元の形式から静的および動的攻撃に対抗してよりセキュアな形式に変換し、それによりメモリにおける変換されたプログラムの実行を監視する攻撃者に、見せかけのファンクションコールグラフを与えるようにするためのシステム900の実施例を示す。
図9に示す実施例において、システム900は、少なくとも2台のコンピュータ902および904を含む。コンピュータ902は、CPU906、メモリ908、図8に示す構築ツール910のセットおよび入力出力モジュール(I/O)912を含む。コンピュータ904は、CPU914,メモリ916およびI/O918を含む。コンピュータ902は、変換対象の元のプログラムを受けて、構築時プロセスを実行して、プログラムのファンクションコールレイアウトおよびファンクションコール構造を変更する。変換されたプログラムは、次にコンピュータ904へ転送されてストアおよび/または実行される。変換されたプログラムは、コミュニケーションリンクまたはCD、DVDおよびUSBドライブ等のコンピュータ可読メモリまたは何らかの他の手段によりコンピュータ904へ転送されてもよい。
変換されたプログラムは元のプログラムと意味的には等価だが、静的および動的攻撃に対してよりセキュアである。変換されたプログラムは、コンピュータ904上にストアされ、ファンクションコールレイアウトが、元のプログラムの真のレイアウトを反映していないため、静的攻撃に耐性がある。こうして、変換されたプログラムのファンクションコールレイアウトの解析を試みる襲撃者は、保護されるプログラムにおける関数の関数バウンダリ、コールサイトおよび実行の順序が、コンパイラ/リンカにより変更されるために、見せかけのレイアウトを入手することになる。変換されたプログラムがコンピュータ904によって実行されると、変換されたプログラムの実行とともにファンクションコール構造が自己修正を行い、それにより関数が呼び出される時期と方法を変更することで元のファンクションコールグラフを変更する。
実施例において、関数バウンダリの修正を行うコードは、プログラムと同じ実行スレッドにある必要はない。随意には、同時実行のスレッドまたはプログラムコードとオペレーティングシステム(OS)との間にあるヴァーチャルマシン層に置くことができる。したがって、修正コードはプログラムとは独立しており、プログラムの機能性と関連付けてまたは切り離して実行することができる。代替的には、関連付けおよび分離のアプローチを組み合わせることもできる。
図10aから図10cは、発明の実施例による動的ファンクションコールシステムのための代替的オペレーションセットアップを示す図である。
図10aは、アプリケーションプログラムとオペレーティングシステム(OS)との間に置かれたアプリケーションヴァーチャルマシンを示す図である。ヴァーチャルマシンは、命令の実行を管理する。命令実行の準備ができると、ヴァーチャルマシンは、命令を翻訳するかまたは直接OSへ送ってネイティブに実行させることができる。この実施例では、ヴァーチャルマシンは、実行されているアプリケーションプログラムに対する命令修正を実行する。命令修正がアプリケーション自体の内部にある場合と同様、類似する構築時解析ツールがこのセットアップのために必要である。
図10bは、アプリケーションプログラムとともに実行される同時実行のプロセスまたはスレッドを示す。この別個のスレッドまたはプロセスは、アプリケーションプログラムとは準独立状態で実行される。この場合、別個のプロセスまたはスレッドは、いくつかの同期または非同期実行スキームのいずれかを介してアプリケーションプログラムと同時に実行する。アプリケーションプログラムに対する命令の修正は、この同時実行のプロセスまたはスレッドから作成することができる。命令修正がアプリケーション自体の内部にある場合と同様、類似する構築時解析ツールがこのセットアップのために必要である。
図10cは、図10aおよび図10bにおけるセットアップの組み合わせを示す。2つの同時実行のスレッドまたはプロセスが実行されている。さらに、ヴァーチャルマシンがアプリケーションレベルとOSレベルの間にある。各同時実行のアプリケーションスレッドまたはプロセスが他のアプリケーションスレッドまたはプロセスにおける命令を修正することができる。代替的には、アプリケーションスレッドまたはプロセスは、ヴァーチャルマシンにおける命令を修正することができる。同様に、ヴァーチャルマシンは、アプリケーションプロセス/スレッドのいずれかにおいて命令を修正することができる。さらに、このセットアップは、アプリケーションプロセス/スレッドのいずれかが独立した場合のように、自己修正することを妨げない。このヴァーチャルマシンも同様に自己修正が可能である。
上記では、本発明の実施例の完全な理解のため、説明を目的として、数々の詳細について提示した。しかしながら、発明を実施するためにこれら特定の詳細を必要としないことは、当業者には明らかであろう。他の例においては、発明を不明確にしないために、ブロック図の形式で、周知の電気的構成および回路について示した。たとえば、ここに記載された発明の実施例が、ソフトウェアルーチン、ハードウェア回路、ファームウェア、またはこれらの組み合わせのいずれとして実装されるかについての特定の詳細については記載されていない。
本発明の実施例は、機械可読媒体(コンピュータ可読媒体、プロセッサ可読媒体またはコンピュータ可読プログラムコードが内部に実現されたコンピュータ使用可能媒体とも呼ぶ)にストアされるソフトウェア製品として表現することができる。機械可読媒体は、ディスケット、コンパクトディスクリードオンリメモリ(CD−ROM)、メモリ装置(揮発性または不揮発性)または同様の記憶機構を含む磁気、光学または電子記憶媒体を含むいずれか適切な有形の媒体が可能である。この機械可読媒体は、命令、コードシーケンス、コンフィギュレーション情報または他のデータの様々なセットを含むことが可能で、これらは実行されると、プロセッサが本発明の実施例に従う方法におけるステップを実行する。当業者は、記載の発明を実現するために必要な他の命令およびオペレーションも、機械可読媒体上にストアできることを理解するであろう。機械可読媒体から実行されるソフトウェアが、回路とインターフェースして記載のタスクを実行することができる。
発明の上記の実施例は例にすぎない。特定の実施例に対する変更、修正および変形例が、添付の請求項によってのみ規定される発明の範囲から逸脱することなく当業者により実行可能である。

Claims (26)

  1. ソフトウェアプログラムを静的および動的攻撃から保護するために、プログラムの制御フロー構造を変更することによって、プログラムを元の形式からよりセキュアな形式へ変換する方法であって、
    a)プログラムの元のファンクションコール構造およびファンクションコールレイアウトを解析するステップと、
    b)元のファンクションコールレイアウトを新しいファンクションコールレイアウトへ変換するステップと、
    c)元のファンクションコール構造を、動的自己修正を実行することができる新しいファンクションコール構造へ変換するステップと、
    d)変換された制御フロー構造を有するが意味的には元のプログラムと等価な変換されたプログラムを生成するステップとを含み、
    実行の際に、前記変換されたプログラムが、元のファンクションコールグラフを新しいファンクションコールグラフに変換するよう構成される、方法。
  2. 動的自己修正により関数が呼び出される時期と態様が変更される、請求項1に記載の方法。
  3. ステップa)からc)が、構築時に行われる予備修正であり、元のファンクションコールグラフを新しいファンクションコールグラフに変換するステップが、実行時に行われて、ステップa)からc)において計画された動的変更が実行される、請求項1に記載の方法。
  4. ステップa)が、プログラムを変換する時に、重要な関数を強調するため、プログラムにおける各関数の重要性のレベルを決定するステップをさらに含む、請求項1に記載の方法。
  5. ステップb)およびc)が、関数バウンダリを変更して、ファンクションコールレイアウトを偽装するステップを含む、請求項1に記載の方法。
  6. 関数バウンダリを変更するステップが、関数バウンダリを壊しかつ2つ以上の関数を1つに結合するステップを含む、請求項5に記載の方法。
  7. 関数バウンダリを変更するステップが、新たな関数バウンダリを挿入して関数を2つ以上の関数に分けるステップを含む、請求項5に記載の方法。
  8. ステップb)およびc)が、変換されたプログラムの実行の際に複数のコード経路を可能にするための関数複製を挿入するステップをさらに含む、請求項1に記載の方法。
  9. ファンクションコールグラフを介する実行の経路をランダムに選択するために非決定論を使用するステップをさらに含む、請求項8に記載の方法。
  10. コールグラフにおける関数の実行の順序を変更するステップをさらに含む、請求項1に記載の方法。
  11. 新しい関数を創出しかつ新しいファンクションコールを挿入するステップをさらに含む、請求項1に記載の方法。
  12. 戦略ポイントにデコイを挿入するステップをさらに含む、請求項1に記載の方法。
  13. 命令を修正してそれらの挙動を変更するステップをさらに含む、請求項1に記載の方法。
  14. 命令を削除しかつそれらをノーオペレーション(NOP)命令と置換するステップをさらに含む、請求項1に記載の方法。
  15. プログラムにダメージを行うステップをさらに含み、そのダメージが、ファンクションコール構造をさらに偽装しかつ元のプログラムに対して機能的等価性を維持するための1つ以上のフィックスアップダメージにより追随される1つ以上の改変性のダメージを含む、請求項1に記載の方法。
  16. 呼び出された関数の証拠を削除するステップをさらに含む、請求項15に記載の方法。
  17. 各改変性のダメージが1を超える数のフィックスアップダメージを有する、請求項15に記載の方法。
  18. 変換されたプログラムが、実行されると常に異なるファンクションコールグラフを有するように設定するステップをさらに含む、請求項1に記載の方法。
  19. ステップa)が、プログラムを修正するためのプログラムにおける戦略ポイントを決定するステップをさらに含む、請求項1に記載の方法。
  20. ステップa)が、複雑な予備解析工程を行って、プログラムのファンクションコール構造、ファンクションコールレイアウトおよびファンクションコールグラフ全体を理解するステップを含む、請求項19に記載の方法。
  21. ステップb)およびc)が、プログラムにおける修正ポイントを、対応の実行ポイントから物理的にかつ時間的に遠いポイントに配置するステップをさらに含む、請求項19に記載の方法。
  22. 実行ポイントについて複数の修正ポイントを設けるステップをさらに含む、請求項21に記載の方法。
  23. 変換された制御フロー構造が、新しいファンクションコールレイアウトおよび新しいファンクションコール構造を含む、請求項1に記載の方法。
  24. 変換された制御フロー構造が、ジャンプ、ブランチ、リターンおよび例外のうちの1つ以上をさらに含む、請求項23に記載の方法。
  25. ソフトウェアプログラムを静的および動的攻撃から保護するために、プログラムの制御フロー構造を変更することにより、プログラムを元の形式からよりセキュアな形式に変換する方法であって、前記方法が、構築時フェーズと実行時フェーズとを含み、前記構築時フェーズが、
    a)プログラムの元のファンクションコール構造およびファンクションコールレイアウトを解析するステップと、
    b)プログラムの元のファンクションコールレイアウトを新しいファンクションコールレイアウトに変換するステップと、
    c)ファンクションコール構造を動的修正を行うことができる新しいファンクションコール構造に変換するステップと、
    d)変換された制御フロー構造を有するが、意味的には元のプログラムに等価な変換されたプログラムを生成するステップとを含み、
    前記実行時フェーズが、
    e)プログラムの実行に際して、プログラムの元のファンクションコールグラフを新しいファンクションコールグラフに変換するステップを含み、
    実行時に行われる動的修正が、構築時に行われる変更に相補的で、元のプログラムに対して意味的に等価な変換されたプログラムを生成する、方法。
  26. ソフトウェアプログラムを動的および静的攻撃から保護するため、プログラムの制御フロー構造を変更することにより、プログラムを元の形式からよりセキュアな形式に変換するためのステートメントおよび命令を記録したコンピュータ可読メモリであって、
    前記ステートメントおよび命令は、プロセッサで実行されると、プロセッサが、
    a)プログラムの元のファンクションコール構造およびファンクションコールレイアウトを解析するステップと、
    b)元のファンクションコールレイアウトを新しいレイアウトに変換するステップと、
    c)元のファンクションコール構造を、動的自己修正を行うことができる新しい構造に変換するステップと、
    d)変換された制御フロー構造を有するが、元のプログラムに対して意味的に等価な変換されたプログラムを生成するステップとを実行するようになっており、前記変換されたプログラムが、実行に際して、元のファンクションコールグラフを新しいファンクションコールグラフに変換するよう構成される、メモリ。
JP2012532425A 2009-10-08 2009-10-08 動的ファンクションコールシステムにおけるアグレッシブな自動修正のためのシステムおよび方法 Expired - Fee Related JP5458184B2 (ja)

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
PCT/CA2009/001430 WO2011041871A1 (en) 2009-10-08 2009-10-08 A system and method for aggressive self-modification in dynamic function call systems

Publications (2)

Publication Number Publication Date
JP2013507670A JP2013507670A (ja) 2013-03-04
JP5458184B2 true JP5458184B2 (ja) 2014-04-02

Family

ID=43856324

Family Applications (1)

Application Number Title Priority Date Filing Date
JP2012532425A Expired - Fee Related JP5458184B2 (ja) 2009-10-08 2009-10-08 動的ファンクションコールシステムにおけるアグレッシブな自動修正のためのシステムおよび方法

Country Status (7)

Country Link
US (1) US9195476B2 (ja)
EP (1) EP2486482B1 (ja)
JP (1) JP5458184B2 (ja)
KR (1) KR101719635B1 (ja)
CN (1) CN102713839B (ja)
CA (1) CA2776913C (ja)
WO (1) WO2011041871A1 (ja)

Families Citing this family (60)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US7581103B2 (en) * 2001-06-13 2009-08-25 Intertrust Technologies Corporation Software self-checking systems and methods
DE102010006572A1 (de) * 2010-02-02 2011-08-04 Giesecke & Devrient GmbH, 81677 Verfahren zum Ausführen einer Anwendung
US8458798B2 (en) * 2010-03-19 2013-06-04 Aspect Security Inc. Detection of vulnerabilities in computer systems
US9268945B2 (en) 2010-03-19 2016-02-23 Contrast Security, Llc Detection of vulnerabilities in computer systems
EP2550622A4 (en) * 2010-03-25 2013-08-28 Irdeto Canada Corp SYSTEM AND METHOD FOR GENERATING DYNAMIC AND VARIABLE OPERATING PATHS IN TIME TO PROVIDE RESISTANCE TO CHANNEL-SIDE ATTACKS AND REPEATED INVOCATION ATTACKS
WO2012083521A1 (zh) 2010-12-21 2012-06-28 北京中天安泰信息科技有限公司 规范计算机系统行为的方法
FR2974207B1 (fr) * 2011-04-14 2013-05-24 In Webo Technologies Procede et systeme de securisation d'un logiciel
JP2012234248A (ja) * 2011-04-28 2012-11-29 Kddi Corp ソフトウェアの難読化装置、ソフトウェアの難読化方法およびプログラム
US9122870B2 (en) 2011-09-21 2015-09-01 SunStone Information Defense Inc. Methods and apparatus for validating communications in an open architecture system
US9934374B2 (en) 2012-02-10 2018-04-03 Irdeto B.V. Method and apparatus for program flow in software operation
JP5939074B2 (ja) * 2012-07-31 2016-06-22 富士通株式会社 コード処理方法、情報処理装置およびプログラム
US8918768B2 (en) 2012-12-06 2014-12-23 Apple Inc. Methods and apparatus for correlation protected processing of data operations
US9135435B2 (en) * 2013-02-13 2015-09-15 Intel Corporation Binary translator driven program state relocation
WO2014142430A1 (ko) * 2013-03-15 2014-09-18 주식회사 에스이웍스 안드로이드에서의 dex파일 바이너리 난독화 방법
US10264025B2 (en) 2016-06-24 2019-04-16 Varmour Networks, Inc. Security policy generation for virtualization, bare-metal server, and cloud computing environments
US9659156B1 (en) * 2014-03-20 2017-05-23 Symantec Corporation Systems and methods for protecting virtual machine program code
US10120663B2 (en) * 2014-03-28 2018-11-06 Intel Corporation Inter-architecture compatability module to allow code module of one architecture to use library module of another architecture
CN104091121B (zh) * 2014-06-12 2017-07-18 上海交通大学 对Android重打包恶意软件的恶意代码的检测、切除和恢复的方法
WO2016061820A1 (en) * 2014-10-24 2016-04-28 Google Inc. Methods and systems for automated tagging based on software execution traces
US10193929B2 (en) 2015-03-13 2019-01-29 Varmour Networks, Inc. Methods and systems for improving analytics in distributed networks
US9380027B1 (en) 2015-03-30 2016-06-28 Varmour Networks, Inc. Conditional declarative policies
CN106407754B (zh) * 2015-07-30 2021-06-18 中兴通讯股份有限公司 一种生成随机布局程序的方法及装置
US10296737B2 (en) * 2015-12-09 2019-05-21 International Business Machines Corporation Security enforcement in the presence of dynamic code loading
US10191758B2 (en) 2015-12-09 2019-01-29 Varmour Networks, Inc. Directing data traffic between intra-server virtual machines
JP6594213B2 (ja) * 2016-01-20 2019-10-23 株式会社東芝 制御装置およびプログラム
US10755334B2 (en) 2016-06-30 2020-08-25 Varmour Networks, Inc. Systems and methods for continually scoring and segmenting open opportunities using client data and product predictors
CN106095470B (zh) * 2016-08-17 2019-08-09 广东工业大学 基于压扁控制流认知优先度驱动的程序理解方法及系统
US10621195B2 (en) 2016-09-20 2020-04-14 Microsoft Technology Licensing, Llc Facilitating data transformations
US10706066B2 (en) 2016-10-17 2020-07-07 Microsoft Technology Licensing, Llc Extensible data transformations
US10776380B2 (en) 2016-10-21 2020-09-15 Microsoft Technology Licensing, Llc Efficient transformation program generation
US11163788B2 (en) 2016-11-04 2021-11-02 Microsoft Technology Licensing, Llc Generating and ranking transformation programs
US11170020B2 (en) 2016-11-04 2021-11-09 Microsoft Technology Licensing, Llc Collecting and annotating transformation tools for use in generating transformation programs
CN106650340B (zh) * 2016-11-16 2019-12-06 中国人民解放军国防科学技术大学 一种采用动态细粒度代码隐藏与混淆技术的二进制软件保护方法
KR101900813B1 (ko) * 2016-12-30 2018-09-20 홍익대학교 산학협력단 문법에 의하여 생성된 입력으로 제어흐름을 처방하기 위한 동적 제어흐름 분석 장치 및 방법
US10095603B2 (en) 2017-01-09 2018-10-09 International Business Machines Corporation Pre-fetching disassembly code for remote software debugging
CN107015910A (zh) * 2017-04-06 2017-08-04 上海云轴信息科技有限公司 保证异步程序健壮性的方法及设备
US10430318B1 (en) 2017-07-11 2019-10-01 Juniper Networks, Inc Systems and methods for efficiently performing regression testing on software updates
WO2019031715A1 (ko) * 2017-08-09 2019-02-14 주식회사 센스톤 가상코드 기반의 제어시스템, 방법 및 프로그램, 제어디바이스 및 제어신호생성수단
EP4053773B1 (en) 2017-08-09 2023-12-20 SSenStone Inc. Virtual token-based settlement providing system, virtual token generation apparatus, virtual token verification server, virtual token-based settlement providing method, and virtual token-based settlement providing program
KR101978812B1 (ko) 2017-08-09 2019-05-15 주식회사 센스톤 가상카드번호 기반의 금융거래제공시스템, 가상카드번호생성장치, 가상카드번호검증장치, 가상카드번호 기반의 금융거래제공방법 및 가상카드번호 기반의 금융거래제공프로그램
CN108694320B (zh) * 2018-05-15 2020-09-15 中国科学院信息工程研究所 一种多安全环境下敏感应用动态度量的方法及系统
DE102018005102A1 (de) * 2018-06-27 2020-01-02 Build38 Gmbh Adaptive Sicherheitsupdates für Applikationen
CN109739620A (zh) * 2018-12-20 2019-05-10 武汉科锐逆向科技有限公司 一种基于vm引擎的保护方法
KR102243532B1 (ko) * 2019-02-08 2021-04-22 주식회사 센스톤 칩 고유값 기반의 가상코드를 이용하여 장치를 식별하는 방법, 프로그램 및 장치
CN110032394B (zh) * 2019-04-12 2022-05-31 深圳市腾讯信息技术有限公司 一种无源码文件的分析方法、装置和存储介质
US11550903B1 (en) * 2019-04-26 2023-01-10 Joseph Alan Epstein System and method for trustworthiness, reputation, provenance, and measurement of software
US11290494B2 (en) 2019-05-31 2022-03-29 Varmour Networks, Inc. Reliability prediction for cloud security policies
US11575563B2 (en) 2019-05-31 2023-02-07 Varmour Networks, Inc. Cloud security management
US11711374B2 (en) 2019-05-31 2023-07-25 Varmour Networks, Inc. Systems and methods for understanding identity and organizational access to applications within an enterprise environment
US11863580B2 (en) 2019-05-31 2024-01-02 Varmour Networks, Inc. Modeling application dependencies to identify operational risk
US11290493B2 (en) 2019-05-31 2022-03-29 Varmour Networks, Inc. Template-driven intent-based security
US11310284B2 (en) 2019-05-31 2022-04-19 Varmour Networks, Inc. Validation of cloud security policies
US11336680B2 (en) * 2020-03-05 2022-05-17 Oracle International Corporation Tailored security configuration of least-privilege applications
US11876817B2 (en) 2020-12-23 2024-01-16 Varmour Networks, Inc. Modeling queue-based message-oriented middleware relationships in a security system
US11818152B2 (en) 2020-12-23 2023-11-14 Varmour Networks, Inc. Modeling topic-based message-oriented middleware within a security system
US12050693B2 (en) 2021-01-29 2024-07-30 Varmour Networks, Inc. System and method for attributing user behavior from multiple technical telemetry sources
US11777978B2 (en) 2021-01-29 2023-10-03 Varmour Networks, Inc. Methods and systems for accurately assessing application access risk
US11734316B2 (en) 2021-07-08 2023-08-22 Varmour Networks, Inc. Relationship-based search in a computing environment
US12189759B2 (en) 2021-09-02 2025-01-07 Oracle International Corporation Runtime-tailored security policies for applications
CN114201359B (zh) * 2021-11-22 2024-08-30 南京邮电大学 一种基于普通函数和内核函数混合调用控制流图的智能主动软件防护方法

Family Cites Families (18)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
US6957341B2 (en) * 1998-05-14 2005-10-18 Purdue Research Foundation Method and system for secure computational outsourcing and disguise
US7430670B1 (en) 1999-07-29 2008-09-30 Intertrust Technologies Corp. Software self-defense systems and methods
US7757097B2 (en) * 1999-09-03 2010-07-13 Purdue Research Foundation Method and system for tamperproofing software
JP2003337629A (ja) * 2002-05-18 2003-11-28 Mitsuko Miyaji プログラム難読化方法及び装置
JP3944069B2 (ja) * 2002-12-06 2007-07-11 国立大学法人 奈良先端科学技術大学院大学 自己書換え処理追加プログラム、自己書換え処理追加装置及び自己書換え処理追加方法
US7340734B1 (en) * 2003-08-27 2008-03-04 Nvidia Corporation Method and apparatus to make code more difficult to reverse engineer
EP1758395A1 (en) * 2004-06-28 2007-02-28 Matsushita Electric Industrial Co., Ltd. Program creation device, program test device, program execution device, information processing system
FR2877118B1 (fr) * 2004-10-22 2007-01-19 Oberthur Card Syst Sa Protection contre les attaques par generation de fautes sur les instructions de saut
JP4828517B2 (ja) * 2005-02-10 2011-11-30 パナソニック株式会社 プログラム変換装置及びプログラム実行装置
US8312297B2 (en) 2005-04-21 2012-11-13 Panasonic Corporation Program illegiblizing device and method
CN101416197A (zh) * 2006-02-06 2009-04-22 松下电器产业株式会社 程序混淆装置
JP2007304726A (ja) * 2006-05-09 2007-11-22 Fuji Xerox Co Ltd プログラム難読化装置、難読化方法及び難読化プログラム
US20090249492A1 (en) * 2006-09-21 2009-10-01 Hans Martin Boesgaard Sorensen Fabrication of computer executable program files from source code
EP2107489A3 (en) * 2006-12-21 2009-11-04 Telefonaktiebolaget L M Ericsson (PUBL) Obfuscating computer program code
US8176473B2 (en) * 2007-05-14 2012-05-08 Microsoft Corporation Transformations for software obfuscation and individualization
JP2009086746A (ja) * 2007-09-27 2009-04-23 Fuji Xerox Co Ltd 情報処理装置及び情報処理プログラム
JP2009104489A (ja) * 2007-10-24 2009-05-14 Fuji Electric Holdings Co Ltd コードクローンのテスト装置および方法
GB0810695D0 (en) * 2008-06-12 2008-07-16 Metaforic Ltd Anti-tampering MMU defence

Also Published As

Publication number Publication date
CA2776913C (en) 2017-01-03
CA2776913A1 (en) 2011-04-14
CN102713839B (zh) 2015-11-25
KR20120094481A (ko) 2012-08-24
EP2486482A4 (en) 2014-05-21
EP2486482A1 (en) 2012-08-15
JP2013507670A (ja) 2013-03-04
KR101719635B1 (ko) 2017-03-27
US20120284792A1 (en) 2012-11-08
US9195476B2 (en) 2015-11-24
WO2011041871A1 (en) 2011-04-14
CN102713839A (zh) 2012-10-03
EP2486482B1 (en) 2018-02-28

Similar Documents

Publication Publication Date Title
JP5458184B2 (ja) 動的ファンクションコールシステムにおけるアグレッシブな自動修正のためのシステムおよび方法
Wang et al. oo7: Low-overhead defense against spectre attacks via program analysis
US10255414B2 (en) Software self-defense systems and methods
CN110096853B (zh) 基于Mono的Unity安卓应用加固方法、存储介质
US20020038428A1 (en) Digital data protection arrangement
US20240143739A1 (en) Intelligent obfuscation of mobile applications
CN105653905A (zh) 一种基于api安全属性隐藏与攻击威胁监控的软件保护方法
Huang et al. Return-oriented vulnerabilities in ARM executables
Arasteh et al. Forensic memory analysis: From stack and code to execution history
US11256786B2 (en) Method to secure a software code
CN105912893A (zh) 一种基于Android系统微指令即时编译的加固方法
KR101052735B1 (ko) 메모리 조작유무를 감지하는 방법 및 이를 이용한 장치
JP2009104589A (ja) 情報処理装置及びその方法、プログラム、記録媒体
Balachandran et al. Obfuscation by code fragmentation to evade reverse engineering
CN114637988A (zh) 一种面向二进制的函数级软件随机化方法
Tsang et al. A robust anti-tamper protection scheme
WO2019149630A1 (en) Method for protecting an executable code
AU2023220809A1 (en) Protecting software
Ghosh et al. What's the PointiSA?
Aelterman Exploitation of synergies between software protections
Liu et al. A Hooking Interpreter Based Method for Script Program Protection

Legal Events

Date Code Title Description
A977 Report on retrieval

Free format text: JAPANESE INTERMEDIATE CODE: A971007

Effective date: 20131129

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: 20131217

A61 First payment of annual fees (during grant procedure)

Free format text: JAPANESE INTERMEDIATE CODE: A61

Effective date: 20140110

R150 Certificate of patent or registration of utility model

Free format text: JAPANESE INTERMEDIATE CODE: R150

S111 Request for change of ownership or part of ownership

Free format text: JAPANESE INTERMEDIATE CODE: R313113

S531 Written request for registration of change of domicile

Free format text: JAPANESE INTERMEDIATE CODE: R313531

R350 Written notification of registration of transfer

Free format text: JAPANESE INTERMEDIATE CODE: R350

R250 Receipt of annual fees

Free format text: JAPANESE INTERMEDIATE CODE: R250

LAPS Cancellation because of no payment of annual fees