(57)【特許請求の範囲】
【請求項１】
未知のバイナリプログラムに対する有効入力シーケンスを判定する方法であって、
未知のバイナリプログラムに対する入力シーケンスを得ることであって、前記入力シーケンスに対する入力であって、前記未知のバイナリプログラムに対して有効入力と判定された２つ以上の異なる入力を含む入力シーケンスを得ることと、
前記未知のバイナリプログラムにおける１つ以上の変数のそれぞれに対するメモリアドレス範囲を得ることと、
前記入力シーケンスを、前記未知のバイナリプログラムのインスツルメントされたバージョンへの入力として、前記未知のバイナリプログラムの前記インスツルメントされたバージョンを実行することと、
前記未知のバイナリプログラムの前記インスツルメントされたバージョンの前記実行中にアクセスされた１つ以上のメモリアドレスを記録することと、
前記未知のバイナリプログラムにおける前記変数の１つ以上の前記メモリアドレス範囲に対応する前記１つ以上の記録されたメモリアドレスの１つ以上に基づいて、前記未知のバイナリプログラムは前記入力シーケンスを有効と認めると判定することと、を備える処理をプロセスに実行させることを特徴とする方法。
【請求項２】
前記変数は、静的変数、グローバル変数、又は静的グローバル変数の何れかであることを特徴とする請求項１に記載の方法。
【請求項３】
前記メモリアドレス範囲は、前記未知のバイナリプログラムのデータセクション、ＢＳＳセクション、又は前記データセクションとＢＳＳセクションの両者内に位置していることを特徴とする請求項１に記載の方法。
【請求項４】
前記入力の１つ以上は、前記未知のバイナリプログラムに対して有効と判定されたコマンドと、前記コマンドと関連付けられている引数であって、前記未知のバイナリプログラムに対して有効であると同様に判定された引数を含むことを特徴とする請求項１に記載の方法。
【請求項５】
メモリアドレスは、前記メモリアドレスが読み込まれるとき、又は書き込まれるときの何れかでアクセスされることを特徴とする請求項１に記載の方法。
【請求項６】
メモリアドレスは、前記メモリアドレスが読み込まれるときと、書き込まれるときの両方でアクセスされることを特徴とする請求項１に記載の方法。
【請求項７】
前記未知のバイナリプログラムに、実行されると、前記未知のバイナリプログラムによりアクセスされたメモリアドレスを出力する追加的コード指令を追加することにより、前記未知のバイナリプログラムをインスツルメントすることを更に備えることを特徴とする請求項１に記載の方法。
【請求項８】
前記入力シーケンスは第１入力シーケンスであり、前記メモリアドレスは第１メモリアドレスであり、
前記方法は、
前記未知のバイナリプログラムに対する第２入力シーケンスを得ることと、
前記第１入力シーケンスと前記第２入力シーケンスを、前記未知のバイナリプログラムの前記インスツルメントされたバージョンへの入力として使用して、前記未知のバイナリプログラムの前記インスツルメントされたバージョンを実行することと、
前記第２入力シーケンスが前記未知のバイナリプログラムの前記インスツルメントされたバージョンに入力される間及びその後に、前記未知のバイナリプログラムの前記インスツルメントされたバージョンの前記実行中にアクセスされた１つ以上の第２メモリアドレスを記録することと、
前記未知のバイナリプログラムにおける前記変数の１つ以上の前記メモリアドレス範囲に対応する前記１つ以上の記録された第２メモリアドレスの１つ以上に基づいて、前記未知のバイナリプログラムは前記第２入力シーケンスを有効と認めると判定することと、を更に備えることを特徴とする請求項１に記載の方法。
【請求項９】
前記入力シーケンスは第１入力シーケンスであり、前記メモリアドレスは第１メモリアドレスであり、
前記方法は、
前記第１入力シーケンスを提供し、そして文字シーケンスを入力として提供することにより前記未知のバイナリプログラムを実行することと、
前記未知のバイナリプログラムの指令カウントを記録することと、
前記指令カウントに基づいて、前記文字シーケンスを有効入力と判定することと、
前記文字シーケンスを使用して、第２入力シーケンスを生成することと、を更に備えることを特徴とする請求項１に記載の方法。
【請求項１０】
前記第１入力シーケンスと前記第２入力シーケンスを、前記未知のバイナリプログラムの前記インスツルメントされたバージョンへの入力として、前記未知のバイナリプログラムの前記インスツルメントされたバージョンを実行することと、
前記第２入力シーケンスが入力される間及びその後に、前記未知のバイナリプログラムの前記インスツルメントされたバージョンの前記実行中にアクセスされた１つ以上の第２メモリアドレスを記録することと、
前記未知のバイナリプログラムにおける前記変数の１つ以上の前記メモリアドレス範囲に対応する前記１つ以上の記録された第２メモリアドレスの１つ以上に基づいて、前記未知のバイナリプログラムは前記第２入力シーケンスを有効と認めると判定することと、を更に備えることを特徴とする請求項９に記載の方法。
【請求項１１】
１つ以上のプロセッサにより実行されると、未知のバイナリプログラムに対する有効入力シーケンスを判定する動作を行う指令を含む１つ以上の非持続的なコンピュータ読み取り可能媒体であって、前記動作は、
未知のバイナリプログラムに対する入力シーケンスを得ることであって、前記入力シーケンスに対する入力であって、前記未知のバイナリプログラムに対して有効入力と判定された２つ以上の異なる入力を含む入力シーケンスを得ることと、
前記未知のバイナリプログラムにおける１つ以上の変数のそれぞれに対するメモリアドレス範囲を得ることと、
前記入力シーケンスを、前記未知のバイナリプログラムのインスツルメントされたバージョンへの入力として、前記未知のバイナリプログラムの前記インスツルメントされたバージョンを実行することと、
前記未知のバイナリプログラムの前記インスツルメントされたバージョンの前記実行中にアクセスされた１つ以上のメモリアドレスを記録することと、
前記未知のバイナリプログラムにおける前記変数の１つ以上の前記メモリアドレス範囲に対応する前記１つ以上の記録されたメモリアドレスの１つ以上に基づいて、前記未知のバイナリプログラムは前記入力シーケンスを有効と認めると判定することと、を備えることを特徴とする１つ以上の非持続的なコンピュータ読み取り可能媒体。
【請求項１２】
前記変数は、静的変数、グローバル変数、又は静的グローバル変数の何れかであることを特徴とする請求項１１に記載の１つ以上の非持続的なコンピュータ読み取り可能媒体。
【請求項１３】
前記メモリアドレス範囲は、前記未知のバイナリプログラムのデータセクション、ＢＳＳセクション、又は前記データセクションとＢＳＳセクションの両者内に位置していることを特徴とする請求項１１に記載の１つ以上の非持続的なコンピュータ読み取り可能媒体。
【請求項１４】
前記入力の１つ以上は、前記未知のバイナリプログラムに対して有効と判定されたコマンドと、前記コマンドと関連付けられている引数であって、前記未知のバイナリプログラムに対して有効であると同様に判定された引数を含むことを特徴とする請求項１１に記載の１つ以上の非持続的なコンピュータ読み取り可能媒体。
【請求項１５】
メモリアドレスは、前記メモリアドレスが読み込まれるとき、又は書き込まれるかときの何れかでアクセスされることを特徴とする請求項１１に記載の１つ以上の非持続的なコンピュータ読み取り可能媒体。
【請求項１６】
メモリアドレスは、前記メモリアドレスが読み込まれるときと、書き込まれるときの両方でアクセスされることを特徴とする請求項１１に記載の１つ以上の非持続的なコンピュータ読み取り可能媒体。
【請求項１７】
前記動作は、前記未知のバイナリプログラムに、実行されると、前記未知のバイナリプログラムによりアクセスされたメモリアドレスを出力する追加的コード指令を追加することにより、前記未知のバイナリプログラムをインスツルメントすることを更に備えることを特徴とする請求項１１に記載の１つ以上の非持続的なコンピュータ読み取り可能媒体。
【請求項１８】
前記入力シーケンスは第１入力シーケンスであり、前記メモリアドレスは第１メモリアドレスであり、
前記動作は、
前記未知のバイナリプログラムに対する第２入力シーケンスを得ることと、
前記第１入力シーケンスと前記第２入力シーケンスを、前記未知のバイナリプログラムの前記インスツルメントされたバージョンへの入力として使用して、前記未知のバイナリプログラムの前記インスツルメントされたバージョンを実行することと、
前記第２入力シーケンスが前記未知のバイナリプログラムの前記インスツルメントされたバージョンに入力される間及びその後に、前記未知のバイナリプログラムの前記インスツルメントされたバージョンの前記実行中にアクセスされた１つ以上の第２メモリアドレスを記録することと、
前記未知のバイナリプログラムにおける前記変数の１つ以上の前記メモリアドレス範囲に対応する前記１つ以上の記録された第２メモリアドレスの１つ以上に基づいて、前記未知のバイナリプログラムは前記第２入力シーケンスを有効と認めると判定することと、を更に備えることを特徴とする請求項１１に記載の１つ以上の非持続的なコンピュータ読み取り可能媒体。
【請求項１９】
前記入力シーケンスは第１入力シーケンスであり、前記メモリアドレスは第１メモリアドレスであり、
前記動作は、
前記第１入力シーケンスを提供し、そして文字シーケンスを入力として提供することにより前記未知のバイナリプログラムを実行することと、
前記未知のバイナリプログラムの指令カウントを記録することと、
前記指令カウントに基づいて、前記文字シーケンスを有効入力と判定することと、
前記文字シーケンスを使用して、第２入力シーケンスを生成することと、を更に備えることを特徴とする請求項１１に記載の１つ以上の非持続的なコンピュータ読み取り可能媒体。
【請求項２０】
前記動作は、
前記第１入力シーケンスと前記第２入力シーケンスを、前記未知のバイナリプログラムの前記インスツルメントされたバージョンへの入力として、前記未知のバイナリプログラムの前記インスツルメントされたバージョンを実行することと、
前記第２入力シーケンスが入力される間及びその後に、前記未知のバイナリプログラムの前記インスツルメントされたバージョンの前記実行中にアクセスされた１つ以上の第２メモリアドレスを記録することと、
前記未知のバイナリプログラムにおける前記変数の１つ以上の前記メモリアドレス範囲に対応する前記１つ以上の記録された第２メモリアドレスの１つ以上に基づいて、前記未知のバイナリプログラムは前記第２入力シーケンスを有効と認めると判定することと、を更に備えることを特徴とする請求項１９に記載の１つ以上の非持続的なコンピュータ読み取り可能媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
ここで検討される実施形態は、未知のバイナリプログラムに対する有効入力シーケンスの判定に関する。
【背景技術】
【０００２】
バイナリファイルの効率的なテストは、何れの入力がバイナリファイルに対して有効であるかを知ることにより改善できる。バイナリファイルは、人間がテキストとして解釈できるコード及びルーチンを含むことができる。しかし、バイナリファイルのコード及びルーチンに含まれるテキストは、人間は読むことができない。コード及びルーチンは人間が読むことができないので、バイナリファイルのコード及びルーチンを調べて、バイナリファイルに対する有効入力を判定することは人間のテスト担当者には不可能である。結果として、人間のテスト担当者は、何れの入力がバイナリファイルに対して有効であるかを判定するために、バイナリファイルに関連する仕様、文書、又はソースコードを調べることができるだけである。そして、これらの有効入力は、より効率のよいバイナリファイルのテストを達成するために使用できる。
【発明の概要】
【課題を解決するための手段】
【０００３】
一実施形態の態様によれば、未知のバイナリプログラムに対する有効入力シーケンスを判定する方法が開示される。方法は、未知のバイナリプログラムに対する入力シーケンスを得ることを含むことができる。入力シーケンスは、２つ以上の異なる入力を含むことができる。入力シーケンスに対する入力は、未知のバイナリプログラムに対する有効入力と判定することができる。方法はまた、未知のバイナリプログラムにおける１つ以上の変数のそれぞれに対するメモリアドレス範囲を得ることと、入力シーケンスを、未知のバイナリプログラムのインスツルメントされた（計装又は実装された）バージョンへの入力として、未知のバイナリプログラムのインスツルメントされたバージョンを実行することを含むことができる。方法はまた、未知のバイナリプログラムのインスツルメントされたバージョンの実行中にアクセスされた１つ以上のメモリアドレスを記録することと、未知のバイナリプログラムにおける変数の１つ以上のメモリアドレス範囲に対応する１つ以上の記録されたメモリアドレスの１つ以上に基づいて、未知のバイナリプログラムは入力シーケンスを有効と認めると判定することを含むことができる。
【発明の効果】
【０００４】
実施形態の目的と利点は、少なくとも、特に請求項に記載される要素、特徴、及びそれらの組み合わせにより実現及び達成される。
【０００５】
上記の一般的な説明と下記の詳細な説明の両者は、例示及び説明のためであり、主張されるような、本開示を制限するものではないということは理解されるべきである。
【図面の簡単な説明】
【０００６】
【図１】図１は、入力シーケンス判定プロセスを例示する図である。
【図２】図２は、入力判定プロセスを例示する図である。
【図３】図３は、入力及び入力シーケンス判定プロセスを例示する図である。
【図４】図４は、入力判定システムのブロック図である。
【図５】図５は、未知のバイナリプログラムに対する有効入力シーケンスを判定する方法のフローチャートの一例を示す図である。
【発明を実施するための形態】
【０００７】
一例である実施形態は、付随する図面を使用して、追加的具体性及び詳細さを伴って、記述され且つ説明される。
【０００８】
未知のバイナリプログラムに対する有効入力シーケンスを判定する受け入れ可能な方法は、種々の要素を含むことができる。１つの要素は、未知のバイナリプログラムに含まれるコード及びルーチン(デッドコードは除外）の高いパーセンテージをカバーすることを含むことができる。例えば、未知のバイナリプログラムをテストするために選択される１つ以上のテスト入力又は入力シーケンスは、未知のバイナリプログラムに対するコード及びルーチンの１００％又は１００％近くをカバーできる（例えば、デッドコード及びルーチンを除外して、バイナリプログラムの９０％から１００％）。幾つかの現在の方法は、未知のバイナリプログラムをテストするためのランダムなテスト入力の生成に依存している。残念なことに、ランダムに生成されるテスト入力は、未知のバイナリプログラムに対するコード及びルーチンの高いパーセンテージを一貫してカバーする目標とは本質的に相いれない可能性があるので、未知のバイナリプログラムをテストするためのランダムなテスト入力の生成を含むテスト方法は、未知のバイナリプログラムに対するコード及びルーチンの高いパーセンテージを一貫してカバーすることは可能ではない。結果として、幾つかの現存する方法は、バイナリプログラムに対するコード及びルーチンの高いパーセンテージを一貫してカバーすることは可能ではないので、これらの方法は受け入れることができないと考えられる。
【０００９】
未知のバイナリプログラムに対する有効入力シーケンスを判定する受け入れ可能な方法の別の要素は、未知のバイナリプログラムに関連する仕様、文書、又はソースコードなしに効果的に実現される能力を含むことができる。この必要条件は、コンピュータシステムが、ソフトウェアにおける弱点を自動的に判定することが利点である、自律ソフトウェアセキュリティの分野では利点であり得る。幾つかの状況では、未知のバイナリプログラムは、未知のバイナリプログラムの人間のテスト担当者が利用できるが、未知のバイナリプログラムに関連する仕様、文書、及びソースコードは利用できないことがある。幾つかの現存の方法は、未知のバイナリプログラムに対する有効入力を判定しようと試みている。しかし、これらの方法は、ランダムに生成されるテスト入力に依存、又は他の欠点を有している。
【００１０】
未知のバイナリプログラムに対する有効入力シーケンスを判定する受け入れ可能な方法の更に別の要素は、プラットフォーム独立性を含むことができる。プラットフォーム独立性は、他の有利点を提供すると共に、方法の移植性を有利に改善できる。
【００１１】
現在では、上記に検討した要素を含んでいる未知のバイナリプログラムに対する有効入力シーケンスを判定する方法は出現していない。未知のバイナリプログラムに対する有効入力シーケンスを判定するために、種々の方法が使用されている。しかし、これらの方法のうち、未知のバイナリプログラムに対する有効入力シーケンスを判定する受け入れ可能な方法の上記に検討した要素を全て、又は要素の幾つかさえも提供するものはない。
【００１２】
そのような方法の１つは、「シンボリック実行」と称することができる。シンボリック実行アプローチは、プログラムをクラッシュさせる可能性を含む種々の実行経路に沿ってプログラムを駆動できる、未知のバイナリプログラムに対する入力を判定することを含んでいる。このアプローチは、幾つかの隔離された例では成功する可能性がある。しかし、シンボリック実行アプローチに関連する１つの欠点は、未知のバイナリプログラムに関連するソースファイルを使用することである。幾つかの例では、ソースファイルが利用できないことがある。結果として、シンボリック実行アプローチの実現は、これらの例では可能ではない。他の欠点としては、シンボリック実行アプローチのスケール変更が容易ではないことであり、そのため、多くの通常の状況で作動できないことが挙げられる。例えば、シンボリック実行アプローチは、不動小数点演算を含むプログラム、又はプログラムの実行中に収集された入力に対する非線形制約を含むプログラムとの作動についての知られている問題を有している。少なくともこれらの理由のために、シンボリック実行アプローチは、未知のバイナリプログラムに対する有効入力を判定する受け入れ可能な方法ではない。
【００１３】
別の方法は、「ブラックボックスファジング」として知られている。このアプローチは、ストリングを選択すること、及びストリングをランダムに変更することを含むことができる。ストリングは、各変更の後に、入力として未知のバイナリプログラムに供給できる。このアプローチは、十分な時間があれば効果がある可能性があるが、ブラックボックスファジングにより生成される入力のほとんどは、無効入力である。このことは、追加の有効入力を変化させて識別するためには有効入力が必要であるために問題がある。ブラックボックスファジングに関連する追加的な問題は、このアプローチがランダム入力に依存しているため、未知のバイナリプログラムの高いカバレッジを保証せずに、ブラックボックスファジングを実現した結果が、高いカバレッジを達成するかを知ることは可能ではないということである。
【００１４】
別の方法は、「ホワイトボックスファジング」として知られている。ホワイトボックスファジングアプローチは、ブラックボックスファジングに類似しているが、解析してテスト入力を製造することができるシンボリック制約を収集するために有効入力が使用されることが異なる。ホワイトボックスファジングアプローチは、ランダムに達成されたのではない少なくとも幾つかの入力を含むために、ブラックボックスファジングよりも改善されていると考えることができる。しかし、ホワイトボックスアプローチは、テスト入力を判定するために実現される前に、有効入力を前提条件として要求する。幾つかの例では、有効入力は、ホワイトボックスファジングアプローチに対するシード（種）として利用できない。この理由のため、単独で実現されるホワイトボックスファジングアプローチは、未知のバイナリプログラムに対する有効入力を判定する問題を解決することは可能ではない。
【００１５】
別の方法は、「ユニットテスト」として知られており、プログラムに対するコードはユニットに分割され、系統的にテストされる。ユニットテストは、幾つかの例では、バイナリプログラムの高いカバレッジテストを達成可能できる可能性があるが、このアプローチは、未知のバイナリプログラムに対する仕様のような未知のバイナリプログラムに関連するソースファイル又は他の文書を常に必要とする。この情報なしでは、ユニットテストを実現することはできない。そのため、ユニットテストアプローチは、ソースファイル又は他の文書を必要とするので、未知のバイナリプログラムに対する有効入力を判定する問題を解決することは可能ではない。ユニットテストアプローチに関連する他の欠点は、プラットフォームに依存するということである。ユニットテストアプローチはまた、遅くて高価であるとも考えられている。
【００１６】
別の方法は、「仕様ベーステスト」として知られている。しかし、この名称が示すように、仕様ベーステストアプローチは、未知のバイナリプログラムに関連するソースファイル又は他の文書を常に必要とする。そのため、このアプローチは、ソースファイル又は他の文書を必要とするので、未知のバイナリプログラムに対する有効入力を判定する問題を解決することは可能ではない。ユニットテストと同様に、仕様ベーステストアプローチもまた、プラットフォームに依存し、遅くて高価であると考えられている。
【００１７】
他の方法としては、「リバースコードエンジニアリング」を含めることができる。リバースコードエンジニアリングアプローチは、「情報交換解析」アプローチ、「ディスアセンブリ」アプローチ、及び「デコンパイル」アプローチを含むことができる。情報交換解析アプローチは、情報が未知のバイナリプログラムにより交換されない場合は、有効でない可能性もあるので、このアプローチは制限があり、受け入れることができない。ディスアセンブリアプローチは、未処理アセンブリコードの静的又は動的解析に依存しており、多数の欠点を有している。例えば、未処理アセンブリコードの静的又は動的解析は、計算に掛る費用が高く、正確でなく、スケール変更が容易ではなく、重大な性能上のオーバヘッドをもたらす可能性がある。デコンパイルアプローチは、未知のバイナリプログラムに関連するソースコードを再構築して、ソースコード及び未知のバイナリプログラムを使用してテストに着手することを試みる。しかし、実際は、デコンパイルアプローチは、多くの状況で作動せず、デコンパイルアプローチで再構築を試みられた元々のソースコードファイルとは実際には実質的に異なるため、使用できず、品質が高くないソースコードファイルが作成される可能性がある。
【００１８】
本開示で検討される幾つかの実施形態は、未知のバイナリプログラムに対する有効入力シーケンスを判定するためのシステム及び／又は方法に関連している。これらの実施形態及び他の実施形態では、有効入力シーケンスは、未知のバイナリプログラムに対する有効入力として以前に判定された２つ以上の入力のシーケンスであってよい。未知のバイナリプログラムに対する有効入力シーケンスを判定することにより、未知のバイナリプログラムを、未知のバイナリプログラムに関する知識なしにテストすることができる。
【００１９】
幾つかの実施形態では、未知のバイナリプログラムに対する入力シーケンスは、未知のバイナリプログラムを、その入力シーケンスを使用して実行することに基づいて有効であると判定することができる。入力シーケンスを使用しての未知のバイナリプログラムの実行中に、アクセスされた１つ以上のメモリアドレスを記録することができる。アクセスされたメモリアドレスは、未知のバイナリプログラムにおける１つ以上の変数のそれぞれに対するメモリアドレス範囲と比較できる。記録されたメモリアドレスの１つ以上が、比較に基づいて、変数の１つ以上のメモリアドレス範囲に対応するときは、入力シーケンスは、未知のバイナリプログラムを新しいに状態に移動させる有効入力シーケンスの可能性があると判定できる。
【００２０】
幾つかの実施形態では、本開示で説明されるシステム及び／又は方法は、ランダムな入力生成に依存しないこともできる。このようにして、本開示で説明されるシステム及び／又は方法は、有効入力シーケンスを使用して、未知のバイナリプログラムの高いカバレッジを達成できる。これと比較して、ブラックボックスファジング及び他の技術のようなランダムな入力生成に依存する他の技術は、未知のバイナリプログラムの高いカバレッジを達成できない可能性がある。
【００２１】
幾つかの実施形態では、本開示で説明されるシステム及び／又は方法はまた、プラットフォームに依存しないものであってもよい。結果として、本開示で説明されるシステム及び／又は方法は、移植性を有することができ、多様な動作環境で使用できる。幾つかの実施形態では、本開示で説明されるシステム及び／又は方法はまた、未知のバイナリプログラムに関連するソースコード又は文書なしで首尾よく実現することもできる。幾つかの実施形態では、本開示で説明されるシステム及び／又は方法はまた、パケットスニッフィング（ネットワークを流れるパケットのモニタリング、調査、及び捕捉）、バス解析、又は情報の交換に依存する如何なる他の方法なしでも実現できる。結果として、本開示で説明されるシステム及び／又は方法は、リバースコードエンジニアリング技術なしで実現できる。
【００２２】
図１は、本開示で説明される少なくとも１つの実施形態に従って配置される入力シーケンス判定プロセス１００を例示している。幾つかの実施形態では、プロセス１００は、インスツルメンテーション（計装化又は実装化）モジュール１１０と、実行モジュール１２０と、有効化モジュール１３０を、未知のバイナリプログラム１０２に対する有効入力シーケンスを判定するために使用することができる。
【００２３】
インスツルメンテーションモジュール１１０は、未知のバイナリプログラム１０２を受信するように構成できる。未知のバイナリプログラム１０２は、バイナリプログラム全体であってよく、又は１つ以上の機能又はプログラムの他の態様のようなバイナリプログラムの一部であってよい。これらの実施形態及び他の実施形態では、未知のバイナリプログラム１０２は、プログラムのコンパイルされたバージョンを含むことができる。プログラムは、プログラムの機能を記述するコード及びルーチンを含むことができる。プログラムのコード及びルーチンは、プログラム、及びプログラムのコンパイルされたバージョンである未知のバイナリプログラム１０２に対して有効である可能性がある入力を定義できる。幾つかの実施形態では、プログラムに対する入力は、１つ以上の入力ストリングを含むことができる。コード及びルーチンにより有効と定義されない入力は、プログラムに対して有効でない可能性があるので、未知のバイナリプログラム１０２に対して有効でない可能性がある。
【００２４】
幾つかの実施形態では、未知のバイナリプログラム１０２は、ステートフルプログラム（ユーザとプログラムが複数ステップの対話に参加できるように、呼び出し間で情報を保持するプログラム）であってよい。これらの実施形態及び他の実施形態では、ステートフルプログラムは、過去の記憶を含むプログラムであってよい。ステートフルプログラムでは、以前のトランザクション（一連の処理）を覚えておくことができ、現在のトランザクションに影響を与えることができる。例えば、受信した以前のデータ入力について情報を変数に記憶して、現在のデータ入力の処理に影響を与えるために使用できる。ステートフルプログラムとして、プログラムはステートレスプログラムでなくてよい。これらの実施形態及び他の実施形態では、ステートレスプログラムは、過去の記憶を含んでいないプログラムであってよい。結果として、全ての要求又はトランザクションは、プログラムにより、あたかも初めて行われ、以前の要求又はトランザクションには関係しないように行うことができる独立した要求又はトランザクションであってよい。このため、後続の入力は、他の入力とは独立しており、以前の入力は、後続の結果又はプログラム応答には影響を与えない。
【００２５】
未知のバイナリプログラム１０２は、バイナリ形式で符号化され、処理装置による実行のために非持続的なコンピュータ読み取り可能記憶媒体に記憶されているコード及びルーチンを含むことができる。未知のバイナリプログラム１０２のコード及びルーチンは、人間によりテキストとして解釈され得る部分を含むことができるが、未知のバイナリプログラム１０２のコード及びルーチンは、人間が読み取り可能でなくてよい。これらの実施形態及び他の実施形態では、コード及びルーチンは、マシンにより読み取り可能であってよい。例えば、コード及びルーチンは、バイナリ又は他のマシン読み取り可能形式であってよい。
【００２６】
未知のバイナリプログラム１０２に対する有効入力が未知であってよいので、未知のバイナリプログラム１０２は「未知」であってよい。例えば、未知のバイナリプログラム１０２に関連する仕様、文書、又はソースコードは、未知のバイナリプログラム１０２の人間のテスト担当者、又は他のテスト機器に対して利用不可であってよい。結果として、人間のテスト担当者、又は他のテスト機器のテスト担当者は、未知のバイナリプログラム１０２に対する有効入力を判定可能でない。
【００２７】
インスツルメンテーションモジュール１１０は、未知のバイナリプログラム１０２に基づいて、インスツルメントされたバイナリプログラム１１２を生成するように構成できる。これらの実施形態及び他の実施形態では、インスツルメントされたバイナリプログラム１１２を生成するために、インスツルメンテーションモジュール１１０は、未知のバイナリプログラム１０２をインスツルメントできる。未知のバイナリプログラム１０２をインスツルメントするために、インスツルメンテーションモジュール１１０は、追加コード指令を未知のバイナリプログラム１０２に入力できる。追加コード指令は、未知のバイナリプログラム１０２の実行又はランタイムについての情報を出力できる。例えば、追加コード指令は、未知のバイナリプログラム１０２の実行中にアクセスされたメモリアドレスに関する情報を出力できる。
【００２８】
幾つかの実施形態では、インスツルメンテーションモジュール１１０は、ＰＩＮ又は他のバイナリインスツルメンテーションプログラムのようなバイナリインスツルメンテーションプログラムを含むことができる。インスツルメンテーションモジュール１１０は、インスツルメントされたバイナリプログラム１１２を実行モジュール１２０に提供できる。
【００２９】
実行モジュール１２０は、インスツルメントされたバイナリプログラム１１２及び入力シーケンス１０４を受信するように構成できる。幾つかの実施形態では、各入力シーケンス１０４は、未知のバイナリプログラム１０２に対する２つ以上の異なる入力を含むことができる。幾つかの実施形態では、未知のバイナリプログラム１０２に対する入力は、以前に見出され、未知のバイナリプログラム１０２に対して有効入力と判定されていてよい。しかし、未知のバイナリプログラム１０２に対する入力を判定したということは、入力を未知のバイナリプログラム１０２に提供するための有効シーケンスを示してはいない。例えば、未知のバイナリプログラム１０２は４つの異なる入力を認識することが見出されてよい。入力の１つを受信後、未知のバイナリプログラム１０２は、別の入力又は同じ入力の１つを予期できる。これらの実施形態及び他の実施形態では、未知のバイナリプログラム１０２に提供できる入力の１６の異なる２入力長シーケンスがあってよい。プロセス１００は、入力の１６の異なる２入力長シーケンスの何れが未知のバイナリプログラム１０２に対する有効入力シーケンスであるかを判定するように構成できる。
【００３０】
幾つかの実施形態では、有効２入力長シーケンスを判定後に、プロセス１００は、有効な３入力長、４入力長、又は５入力長シーケンス、又は他の長さのシーケンスがあるかどうかを判定できる。幾つかの実施形態では、上記したように、未知のバイナリプログラム１０２はステートフルプログラムであってよい。これらの実施形態及び他の実施形態では、入力又は入力のシーケンスを入力することにより別の状態になった後に、未知のバイナリプログラム１０２に対する追加入力を見出すことができる。これらの実施形態及び他の実施形態では、プロセス１００は、有効入力シーケンスを判定するときに、この追加入力を使用できる。
【００３１】
幾つかの実施形態では、シーケンスにおける２つ以上の異なる入力は、入力が未知のバイナリプログラム１０２にそれらに関連した順番で提供されるように順番を決めることができる。例えば、入力シーケンス１０４の１つにおける第１入力は、未知のバイナリプログラム１０２に最初に提供でき、入力シーケンス１０４の１つにおける第２入力は、未知のバイナリプログラム１０２に二番目に提供できる。
【００３２】
幾つかの実施形態では、入力シーケンス１０４に使用される各入力は、未知のバイナリプログラム１０２に対するコマンド及びコマンドに関連する引数を含むことができる。引数は、コマンドの受信後に、未知のバイナリプログラム１０２により予期できる。例えば、コマンドは、未知のバイナリプログラム１０２が特別な機能を呼び出す結果になる、未知のバイナリプログラム１０２における「呼び出し」コマンドであってよい。これらの実施形態及び他の実施形態では、「呼び出し」コマンドに関連する引数は、未知のバイナリプログラム１０２の実行時点で呼び出すことができる未知のバイナリプログラム１０２の内部機能であってよい。別の例としては、未知のバイナリプログラム１０２におけるコマンドは、未知のバイナリプログラム１０２における増大した機能を可能にする「オーソライズ（権限を与える）」コマンドであってよい。これらの実施形態及び他の実施形態では、「オーソライズ」コマンドの引数は、未知のバイナリプログラム１０２により使用され、未知のバイナリプログラム１０２が、未知のバイナリプログラム１０２の他のプロセスを実行することを可能にするトークン又はパスワードであってよい。入力シーケンスに対する有効コマンド及び引数をどのようにして判定するかの更なる説明は、図２に関してなされる。代替的に又は追加的に、入力シーケンス１０４の構築の更なる説明を、図２に関して説明できる。
【００３３】
実行モジュール１２０は、入力シーケンス１０４のそれぞれに対して別個に、インスツルメントされたバイナリプログラム１１２を実行するように構成できる。これらの実施形態及び他の実施形態では、インスツルメントされたバイナリプログラム１１２の各実行は、入力シーケンス１０４の１つを、インスツルメントされたバイナリプログラム１１２に対する入力として行なうことができる。例えば、３つの入力シーケンス１０４がある場合は、実行モジュール１２０は、インスツルメントされたバイナリプログラム１１２を３回実行でき、それぞれの実行は、３つの入力シーケンス１０４のそれぞれに対するものである。
【００３４】
入力シーケンス１０４の１つを使用したインスツルメントされたバイナリプログラム１１２の各実行中に、実行モジュール１２０は、インスツルメントされたバイナリプログラム１１２によりアクセスされたメモリアドレスを記録するように構成できる。これらの実施形態及び他の実施形態では、インスツルメントされたバイナリプログラム１１２は、実行されたときに、アクセスされたメモリアドレスを出力できる。実行モジュール１２０は、アクセスされたアクセスされたメモリアドレスを受信して記録できる。幾つかの実施形態では、アクセスされたメモリアドレスは、インスツルメントされたバイナリプログラム１１２の実行中に書き込まれたメモリアドレスを含むことができる。代替的に又は追加的に、アクセスされたメモリアドレスは、インスツルメントされたバイナリプログラム１１２の実行中に読み込まれたメモリアドレスを含むことができる。代替的に又は追加的に、アクセスされたメモリアドレスは、インスツルメントされたバイナリプログラム１１２の実行中に書き込まれ且つ読み込まれたメモリアドレスを含むことができる。
【００３５】
このようにして、実行モジュール１２０は、記録されたメモリアドレス１２２の複数の組を生成できる。記録されたメモリアドレス１２２の各組は、インスツルメントされたバイナリプログラム１１２の１回の実行により生成できる。例えば、入力シーケンス１０４の１つを使用しての実行モジュール１２０の１回の実行中に記録されたメモリアドレスは、記録されたメモリアドレス１２２の組の１つを形成できる。このため、記録されたメモリアドレス１２２の組の各組は、入力シーケンス１０４の１つに対応し、それと関連付けることができる。記録されたメモリアドレス１２２の組は、有効化モジュール１３０に提供できる。
【００３６】
ディスアセンブルモジュール１４０は、未知のバイナリプログラム１０２についての情報を有効化モジュール１３０に提供するように構成できる。幾つかの実施形態では、ディスアセンブルモジュール１４０は、未知のバイナリプログラム１０２を逆アセンブルするように構成できる。未知のバイナリプログラム１０２の逆アセンブルは、未知のバイナリプログラム１０２についての詳細情報を提供できる。例えば、幾つかの実施形態では、ディスアセンブルモジュール１４０は、未知のバイナリプログラム１０２を機械言語からアセンブリ言語に変換するように構成できる。
【００３７】
逆アセンブルされた未知のバイナリプログラム１０２に基づいて、ディスアセンブルモジュール１４０は、未知のバイナリプログラム１０２のデータ及びＢＳＳメモリセクションにおける１つ以上の変数に対するメモリアドレス範囲１４２を判定するように構成できる。幾つかの実施形態では、ディスアセンブルモジュール１４０は、未知のバイナリプログラム１０２における静的変数、グローバル変数、又は静的グローバル変数の何れかの１つ以上に対するメモリアドレス範囲１４２を判定できる。幾つかの実施形態では、ディスアセンブルモジュール１４０は、未知のバイナリプログラム１０２についてのメモリアドレス範囲１４２を判定するプログラムを含むことができる。例えば、ディスアセンブルモジュール１４０は、ｏｂｊｄｕｍｐ、ＴＤＵＭＰ、ＤＵＭＰＢＩＮ、ｒｅａｄｅｌｆ、又は他のプログラムのような未知のバイナリプログラム１０２についてのメモリアドレス範囲１４２を判定するためのプログラムを含むことができる。ディスアセンブルモジュール１４０は、メモリアドレス範囲１４２を有効化モジュール１３０に提供できる。
【００３８】
有効化モジュール１３０は、ディスアセンブルモジュール１４０からの情報を使用して、記録されたメモリアドレス１２２の１つ以上が、メモリアドレス範囲１４２の１つ以上に対応するかどうかを判定できる。記録されたメモリアドレス１２２の１つは、記録されたメモリアドレス１２２の１つが、メモリアドレス範囲１４２の１つ内にあるときは、メモリアドレス範囲１４２の１つに対応することができる。メモリアドレス範囲１４２の１つ内にある記録されたメモリアドレス１２２の１つは、メモリアドレス範囲に対応する変数は、未知のバイナリプログラム１０２の実行中に読み込まれた、又は書き込まれたかの何れかであることを示すことができる。
【００３９】
記録されたメモリアドレス１２２の１つ以上と、メモリアドレス範囲１４２の１つ以上の間の対応に基づいて、有効化モジュール１３０は、実行されたときに、記録されたメモリアドレス１２２の１つ以上を生成した入力シーケンス１０４は、有効入力シーケンス１０４であると判定できる。これらの実施形態及び他の実施形態では、有効な入力シーケンス１０４は、入力シーケンス１０４が未知のバイナリプログラム１０２により有効入力シーケンスとして認められるということを示すことができる。幾つかの実施形態では、有効な入力シーケンス１０４は、入力シーケンス１０４が未知のバイナリプログラム１０２を別の状態にさせるということを示すことができる。例えば、未知のバイナリプログラム１０２の実行中に未知のバイナリプログラム１０２に提供されると、有効入力シーケンス１０４は、未知のバイナリプログラム１０２を、動作の第１状態から動作の第２状態に遷移させることができる。
【００４０】
幾つかの実施形態では、有効化モジュール１３０は、有効化モジュール１３０がグローバル変数又は静的変数が、入力シーケンス１０４を使用しての未知のバイナリプログラム１０２の実行中に読み込まれた、又は書き込まれたと判定することに基づいて、入力シーケンス１０４は有効であると判定できる。代替的に又は追加的に、有効化モジュール１３０は、有効化モジュール１３０がグローバル変数又は静的変数が、入力シーケンス１０４を使用しての未知のバイナリプログラム１０２の実行中に読み込まれ且つ書き込まれたと判定することに基づいて、入力シーケンス１０４は有効であると判定できる。代替的に又は追加的に、有効化モジュール１３０は、有効化モジュール１３０がグローバル変数及び静的変数の両者が、入力シーケンス１０４を使用しての未知のバイナリプログラム１０２の実行中に読み込まれたと判定すること、又は書き込まれたと判定することに基づいて、入力シーケンス１０４は有効であると判定できる。有効化モジュール１３０は、入力シーケンス１０４及びメモリアドレス範囲１４２のそれぞれに対する記録されたメモリアドレス１２２に基づいて、入力シーケンス１０４のそれぞれに対する有効性を判定できる。
【００４１】
プロセス１００の例を続ける。入力シーケンス１０４は、４つの異なるシーケンス、つまり、「ＨＩ  ＯＫ」、「ＡＵＴＨ  ＯＫ」、「ＡＵＴＨ  ＜ｔｏｋｅｎ＞」、及び「ＨＩ  ＜ｔｏｋｅｎ＞」を含むことができる。これらの実施形態及び他の実施形態では、入力は「ＨＩ」、「ＯＫ」、「ＡＵＴＨ」、及び「＜ｔｏｋｅｎ＞」を含むことができる。これらの入力は、組み合わせて４つの異なる入力シーケンス１０４を形成できる。
【００４２】
実行モジュール１２０は、４つの異なる入力シーケンス１０４のそれぞれにより、インスツルメントされたバイナリプログラム１１２を実行できる。「ＨＩ  ＯＫ」、「ＡＵＴＨ  ＯＫ」、及び「ＨＩ  ＜ｔｏｋｅｎ＞」入力シーケンス１０４に対しては、有効化モジュール１３０は、インスツルメントされたバイナリプログラム１１２におけるグローバル変数又は静的変数は、インスツルメントされたバイナリプログラム１１２の実行中に書き込まれ、又は読み込まれたのではないと判定できる。ＡＵＴＨ  ＜ｔｏｋｅｎ＞入力シーケンス１０４に対しては、有効化モジュール１３０は、インスツルメントされたバイナリプログラム１１２におけるグローバル変数又は静的変数は、インスツルメントされたバイナリプログラム１１２の実行中に書き込まれ、又は読み込まれたかの何れかであると判定できる。結果として、有効化モジュール１３０は、「ＡＵＴＨ  ＜ｔｏｋｅｎ＞」入力シーケンスは、未知のバイナリプログラム１０２対する有効入力シーケンスであると判定できる。本開示の範囲から逸脱することなく、プロセス１００に対して修正、追加、又は省略を行うことができる。
【００４３】
図２は、本開示で説明される少なくとも１つの実施形態に従って配置できる入力判定プロセス２００を例示している。プロセス２００は、入力モジュール２１０及び実行モジュール２２０を使用して、未知のバイナリプログラム２１４に対する１つ以上の入力２１４、及び未知のバイナリプログラム２１４に対する入力シーケンス２３０を判定できる。未知のバイナリプログラム２１４における所与の状態に対する有効入力を判定するシステム及び方法は、２０１５年２月１１日出願され、本願と同時に係属する米国特許出願第１４／６２０，１０６号に記載されており、その全体は、本開示に参照文献として組み込まれる。
【００４４】
幾つかの実施形態では、プロセス２００は、未知のバイナリプログラム２１４の状態に対する入力２１２を判定できる。幾つかの実施形態では、入力２１２は、１つ以上のインデックスを含むことができる入力ストリングにおける１つ以上の印刷可能文字であってよい。プログラムに対する入力ストリングは、１つ以上のインデックス及び１つ以上の印刷可能文字を含むことができる。インデックスは、ストリングで、印刷可能文字が発生する位置を含むことができる。例えば、受け入れる入力ストリングが、「Ｈｅｌｌｏ」及び「Ｈｏｗｄｙ」である場合、インデックスは「０」、「１」、「２」、「３」、及び「４」である。この例では、インデックス「０」における有効文字は、印刷可能文字「Ｈ」を含む。インデックス「１」における有効文字は、印刷可能文字「ｅ」及び「ｏ」を含む。インデックス「２」における有効文字は、「ｌ」及び「ｗ」を含む。インデックス「３」における有効文字は、「ｌ」及び「ｄ」を含む。インデックス「４」における有効文字は、「ｏ」及び「ｙ」を含む。
【００４５】
有効入力ストリングであると考えられるためには、入力ストリングに含まれる各文字は、未知のバイナリプログラム２１４に対して有効である。有効入力ストリングの任意の所与のインデックスに対しても、入力ストリングにおける使用に利用できる印刷可能文字のほとんどは無効であってよい。プロセス２００は、印刷可能文字の組を繰り返しテストして、それらが、未知のバイナリプログラム２１４に対する有効入力ストリングの異なるインデックスに対して有効文字であるかどうかを判定するように構成できる。
【００４６】
入力モジュール２１０は、印刷可能文字を実行モジュール２２０に入力２１２として選択して提供するように構成できる。実行モジュール２２０は、第１印刷可能文字を入力２１２として使用して未知のバイナリプログラム２１４を実行できる。実行モジュール２２０は、入力２１２を使用しての未知のバイナリプログラム２１４の実行中に、未知のバイナリプログラム２１４により行われる指令数を記録できる。行われた指令数は、実行モジュール２２０により指令カウント２２２として出力できる。指令カウント２２２は、入力モジュール２１０に提供できる。
【００４７】
入力モジュール２１０は、指令カウント２２２が閾値範囲を超えているかどうかを判定できる。指令カウント２２２が閾値範囲を超えているときは、入力モジュール２１０は第１印刷可能文字を、未知のバイナリプログラム２１４に対する状態における有効入力として含むことができる候補であると判定できる。指令カウント２２２が閾値範囲以下のときは、入力モジュール２１０は第１印刷可能文字を、未知のバイナリプログラム２１４に対する状態における有効入力として含めることができる候補でないと判定できる。
【００４８】
閾値範囲は、実行された指令数のモード（最頻値）及びテスト定数に基づいて判定できる。モードは、実行された指令数のモードを含むことができる。例えば、実行された指令数は組で記憶できる。組は１つ以上の数値を含むことができる。数値は、入力モジュール２１０により提供された各入力２１２に対して実行された指令数を表すことができる。例えば、第１入力が、実行される１００の指令という結果となったとすると、第１入力に対する数値は「１００」という数であってよい。組は、他の入力に対する他の数を含むことができる。モードは、組で最も多く出現する数値を含むことができる。
【００４９】
テスト定数は、「イプシロン」又は「テスト定数」と称することができる。テスト定数は、如何なる正の実数をも含むことができる。閾値範囲の上限は、テスト定数をモードに加算することにより判定できる。
【００５０】
第１印刷可能文字が、未知のバイナリプログラム２１４に対する状態における有効入力としての候補ではないとき、入力モジュール２１０は、実行のための第２印刷可能文字を実行モジュール２２０に提供できる。同様に、入力モジュール２１０は、第２印刷可能文字が、未知のバイナリプログラム２１４に対する状態における有効入力として含める候補であるかどうかを判定できる。プロセス２００は示されているように、入力モジュール２１０が、未知のバイナリプログラム２１４の状態における有効入力に含める候補である文字を判定するまで動作を継続できる。
【００５１】
入力モジュール２１０は、別の文字を候補文字に連結して入力２１２を形成できる。特に、入力モジュール２１０は、第１候補文字を第１インデックス位置に、別の文字を第２インデックス位置に置くことができる。これらの実施形態及び他の実施形態では、候補文字と別の文字の連結は、部分的有効入力と称することができる。入力モジュール２１０は、入力２１２を実行モジュール２２０に提供できる。
【００５２】
実行モジュール２２０は、入力２１２を使用して未知のバイナリプログラム２１４を実行できる。未知のバイナリプログラム２１４の実行に基づいて、実行モジュール２２０は、指令カウント２２２を出力できる。入力モジュール２１０は、指令カウント２２２に基づいて、第２インデックス位置における別の文字が、未知のバイナリプログラム２１４に対する状態における有効入力に含めることができる候補であるかどうかを判定できる。
【００５３】
プロセス２００は、未知のバイナリプログラム２１４の状態に対して、プロセス２００により判定できる有効入力の全て、又は大半が判定されるまで同様な方法で継続できる。
【００５４】
幾つかの実施形態では、入力モジュール２１０は、有効入力を組み合わせて入力シーケンス２３０を形成できる。幾つかの実施形態では、入力シーケンス２３０に対する入力は、コマンド及びそれらに関連する引数であってよい。これらの実施形態及び他の実施形態では、プロセス２００が、入力としてのコマンドを、可能性のある印刷可能文字と共に提供して、所与のコマンドに対する有効引数を提供できるとき以外は、コマンドは見つかるので、プロセス２００は、同様な方法でコマンドに対する有効引数を判定できる。
【００５５】
幾つかの実施形態では、入力モジュール２１０は、判定された有効入力に対して、規定されている入力シーケンス長の全ての可能な入力シーケンスの順列を構築でき、全ての入力シーケンスの順列を入力シーケンス２３０として提供できる。本開示の範囲を逸脱することなく、プロセス２００に対して修正、追加、又は省略を行うことができる。
【００５６】
図３は、本開示で説明される少なくとも１つの実施形態に従って配置できる入力及び入力シーケンス判定プロセス３００を例示している。幾つかの実施形態では、プロセス３００は、入力シーケンス判定プロセス３１０及び入力判定プロセス３２０を含むことができる。
【００５７】
入力シーケンス判定プロセス３１０は、図１に関して検討したプロセス１００と類似したものであってよい。入力シーケンス判定プロセス３１０は、有効入力シーケンス３１２を判定し、有効入力シーケンス３１２を入力判定プロセス３２０に提供するように構成できる。入力判定プロセス３２０は、図２に関して検討したプロセス２００と類似したものであってよい。入力判定プロセス３２０は、有効入力に基づいて入力シーケンス３２２を判定し、入力シーケンス３２２を入力シーケンス判定プロセス３１０に提供するように構成できる。
【００５８】
プロセス３００の動作の例を続ける。入力判定プロセス３２０は、未知のバイナリプログラムの第１状態に対する複数の有効第１入力を判定できる。入力判定プロセス３２０は、第１状態に対する複数の有効第１入力に基づいて入力シーケンス３２２を判定して、入力シーケンス３２２を入力シーケンス判定プロセス３１０に提供できる。
【００５９】
入力シーケンス判定プロセス３１０は入力シーケンス３２２を受信して、何れの入力シーケンス３２２が、未知のバイナリプログラムの第１状態に対する有効入力シーケンスであるかを判定できる。有効入力シーケンスは、未知のバイナリプログラムを第２状態にさせることができる。入力シーケンス判定プロセス３１０は、第１状態に対する有効入力シーケンス３１２を入力判定プロセス３２０に提供できる。
【００６０】
入力判定プロセス３２０は有効入力シーケンス３１２を受信できる。有効入力シーケンス３１２を使用して、入力判定プロセス３２０は未知のバイナリプログラムを実行して、未知のバイナリプログラムを第２状態にさせることができる。第２状態の間は、入力判定プロセス３２０は、第１状態で有効入力ではなかった追加的な有効入力を判定できる。追加的な有効入力は、有効第２状態入力であってよい。
【００６１】
幾つかの実施形態では、入力判定プロセス３２０は、第１状態入力と第２状態入力を組み合わせて、第２状態に対する入力シーケンス３２２を判定できる。代替的に又は追加的に、入力判定プロセス３２０は、第２状態入力を使用し、第１状態入力を使用しないで、第２状態に対する入力シーケンス３２２を判定できる。入力判定プロセス３２０は、第２状態入力シーケンス３２２を、入力シーケンス判定プロセス３１０に提供できる。
【００６２】
入力シーケンス判定プロセス３１０は、第２状態に対する何れの入力シーケンス３２２が有効入力シーケンス３１２であるかを判定できる。第２状態に対する有効入力シーケンス３１２は、未知のバイナリプログラムを第３状態にさせることができる。入力シーケンス判定プロセス３１０は、第２状態に対する有効入力シーケンス３１２を、入力判定プロセス３２０に提供できる。プロセス３００は、本開示で検討されるように、プロセス３００に続く如何なる数の状態でも、有効入力及び有効入力シーケンス３１２の判定を継続できる。
【００６３】
幾つかの実施形態では、入力判定プロセス３２０は、入力シーケンス３２２の長さを変えるように構成できる。例えば、幾つかの実施形態では、第１状態からの入力シーケンス３２２は第１長であってよく、一方、第２状態からの入力シーケンス３２２は、第１長よりも長い又は短い第２長であってよい。幾つかの実施形態では、第３状態に対する入力シーケンス３２２は、可変の長さであってよい、これらの実施形態及び他の実施形態では、第１状態に対する入力シーケンス３２２は、第１状態及び任意の以前の状態に対して、入力判定プロセス３２０により判定された有効入力の全ての可能な組み合わせ／順列を含むことができる。例えば、入力判定プロセス３２０が、３つの有効入力Ａ、Ｂ、及びＣを判定すると仮定すると、入力Ａ、Ｂ、及びＣに対する入力シーケンス３２２は、Ａ、Ｂ、Ｃ、ＡＢ、ＡＣ、ＢＡ、ＢＣ、ＣＡ、ＣＢ、ＡＢＣ、ＡＣＢ、ＢＡＣ、ＢＣＡ、ＣＡＢ、及びＣＢＡを含むことができる。代替的に又は追加的に、第１状態に対する入力シーケンス３２２は、第１状態及び任意の以前の状態に対して、入力判定プロセス３２０に判定された有効入力の可能な組み合わせ／順列の幾つか、又は全てを含むことができる。幾つかの実施形態では、入力シーケンスにおける入力の順序付けは、入力シーケンス３２２を、別の入力シーケンス３２２とは異なるものにさせることができる。例えば、入力シーケンスＡＢは、入力シーケンスＢＡと異なるものであってよい。代替的に又は追加的に、入力シーケンスにおける入力の順序付けは、入力シーケンスを異なるものにさせなくてよい。
【００６４】
プロセス３００は、異なる複数の有効入力及び有効入力シーケンスを判定して、未知のバイナリプログラム内で、異なる複数の状態間を行き交うための方法を提供するように構成できる。このようにして、未知のバイナリプログラムを、クラッシング、グリッチングのような適切な動作とは相いれないように動作させ、あるいは、不適切に動作させることができる入力の１つ以上のシーケンスを判定できる。更に、プロセス３００の、有効入力及び有効入力シーケンス３１２を判定する機能は、未知のバイナリプログラムの適切な評価及び／又は動作を可能にできる。本開示におけるプロセス３００及び他のプロセスの他の利点及び使用法もまた考慮及び予想される。
【００６５】
本開示の範囲から逸脱することなく、プロセス３００に対して修正、追加、又は省略を行うことができる。例えば、入力シーケンス判定プロセス３１０と入力判定プロセス３２０は、単一のプロセスに組み合わせることができる。これらの実施形態及び他の実施形態では、入力シーケンス判定プロセス３１０及び入力判定プロセス３２０の実行モジュール２２０と他のモジュールは共有できる。
【００６６】
図４は、本開示で説明される少なくとも１つの実施形態に従って配置できる入力判定システム４００のブロック図である。図４に例示されているように、システム４００は、プロセッサ４１０と、メモリ４１２と、データストレージ４１４と、通信ユニット４１６を含むことができる。
【００６７】
一般的に、プロセッサ４１０は、任意の適切な特殊用途又は汎用コンピュータ、コンピューティングエンティティ、又は種々のコンピュータハードウェア又はソフトウェアモジュールを含む処理装置を含むことができ、任意の適用可能なコンピュータ読み取り可能記憶媒体に記憶されている指令を実行するように構成できる。例えば、プロセッサ４１０は、マイクロプロセッサ、マクロコントローラ、デジタル信号プロセッサ（ＤＳ）、特定用途向け集積回路（ＡＳＩＣ）、フィールドプログラマブルゲートアレイ（Ｆｉｅｌｄ-Ｐｒｏｇｒａｍｍａｂｌｅ  Ｇａｔｅ  Ａｒｒａｙ：ＦＰＧＡ）、又はプログラム指令を解釈及び／又は実行し、及び／又はデータを処理するように構成されている任意の他のデジタル又はアナログ回路を含むことができる。図４では、単一プロセッサとして例示されているが、プロセッサ４１０は、任意の数のネットワーク又は物理的位置にわたって分散され、ここでて説明される任意の数の動作を個々に、又は一括して行うように構成されている任意の数のプロセッサを含むことができる。幾つかの実施形態では、プロセッサ４１０は、プログラム指令を解釈及び／又は実行し、及び／又はメモリ４１２、データストレージ４１４、又はメモリ４１２及びデータストレージ４１４に記憶されているデータを処理できる。幾つかの実施形態では、プロセッサ４１０は、データストレージ４１４からプログラム指令をフェッチし、プログラム指令をメモリ４１２にロードできる。プログラム指令がメモリ４１２にロードされた後、プロセッサ４１０は、図１、２、３、及び５それぞれのプロセス１００、プロセス２００、プロセス３００及び／又は方法５００を行う指令のようなプログラム指令を実行できる。
【００６８】
メモリ４１２及びデータストレージ４１４は、記憶されているコンピュータ実行可能指令又はデータ構造を保持又は有するためのコンピュータ読み取り可能記憶媒体又は１つ以上のコンピュータ読み取り可能記憶媒体を含むことができる。そのようなコンピュータ読み取り可能記憶媒体は、プロセッサ４１０のような汎用コンピュータ又は特殊用途コンピュータによりアクセスできる任意の利用可能媒体であってよい。例として、制限されることはないが、そのようなコンピュータ読み取り可能記憶媒体は、ランダムアクセスメモリ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ：ＲＡＭ）、リードオンリメモリ（Ｒｅａｄ-Ｏｎｌｙ  Ｍｅｍｏｒｙ：ＲＯＭ）、電気的消去可能型プログラマブルリードオンリメモリ（Ｅｌｅｃｔｒｉｃａｌｌｙ  Ｅｒａｓａｂｌｅ  Ｐｒｏｇｒａｍｍａｂｌｅ  Ｒｅａｄ-Ｏｎｌｙ  Ｍｅｍｏｒｙ：ＥＥＰＲＯＭ）、コンパクトディスクリードオンリメモリ（Ｃｏｍｐａｃｔ  Ｄｉｓｃ  Ｒｅａｄ-Ｏｎｌｙ  Ｍｅｍｏｒｙ：ＣＤ−ＲＯＭ）、又は他の光ディスクストレージ、磁気ディスクストレージ、又は他の磁気記憶装置、フラッシュメモリ装置（例えば、ソリッドステートメモリ装置）、又はコンピュータ実行可能指令又はデータ構造の形式の所望のプログラムコードを保持又は記憶するために使用でき、汎用コンピュータ又は特殊用途コンピュータによりアクセスできる任意の他の記憶媒体を含んでいる非持続的なコンピュータ読み取り可能記憶媒体を含むことができる。上記の組合せもまたコンピュータ読み取り可能記憶媒体の範囲内に含めることができる。コンピュータ実行可能指令は、例えば、プロセッサ４１０にある動作又は動作群を行わせるように構成されている指令及びデータを含むことができる。
【００６９】
通信ユニット４１６は、未知のバイナリプログラムを受信し、未知のバイナリプログラムをデータストレージ４１４に提供するように構成できる。データストレージ４１４により受信された後、未知のバイナリプログラムに対する入力及び入力シーケンスは、プロセッサ４１０及びデータストレージに記憶されている指令を使用して判定される。幾つかの実施形態では、判定された入力及び入力シーケンスは、通信ユニット４１６を使用して、システム４００の外部に提供できる。
【００７０】
本開示の範囲から逸脱することなく、システム４００に対して修正、追加、又は省略を行うことができる。例えば、データストレージ４１４は、複数の位置に位置させることができ、ネットワークを通して、プロセッサ４１０によりアクセスできる。
【００７１】
図５は、本開示で説明される少なくとも１つの実施形態に従って配置できる未知のバイナリプログラムに対する有効入力シーケンスを判定するための方法５００のフローチャートの一例である。方法５００は、幾つかの実施形態では、図４のシステム４００のようなシステムにより実現できる。分離したブロックで例示されているが、所望されるインプレメンテーション（実現形態）に従って、種々のブロックを追加的ブロックに分割し、又はより少ないブロックに統合、又は消去できる。
【００７２】
方法５００は、ブロック５０２で開始することができ、このブロックでは、未知のバイナリプログラムに対する入力シーケンスを得ることができる。入力シーケンスは、２つ以上の異なる入力を含むことができる。入力シーケンスに対する入力は、未知のバイナリプログラムに対する有効入力として判定されていてよい。幾つかの実施形態では、入力の１つ以上は、未知のバイナリプログラムに対して有効であると判定されたコマンドと、コマンドに関連する引数を含むことができる。幾つかの実施形態では、引数もまた、未知のバイナリプログラムに対して有効であると判定することもできる。
【００７３】
ブロック５０４では、未知のバイナリプログラムにおける１つ以上の変数のそれぞれに対するメモリアドレス範囲を得ることができる。幾つかの実施形態では、変数は、静的変数、グローバル変数、又は静的グローバル変数の何れかであってよい。幾つかの実施形態では、メモリアドレス範囲は、未知のバイナリプログラムのデータセクション、ＢＳＳセクション、又はデータセクション及びＢＳＳセクションの両者内に位置することができる。
【００７４】
ブロック５０６では、未知のバイナリプログラムのインスツルメントされたバージョンを、入力シーケンスを、未知のバイナリプログラムのインスツルメントされたバージョンへの入力として実行することができる。
【００７５】
ブロック５０８では、未知のバイナリプログラムのインスツルメントされたバージョンの実行中にアクセスされた１つ以上のメモリアドレスを記録することができる。幾つかの実施形態では、メモリアドレスは、メモリアドレスが読み込まれる、又は書き込まれるかの何れかでアクセスできる。代替的に又は追加的に、メモリアドレスは、メモリアドレスが読み込まれるとき、及び書き込まれるときの両方でアクセスされる。
【００７６】
ブロック５１０では、未知のバイナリプログラムにおける変数の１つ以上のメモリアドレス範囲に対応する１つ以上の記録されたメモリアドレスの１つ以上に基づいて、未知のバイナリプログラムは、入力シーケンスを有効と認めると判定することができる。
【００７７】
当業者は、ここで開示されたこのプロセス及び方法、並びに他のプロセス及び方法に対して、プロセス及び方法で行われる機能は、異なる順序でも実現できるということを認識するであろう。更に、概略を説明したステップ及び動作は、例として提供されたものに過ぎず、ステップ又は動作の幾つかは任意であり、開示された実施形態の真髄を損なうことなく、より少ないステップ及び動作に統合、又は追加的ステップ及び動作へ拡張することができる。
【００７８】
例えば、方法５００は、実行されたときに、未知のバイナリプログラムによりアクセスされたメモリアドレスを出力する未知のバイナリプログラムに、追加的コード指令を追加することにより、未知のバイナリプログラムをインスツルメントすることを更に含むことができる。
【００７９】
幾つかの実施形態では、入力シーケンスは第１入力シーケンスであって、メモリアドレスは第１メモリアドレスであってよい。これらの実施形態及び他の実施形態では、方法５００は、未知のバイナリプログラムに対する第２入力シーケンスを得ることと、第１入力シーケンスと第２入力シーケンスを、未知のバイナリプログラムのインスツルメントされたバージョンへの入力として使用して、未知のバイナリプログラムのインスツルメントされたバージョンを実行することを更に含むことができる。これらの実施形態及び他の実施形態では、方法５００は、第２入力シーケンスが、未知のバイナリプログラムのインスツルメントされたバージョンへ入力される間及びその後に、未知のバイナリプログラムのインスツルメントされたバージョンの実行中にアクセスされた１つ以上の第２メモリアドレスを記録することと、未知のバイナリプログラムにおける変数の１つ以上のメモリアドレス範囲に対応する１つ以上の記録された第２メモリアドレスの１つ以上に基づいて、未知のバイナリプログラムは、第２入力シーケンスを有効と認めると判定することを更に含むことができる。
【００８０】
幾つかの実施形態では、入力シーケンスは第１入力シーケンスであって、メモリアドレスは第１メモリアドレスであってよい。これらの実施形態及び他の実施形態では、方法５００は、第１入力シーケンスを提供し、その後に文字シーケンスを入力として提供することにより、未知のバイナリプログラムを実行することを更に含むことができる。方法５００はまた、未知のバイナリプログラムの指令カウントを記録することと、指令カウントに基づいて、文字シーケンスは有効入力であると判定することも含むことができる。方法５００は、文字シーケンスを使用して、第２入力シーケンスを生成することを更に含むことができる。
【００８１】
これらの実施形態及び他の実施形態では、方法５００は、第１入力シーケンスと第２入力シーケンスを、未知のバイナリプログラムのインスツルメントされたバージョンへの入力として、未知のバイナリプログラムのインスツルメントされたバージョンを実行することを更に含むことができる。これらの実施形態及び他の実施形態では、方法５００は、第２入力シーケンスが入力される間及びその後に、未知のバイナリプログラムのインスツルメントされたバージョンの実行中にアクセスされた１つ以上の第２メモリアドレスを記録することと、未知のバイナリプログラムにおける変数の１つ以上のメモリアドレス範囲に対応する１つ以上の記録された第２メモリアドレスの１つ以上の１つ以上に基づいて、未知のバイナリプログラムは、第２入力シーケンスを有効と認めると判定することを更に含むことができる。
【００８２】
ここで説明される実施形態は、より詳細に下記で検討するように、種々のコンピュータハードウェア又はソフトウェアモジュールを含んでいる特殊用途又は汎用コンピュータの使用を含むことができる。
【００８３】
ここで説明される実施形態は、記憶されているコンピュータ実行可能指令又はデータ構造を保持又は有するためのコンピュータ読み取り可能媒体を使用して実現できる。そのようなコンピュータ読み取り可能媒体は、汎用コンピュータ又は特殊用途コンピュータによりアクセスできる任意の利用可能な媒体であってよい。例として、制限されることはないが、そのようなコンピュータ読み取り可能媒体は、ランダムアクセスメモリ（ＲＡＭ）、リードオンリメモリ（ＲＯＭ）、電気的消去可能型プログラマブルリードオンリメモリ（ＥＥＰＲＯＭ）、コンパクトディスクリードオンリメモリ（ＣＤ−ＲＯＭ）、又は他の光ディスクストレージ、磁気ディスクストレージ、又は他の磁気記憶装置、フラッシュメモリ装置（例えば、ソリッドステートメモリ装置）、又はコンピュータ実行可能指令又はデータ構造の形式の所望のプログラムコードを保持又は記憶するために使用でき、汎用コンピュータ又は特殊用途コンピュータによりアクセスできる任意の他の記憶媒体を含んでいる非持続的なコンピュータ読み取り可能記憶媒体を含むことができる。上記の組合せもまたコンピュータ読み取り可能媒体の範囲内に含めることができる。
【００８４】
コンピュータ実行可能指令は、例えば、汎用コンピュータ、特殊用途コンピュータ、又は特殊用途処理装置（例えば、１つ以上のプロセッサ）に、ある機能又は機能群を行わせることができる指令及びデータを備えている。主題を、構造的特徴及び／又は方法論的行動に関して特定の言語で説明してきたが、添付された請求項で定義される主題は、上述した特定の特徴又は行動に必ずしも制限されないということは理解されるべきである。上述した特定の特徴及び行動は、請求項を実現する形状の一例として開示されている。
【００８５】
ここで使用されているように、「モジュール」又は「構成要素」という用語は、モジュール又は構成要素の動作、及び／又はコンピューティングシステムの汎用ハードウェア（例えば、コンピュータ読み取り可能媒体、処理装置など）上に記憶され、及び／又はそれにより実行され得るソフトウェアオブジェクト又はソフトウェアルーチンを行うように構成されている特定のハードウェアインプレメンテーションのこと指すことができる。幾つかの実施形態では、ここで説明されている異なる構成要素、モジュール、エンジン、及びサービスは、コンピューティングシステム上で実行される（例えば、別個のスレッドのような）オブジェクト又はプロセスとして実現できる。
【００８６】
ここで説明されるシステム及び方法の幾つかは、全体的に、ソフトウェア（汎用ハードウェア上に記憶され、及び／又はそれにより実行される）で実現されるものとして説明されたが、特定のハードウェアインプレメンテーション又はソフトウェアと特定のハードウェアインプレメンテーションの組合せもまた可能であり、予想される。本説明では、「コンピューティングエンティティ」は、ここで以前に定義したような任意のコンピューティングシステムであってよく、又はコンピューティングシステム上で動作する任意のモジュール又はモジュールの組み合せであってよい。
【００８７】
ここで、及び特に添付された請求項（例えば、添付された請求項の本文）で使用される用語は、全体として「開いた」用語であることが意図されている（例えば、「〜を含んでいる」という用語は、「〜を含んでいるが、しかしそれに制限されない」と解釈されるべきであり、「〜を有している」という用語は、「少なくとも〜を有している」と解釈されるべきであり、「〜を含む」という用語は、「〜を含むが、しかしそれに制限されない」と解釈されるべきという具合である）。
【００８８】
追加的に、導入される請求項の詳説（ｒｅｃｉｔａｔｉｏｎ）の特定の数が意図された場合、そのような意図は、請求項で明示的に詳説され、そのような詳説がない場合は、そのような意図は存在しない。例えば、理解を支援するものとして、下記の添付された請求項は、導入のためのフレーズである「少なくとも１つ」及び「１つ以上」の使用を、請求項の詳説を導入するために含むことができる。しかし、その様なフレーズの使用は、たとえ同じ請求項が、導入のためのフレーズ「１つ以上」又は「少なくとも１つ」及び「ａ」（１つの）又は「ａｎ」（１つの）のような不定冠詞を含んでいる場合であっても、不定冠詞「ａ」（１つの）又は「ａｎ」（１つの）による請求項の詳説の導入は、そのような導入された請求項の詳説を含む如何なる特別な請求項を、そのような詳説を１つのみ含んでいる実施形態に制限するということを意味していると解釈されるべきではない（例えば、「ａ」（１つの）及び／又は「ａｎ」（１つの）は、「少なくとも１つ」又は「１つ以上」を意味すると解釈されるべきである）。同様のことが、請求項の詳説を導入するために使用される定冠詞についても当てはまる。
【００８９】
更に、導入された請求項の詳説の特定の数が明示的に詳説されていた場合でさえも、当業者は、そのような詳説は、少なくとも詳説された数を意味するものと解釈されるべきであることを認識するであろう（例えば、「２つの詳説」という他の修飾語がまったくない詳説は、少なくとも２つの詳説又は２つ以上の詳説を意味する）。更に、「Ａ、Ｂ、Ｃ少なくとも１つなど」又は「Ａ、Ｂ、Ｃ１つ以上など」に類似した用法が使用される例では、一般的に、そのような構文は、Ａのみ、Ｂのみ、Ｃのみ、ＡとＢ共に、ＡとＣ共に、ＢとＣ共に、又はＡとＢとＣ共になどを含むように意図されている。例えば、「及び／又は」という用語の使用は、このように解釈されることが意図されている。
【００９０】
更に、詳細な説明、請求項、又は図面何れでも、２つ以上の代替の用語を提示している何れの分離接続詞的単語又はフレーズは、用語の１つ、用語の何れか、又は両者の用語を含んでいる可能性があると考えて理解されるべきである。例えば、「Ａ又はＢ」というフレーズは、「Ａ」又は「Ｂ」又は「ＡとＢ」の可能性を含んでいると理解されるべきである。
【００９１】
以上、実施形態を説明したが、ここに記載した全ての例や条件は、発明および技術に適用する発明の概念の理解を助ける目的で記載されたものであり、特に記載された例や条件は発明の範囲を制限することを意図するものではなく、明細書のそのような例の構成は発明の利点および欠点を示すものではない。発明の実施形態を詳細に記載したが、各種の変更、置き換え、変形が発明の精神および範囲を逸脱することなく行えることが理解されるべきである。
【図１】
0006642114.tif 000002
【図２】
0006642114.tif 000003
【図３】
0006642114.tif 000004
【図４】
0006642114.tif 000005
【図５】
0006642114.tif 000006