(57)【要約】  ソフトウェアのバイナリイメージ内の特定のソフトウェアの関数、モジュール、または演算ブロックを識別することができる方法およびコンピューティングデバイス。バイナリイメージ内のメモリレジスタおよびメモリアドレスの参照が正規化される。バイナリイメージ内の関数が識別される。一致があるかどうかを決定するために、バイナリイメージ内の各関数を、1つまたは複数の参照関数のバイナリイメージと比較する。関数と参照関数との比較は、ビットパターンを比較することによって、または選択された関数にハッシュ関数を適用することによって生成されるハッシュ値と参照関数とを比較することによって達成することができる。バイナリイメージ内の関数内の構成要素パーツが識別され、参照関数内または参照関数の構成要素パーツのデータベース内における参照関数の構成要素パーツと比較され得る。比較の結果は、ソフトウェアのバイナリイメージが参照関数および/または構成要素パーツに一致する度合いを決定するために使用され得る。
2012525648.tif 000002
【特許請求の範囲】
【請求項１】
ソフトウェアのバイナリイメージ内のメモリレジスタおよびメモリアドレスの参照を正規化するステップと、
一致があるかどうかを決定するために、前記正規化されたバイナリイメージを参照バイナリイメージと比較するステップと
を含むソフトウェアのバイナリイメージを分析するための方法。
【請求項２】
前記ソフトウェアのバイナリイメージ内の分岐アドレスを正規化するステップをさらに含む請求項1に記載の方法。
【請求項３】
プロセッサと、
前記プロセッサに結合されたメモリと
を含み、前記プロセッサが、
前記ソフトウェアのバイナリイメージ内のメモリレジスタおよびメモリアドレスの参照を正規化するステップと、
一致があるかどうかを決定するために、前記正規化されたバイナリイメージを参照バイナリイメージと比較するステップと
を含むステップを実行するためのソフトウェア命令で構成される
コンピュータ。
【請求項４】
前記プロセッサが、前記ソフトウェアのバイナリイメージ内の分岐アドレスを正規化するステップをさらに含むステップを実行するためのソフトウェア命令で構成される請求項3に記載のコンピュータ。
【請求項５】
ソフトウェアのバイナリイメージ内のメモリレジスタおよびメモリアドレスの参照を正規化するための手段と、
一致があるかどうかを決定するために、前記正規化されたバイナリイメージを参照バイナリイメージと比較するための手段と
を含むコンピュータ。
【請求項６】
前記ソフトウェアのバイナリイメージ内の分岐アドレスを正規化するための比較手段をさらに含む請求項3に記載のコンピュータ。
【請求項７】
ソフトウェアのバイナリイメージ内のメモリレジスタおよびメモリアドレスの参照を正規化するステップと、
一致があるかどうかを決定するために、前記正規化されたバイナリイメージを参照バイナリイメージと比較するステップと
を含むステップをコンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する有形の記憶媒体。
【請求項８】
前記ソフトウェアのバイナリイメージ内の分岐アドレスを正規化するステップをさらに含むステップをコンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する請求項7に記載の有形の記憶媒体。
【請求項９】
正規化されたバイナリイメージを生成するために、ソフトウェアのバイナリイメージ内のメモリレジスタおよびメモリアドレスの参照を正規化するステップと、
前記正規化されたバイナリイメージ内の関数を識別するステップと、
一致があるかどうかを決定するために、前記正規化されたバイナリイメージ内の識別された各関数を参照バイナリイメージと比較するステップと
を含むソフトウェアのバイナリイメージを分析するための方法。
【請求項１０】
前記比較するステップが、複数の参照バイナリイメージのうちの任意の1つとの一致があるかどうかを決定するために、前記正規化されたバイナリイメージ内の識別された各関数を前記複数の参照バイナリイメージのそれぞれと比較するステップを含む請求項9に記載の方法。
【請求項１１】
前記比較するステップが、
前記正規化されたバイナリイメージ内の前記識別された関数のうちの1つを選択するステップと、
一致があるかどうかを決定するために、前記識別された関数のうちの前記選択された1つにおけるビットパターンを前記参照バイナリイメージ内のビットパターンと比較することによって、前記識別された関数のうちの前記選択された1つを前記参照バイナリイメージと比較するステップと
を含む請求項9に記載の方法。
【請求項１２】
前記正規化されたバイナリイメージ内の前記識別された関数のうちの次の1つを選択するステップと、
一致があるかどうかを決定するために、前記識別された関数のうちの前記選択された次の1つにおけるビットパターンを前記参照バイナリイメージ内のビットパターンと比較することによって、前記識別された関数のうちの前記選択された次の1つを前記参照バイナリイメージと比較するステップと
をさらに含む請求項5に記載の方法。
【請求項１３】
前記比較するステップが、
前記正規化されたバイナリイメージ内の前記識別された関数のうちの1つを選択するステップと、
第1のハッシュ値を生成するために、前記識別された関数のうちの前記選択された1つにハッシュアルゴリズムを適用するステップと、
一致があるかどうかを決定するために、前記第1のハッシュ値を第1の参照ハッシュ値と比較するステップであって、前記参照バイナリイメージに前記ハッシュアルゴリズムを適用することによって、前記第1の参照ハッシュ値が生成されたステップと
を含む請求項9に記載の方法。
【請求項１４】
前記正規化されたバイナリイメージ内の前記識別された関数のうちの次の1つを選択するステップと、
第2のハッシュ値を生成するために、前記識別された関数のうちの前記選択された次の1つに前記ハッシュアルゴリズムを適用するステップと、
一致があるかどうかを決定するために、前記第2のハッシュ値を前記第1の参照ハッシュ値と比較するステップと
をさらに含む請求項13に記載の方法。
【請求項１５】
前記第1のハッシュ値を前記第1の参照ハッシュ値と比較する前記ステップが、複数の参照ハッシュ値のうちの任意の1つとの一致があるかどうかを決定するために、前記第1のハッシュ値を前記複数の参照ハッシュ値のそれぞれと比較するステップであって、複数の参照バイナリイメージのそれぞれに前記ハッシュアルゴリズムを適用することによって、前記複数のハッシュ値が生成されたステップを含む請求項13に記載の方法。
【請求項１６】
前記識別された関数のうちの少なくとも1つの中の構成要素パーツを識別するステップと、
前記識別された構成要素パーツのうちの第1のものを選択するステップと、
構成要素のハッシュ値を生成するために、前記識別された構成要素パーツのうちの前記選択された第1のものにハッシュアルゴリズムを適用するステップと、
一致があるかどうかを決定するために、前記構成要素のハッシュ値を参照の構成要素のハッシュ値と比較するステップであって、前記参照バイナリイメージの構成要素パーツに前記ハッシュアルゴリズムを適用することによって、前記参照の構成要素のハッシュ値が生成されたステップと
をさらに含む請求項9に記載の方法。
【請求項１７】
前記識別された関数のうちの少なくとも1つの中の構成要素パーツを識別するステップと、
前記識別された構成要素パーツのうちの第1のものを選択するステップと、
構成要素のハッシュ値を生成するために、前記識別された構成要素パーツのうちの前記選択された第1のものに前記ハッシュアルゴリズムを適用するステップと、
一致があるかどうかを決定するために、前記構成要素のハッシュ値を参照の構成要素のハッシュ値と比較するステップであって、前記参照バイナリイメージの構成要素パーツに前記ハッシュアルゴリズムを適用することによって、前記参照の構成要素のハッシュ値が生成されたステップと
をさらに含む請求項13に記載の方法。
【請求項１８】
前記正規化されたバイナリイメージ内の分岐アドレスを正規化するステップをさらに含む請求項9に記載の方法。
【請求項１９】
正規化されたバイナリイメージを生成するために、ソフトウェアのバイナリイメージ内のメモリレジスタおよびメモリアドレスの参照を正規化するステップと、
前記正規化されたバイナリイメージ内の関数を識別するステップと、
前記識別された関数のそれぞれの中の構成要素パーツを識別するステップと、
前記正規化されたバイナリイメージ内の前記識別された関数のうちの1つを選択するステップと、
前記識別された関数の前記選択された1つの中の前記識別された構成要素パーツのうちの1つを選択するステップと、
構成要素のハッシュ値を生成するために、前記識別された構成要素パーツのうちの前記選択された1つにハッシュアルゴリズムを適用するステップと、
一致があるかどうかを決定するために、前記構成要素のハッシュ値を参照ハッシュ値と比較するステップであって、参照関数のバイナリイメージの構成要素パーツに前記ハッシュアルゴリズムを適用することによって、前記参照ハッシュ値が生成されたステップと
を含むソフトウェアのバイナリイメージを分析するための方法。
【請求項２０】
前記構成要素のハッシュ値を参照ハッシュ値と比較する前記ステップが、複数の参照ハッシュ値のうちの任意の1つとの一致があるかどうかを決定するために、前記構成要素のハッシュ値を前記複数の参照ハッシュ値のそれぞれと比較するステップであって、複数の参照バイナリイメージの各構成要素パーツに前記ハッシュアルゴリズムを適用することによって、前記複数の参照ハッシュ値が生成されたステップを含む請求項19に記載の方法。
【請求項２１】
前記正規化されたバイナリイメージ内の分岐アドレスを正規化するステップをさらに含む請求項19に記載の方法。
【請求項２２】
前記識別された関数のうちの前記選択された1つの中の前記識別された構成要素パーツのうちの1つを選択する前記ステップと、構成要素のハッシュ値を生成するために、前記識別された構成要素パーツのうちの前記選択された1つに前記ハッシュアルゴリズムを適用する前記ステップと、前記構成要素のハッシュ値を参照ハッシュ値と比較する前記ステップとが、前記識別された関数の前記選択された1つの前記構成要素パーツのそれぞれについての各構成要素のハッシュ値が前記参照ハッシュ値と比較されるまで繰り返される請求項19に記載の方法。
【請求項２３】
前記正規化されたバイナリイメージ内の前記識別された関数のうちの1つを選択する前記ステップが、前記正規化されたバイナリイメージ内の前記識別された関数のそれぞれの前記構成要素パーツのそれぞれについて、すべての構成要素のハッシュ値が前記参照ハッシュ値と比較されるまで繰り返される請求項22に記載の方法。
【請求項２４】
前記構成要素のハッシュ値を参照ハッシュ値と比較する前記ステップが、複数の参照ハッシュ値のうちの任意の1つとの一致があるかどうかを決定するために、前記構成要素のハッシュ値を前記複数の参照ハッシュ値のそれぞれと比較するステップであって、複数の参照バイナリイメージの各構成要素パーツに前記ハッシュアルゴリズムを適用することによって、前記複数の参照ハッシュ値が生成されたステップを含む請求項23に記載の方法。
【請求項２５】
1つまたは複数の参照ハッシュ値に一致するいくつかの構成要素のハッシュ値を識別する出力を提供するステップをさらに含む請求項24に記載の方法。
【請求項２６】
前記出力が参照関数内の構成要素パーツに一致する構成要素パーツの割合である請求項25に記載の方法。
【請求項２７】
選択された関数内の一致した構成要素パーツの順序を参照関数内の一致した構成要素パーツの順序と比較する出力を提供するステップをさらに含む請求項19に記載の方法。
【請求項２８】
プロセッサと、
前記プロセッサに結合されたメモリと
を含み、前記プロセッサが、
正規化されたバイナリイメージを生成するために、ソフトウェアのバイナリイメージ内のメモリレジスタおよびメモリアドレスの参照を正規化するステップと、
前記正規化されたバイナリイメージ内の関数を識別するステップと、
一致があるかどうかを決定するために、前記正規化されたバイナリイメージ内の識別された各関数を参照バイナリイメージと比較するステップと
を含むステップを実行するためのソフトウェア命令で構成される
コンピュータ。
【請求項２９】
前記プロセッサが、複数の参照バイナリイメージのうちの任意の1つとの一致があるかどうかを決定するために、前記正規化されたバイナリイメージ内の識別された各関数を前記複数の参照バイナリイメージのそれぞれと比較するステップを、前記比較するステップが含むようなソフトウェア命令で構成される請求項28に記載のコンピュータ。
【請求項３０】
前記プロセッサが、
前記正規化されたバイナリイメージ内の前記識別された関数のうちの1つを選択するステップと、
一致があるかどうかを決定するために、前記識別された関数のうちの前記選択された1つにおけるビットパターンを前記参照バイナリイメージ内のビットパターンと比較することによって、前記識別された関数のうちの前記選択された1つを前記参照バイナリイメージと比較するステップと
を、前記比較するステップが含むようなソフトウェア命令で構成される請求項28に記載のコンピュータ。
【請求項３１】
前記プロセッサが、
前記正規化されたバイナリイメージ内の前記識別された関数のうちの次の1つを選択するステップと、
一致があるかどうかを決定するために、前記識別された関数のうちの前記選択された次の1つにおけるビットパターンを前記参照バイナリイメージ内のビットパターンと比較することによって、前記識別された関数のうちの前記選択された次の1つを前記参照バイナリイメージと比較するステップと
をさらに含むステップを実行するためのソフトウェア命令で構成される請求項30に記載のコンピュータ。
【請求項３２】
前記プロセッサが、
前記正規化されたバイナリイメージ内の前記識別された関数のうちの1つを選択するステップと、
第1のハッシュ値を生成するために、前記識別された関数のうちの前記選択された1つにハッシュアルゴリズムを適用するステップと、
一致があるかどうかを決定するために、前記第1のハッシュ値を第1の参照ハッシュ値と比較するステップであって、前記参照バイナリイメージに前記ハッシュアルゴリズムを適用することによって、前記第1の参照ハッシュ値が生成されたステップと
を、前記比較するステップが含むようなソフトウェア命令で構成される請求項28に記載のコンピュータ。
【請求項３３】
前記プロセッサが、
前記正規化されたバイナリイメージ内の前記識別された関数のうちの次の1つを選択するステップと、
第2のハッシュ値を生成するために、前記識別された関数のうちの前記選択された次の1つに前記ハッシュアルゴリズムを適用するステップと、
一致があるかどうかを決定するために、前記第2のハッシュ値を前記第1の参照ハッシュ値と比較するステップと
をさらに含むステップを実行するためのソフトウェア命令で構成される請求項32に記載のコンピュータ。
【請求項３４】
前記プロセッサが、複数の参照ハッシュ値のうちの任意の1つとの一致があるかどうかを決定するために、前記第1のハッシュ値を前記複数の参照ハッシュ値のそれぞれと比較するステップであって、複数の参照バイナリイメージのそれぞれに前記ハッシュアルゴリズムを適用することによって前記複数のハッシュ値が生成されたステップを、前記第1のハッシュ値を参照ハッシュ値と比較する前記ステップが含むようなソフトウェア命令で構成される請求項32に記載のコンピュータ。
【請求項３５】
前記プロセッサが、
前記識別された関数のうちの少なくとも1つの中の構成要素パーツを識別するステップと、
前記識別された構成要素パーツのうちの第1のものを選択するステップと、
構成要素のハッシュ値を生成するために、前記識別された構成要素パーツのうちの前記選択された第1のものにハッシュアルゴリズムを適用するステップと、
一致があるかどうかを決定するために、前記構成要素のハッシュ値を参照のハッシュ値と比較するステップであって、前記参照バイナリイメージの構成要素パーツに前記ハッシュアルゴリズムを適用することによって、前記参照の構成要素のハッシュ値が生成されたステップと
をさらに含むステップを実行するためのソフトウェア命令で構成される請求項28に記載のコンピュータ。
【請求項３６】
前記プロセッサが、
前記識別された関数のうちの少なくとも1つの中の構成要素パーツを識別するステップと、
前記識別された構成要素パーツのうちの第1のものを選択するステップと、
構成要素のハッシュ値を生成するために、前記識別された構成要素パーツのうちの前記選択された第1のものに前記ハッシュアルゴリズムを適用するステップと、
一致があるかどうかを決定するために、前記構成要素のハッシュ値を第2の参照のハッシュ値と比較するステップであって、前記参照バイナリイメージの構成要素パーツに前記ハッシュアルゴリズムを適用することによって、前記参照の構成要素のハッシュ値が生成されたステップと
をさらに含むステップを実行するためのソフトウェア命令で構成される請求項32に記載のコンピュータ。
【請求項３７】
前記プロセッサが、前記正規化されたバイナリイメージ内の分岐アドレスを正規化するステップをさらに含むステップを実行するためのソフトウェア命令で構成される請求項28に記載のコンピュータ。
【請求項３８】
プロセッサと、
前記プロセッサに結合されたメモリと
を含み、前記プロセッサが、
正規化されたバイナリイメージを生成するために、前記ソフトウェアのバイナリイメージ内のメモリレジスタおよびメモリアドレスの参照を正規化するステップと、
前記正規化されたバイナリイメージ内の関数を識別するステップと、
前記識別された関数のそれぞれの中の構成要素パーツを識別するステップと、
前記正規化されたバイナリイメージ内の前記識別された関数のうちの1つを選択するステップと、
前記識別された関数の前記選択された1つの中の前記識別された構成要素パーツのうちの1つを選択するステップと、
構成要素のハッシュ値を生成するために、前記識別された構成要素パーツのうちの前記選択された1つにハッシュアルゴリズムを適用するステップと、
一致があるかどうかを決定するために、前記構成要素のハッシュ値を参照ハッシュ値と比較するステップであって、参照関数のバイナリイメージの構成要素パーツに前記ハッシュアルゴリズムを適用することによって、前記参照ハッシュ値が生成されたステップと
を含むステップを実行するためのソフトウェア命令で構成される
コンピュータ。
【請求項３９】
前記プロセッサが、複数の参照ハッシュ値のうちの任意の1つとの一致があるかどうかを決定するために、前記構成要素のハッシュ値を前記複数の参照ハッシュ値のそれぞれと比較するステップであって、複数の参照バイナリイメージの各構成要素パーツに前記ハッシュアルゴリズムを適用することによって、前記複数の参照ハッシュ値が生成されたステップを、前記構成要素のハッシュ値を参照ハッシュ値と比較する前記ステップが含むようなソフトウェア命令で構成される請求項38に記載のコンピュータ。
【請求項４０】
前記プロセッサが、前記正規化されたバイナリイメージ内の分岐アドレスを正規化するステップをさらに含むステップを実行するためのソフトウェア命令で構成される請求項38に記載のコンピュータ。
【請求項４１】
前記プロセッサが、前記識別された関数の前記選択された1つの中の前記識別された構成要素パーツのうちの1つを選択する前記ステップと、構成要素のハッシュ値を生成するために、前記識別された構成要素パーツのうちの前記選択された1つに前記ハッシュアルゴリズムを適用する前記ステップと、前記構成要素のハッシュ値を参照ハッシュ値と比較する前記ステップとが、前記識別された関数の前記選択された1つの前記構成要素パーツのそれぞれについての各構成要素のハッシュ値が前記参照ハッシュ値と比較されるまで繰り返されるようなソフトウェア命令で構成される請求項38に記載のコンピュータ。
【請求項４２】
前記プロセッサが、前記正規化されたバイナリイメージ内の前記識別された関数のそれぞれの前記構成要素パーツのそれぞれについて、すべての構成要素のハッシュ値が前記参照ハッシュ値と比較されるまで、前記正規化されたバイナリイメージ内の前記識別された関数のうちの1つを選択する前記ステップが繰り返されるようなソフトウェア命令で構成される請求項41に記載のコンピュータ。
【請求項４３】
前記プロセッサが、複数の参照ハッシュ値のうちの任意の1つとの一致があるかどうかを決定するために、前記構成要素のハッシュ値を前記複数の参照ハッシュ値のそれぞれと比較するステップであって、複数の参照バイナリイメージの各構成要素パーツに前記ハッシュアルゴリズムを適用することによって、前記複数の参照ハッシュ値が生成されたステップを、前記構成要素のハッシュ値を参照ハッシュ値と比較する前記ステップが含むようなソフトウェア命令で構成される請求項42に記載のコンピュータ。
【請求項４４】
前記プロセッサが、1つまたは複数の参照ハッシュ値に一致するいくつかの構成要素のハッシュ値を識別する出力を提供するステップをさらに含むステップを実行するためのソフトウェア命令で構成される請求項43に記載のコンピュータ。
【請求項４５】
前記プロセッサが、前記出力が参照関数内の構成要素パーツに一致する構成要素パーツの割合であるようなステップを実行するためのソフトウェア命令で構成される請求項44に記載のコンピュータ。
【請求項４６】
前記プロセッサが、選択された関数内の一致した構成要素パーツの順序を参照関数内の一致した構成要素パーツの順序と比較する出力を提供するステップをさらに含むステップを実行するためのソフトウェア命令で構成される請求項38に記載のコンピュータ。
【請求項４７】
正規化されたバイナリイメージを生成するために、ソフトウェアのバイナリイメージ内のメモリレジスタおよびメモリアドレスの参照を正規化するための手段と、
前記正規化されたバイナリイメージ内の関数を識別するための手段と、
一致があるかどうかを決定するために、前記正規化されたバイナリイメージ内の識別された各関数を参照バイナリイメージと比較するための手段と
を含むコンピュータ。
【請求項４８】
比較するための手段が、複数の参照バイナリイメージのうちの任意の1つとの一致があるかどうかを決定するために、前記正規化されたバイナリイメージ内の識別された各関数を前記複数の参照バイナリイメージのそれぞれと比較するための手段を含む請求項47に記載のコンピュータ。
【請求項４９】
比較するための手段が、
前記正規化されたバイナリイメージ内の前記識別された関数のうちの1つを選択するための手段と、
一致があるかどうかを決定するために、前記識別された関数のうちの前記選択された1つにおけるビットパターンを前記参照バイナリイメージ内のビットパターンと比較することによって、前記識別された関数のうちの前記選択された1つを前記参照バイナリイメージと比較するための手段と
を含む請求項47に記載のコンピュータ。
【請求項５０】
前記正規化されたバイナリイメージ内の前記識別された関数のうちの次の1つを選択するための手段と、
一致があるかどうかを決定するために、前記識別された関数のうちの前記選択された次の1つにおけるビットパターンを前記参照バイナリイメージ内のビットパターンと比較することによって、前記識別された関数のうちの前記選択された次の1つを前記参照バイナリイメージと比較するための手段と
をさらに含む請求項49に記載のコンピュータ。
【請求項５１】
比較するための手段が、
前記正規化されたバイナリイメージ内の前記識別された関数のうちの1つを選択するための手段と、
第1のハッシュ値を生成するために、前記識別された関数のうちの前記選択された1つにハッシュアルゴリズムを適用するための手段と、
一致があるかどうかを決定するために、前記第1のハッシュ値を第1の参照ハッシュ値と比較するための手段であって、前記参照バイナリイメージに前記ハッシュアルゴリズムを適用することによって、前記第1の参照ハッシュ値が生成された、手段と
を含む請求項47に記載のコンピュータ。
【請求項５２】
前記正規化されたバイナリイメージ内の前記識別された関数のうちの次の1つを選択するための手段と、
第2のハッシュ値を生成するために、前記識別された関数のうちの前記選択された次の1つに前記ハッシュアルゴリズムを適用するための手段と、
一致があるかどうかを決定するために、前記第2のハッシュ値を前記第1の参照ハッシュ値と比較するための手段と
をさらに含む請求項51に記載のコンピュータ。
【請求項５３】
前記第1のハッシュ値を参照ハッシュ値と比較するための手段が、複数の参照ハッシュ値のうちの任意の1つとの一致があるかどうかを決定するために、前記第1のハッシュ値を前記複数の参照ハッシュ値のそれぞれと比較するための手段であって、複数の参照バイナリイメージのそれぞれに前記ハッシュアルゴリズムを適用することによって前記複数のハッシュ値が生成された、手段を含む請求項51に記載のコンピュータ。
【請求項５４】
前記識別された関数のうちの少なくとも1つの中の構成要素パーツを識別するための手段と、
前記識別された構成要素パーツのうちの第1のものを選択するための手段と、
構成要素のハッシュ値を生成するために、前記識別された構成要素パーツのうちの前記選択された第1のものにハッシュアルゴリズムを適用するための手段と、
一致があるかどうかを決定するために、前記構成要素のハッシュ値を参照のハッシュ値と比較するための手段であって、前記参照バイナリイメージの構成要素パーツに前記ハッシュアルゴリズムを適用することによって、前記参照の構成要素のハッシュ値が生成された、手段と
をさらに含む請求項47に記載のコンピュータ。
【請求項５５】
前記識別された関数のうちの少なくとも1つの中の構成要素パーツを識別するための手段と、
前記識別された構成要素パーツのうちの第1のものを選択するための手段と、
構成要素のハッシュ値を生成するために、前記識別された構成要素パーツのうちの前記選択された第1のものに前記ハッシュアルゴリズムを適用するための手段と、
一致があるかどうかを決定するために、前記構成要素のハッシュ値を第2の参照のハッシュ値と比較するための手段であって、前記参照バイナリイメージの構成要素パーツに前記ハッシュアルゴリズムを適用することによって、前記参照の構成要素のハッシュ値が生成された、手段と
をさらに含む請求項51に記載のコンピュータ。
【請求項５６】
前記正規化されたバイナリイメージ内の分岐アドレスを正規化するための手段をさらに含む請求項47に記載のコンピュータ。
【請求項５７】
正規化されたバイナリイメージを生成するために、ソフトウェアのバイナリイメージ内のメモリレジスタおよびメモリアドレスの参照を正規化するための手段と、
前記正規化されたバイナリイメージ内の関数を識別するための手段と、
前記識別された関数のそれぞれの中の構成要素パーツを識別するための手段と、
前記正規化されたバイナリイメージ内の前記識別された関数のうちの1つを選択するための手段と、
前記識別された関数の前記選択された1つの中の前記識別された構成要素パーツのうちの1つを選択するための手段と、
構成要素のハッシュ値を生成するために、前記識別された構成要素パーツのうちの前記選択された1つに前記ハッシュアルゴリズムを適用するための手段と、
一致があるかどうかを決定するために、前記構成要素のハッシュ値を参照ハッシュ値と比較するための手段であって、参照関数のバイナリイメージの構成要素パーツに前記ハッシュアルゴリズムを適用することによって、前記参照ハッシュ値が生成された、手段と
を含むコンピュータ。
【請求項５８】
前記生成されたハッシュ値を参照ハッシュ値と比較するための前記手段が、複数の参照ハッシュ値のうちの任意の1つとの一致があるかどうかを決定するために、前記構成要素のハッシュ値を前記複数の参照ハッシュ値のそれぞれと比較するための手段であって、複数の参照バイナリイメージの各構成要素パーツに前記ハッシュアルゴリズムを適用することによって、前記複数の参照ハッシュ値が生成された、手段を含む請求項57に記載のコンピュータ。
【請求項５９】
前記正規化されたバイナリイメージ内の分岐アドレスを正規化するための手段をさらに含む請求項57に記載のコンピュータ。
【請求項６０】
前記識別された関数の前記選択された1つの中の前記識別された構成要素パーツのうちの1つを選択するための前記手段と、構成要素のハッシュ値を生成するために、前記識別された構成要素パーツのうちの前記選択された1つに前記ハッシュアルゴリズムを適用するための手段と、前記構成要素のハッシュ値を参照ハッシュ値と比較するための手段とを、前記識別された関数の前記選択された1つの前記構成要素パーツのそれぞれについての各構成要素のハッシュ値が前記参照ハッシュ値と比較されるまで繰り返し実施するための手段をさらに含む請求項57に記載のコンピュータ。
【請求項６１】
前記正規化されたバイナリイメージ内の前記識別された関数のうちの1つを選択するための手段を、前記正規化されたバイナリイメージ内の前記識別された関数のそれぞれの前記構成要素パーツのそれぞれについて、すべての構成要素のハッシュ値が前記参照ハッシュ値と比較されるまで繰り返し実施するための手段をさらに含む請求項60に記載のコンピュータ。
【請求項６２】
前記構成要素のハッシュ値を参照ハッシュ値と比較するための前記手段が、複数の参照ハッシュ値のうちの任意の1つとの一致があるかどうかを決定するために、前記構成要素のハッシュ値を前記複数の参照ハッシュ値のそれぞれと比較するための手段であって、複数の参照バイナリイメージの各構成要素パーツに前記ハッシュアルゴリズムを適用することによって、前記複数の参照ハッシュ値が生成された、手段を含む請求項61に記載のコンピュータ。
【請求項６３】
1つまたは複数の参照ハッシュ値に一致するいくつかの構成要素のハッシュ値を識別する出力を提供するステップを含むための手段をさらに含む請求項62に記載のコンピュータ。
【請求項６４】
参照関数内の構成要素パーツに一致する構成要素パーツの割合を出力するための手段をさらに含む請求項63に記載のコンピュータ。
【請求項６５】
選択された関数内の一致した構成要素パーツの順序を参照関数内の一致した構成要素パーツの順序と比較する出力を提供するための手段をさらに含む請求項57に記載のコンピュータ。
【請求項６６】
正規化されたバイナリイメージを生成するために、ソフトウェアのバイナリイメージ内のメモリレジスタおよびメモリアドレスの参照を正規化するステップと、
前記正規化されたバイナリイメージ内の関数を識別するステップと、
一致があるかどうかを決定するために、前記正規化されたバイナリイメージ内の識別された各関数を参照バイナリイメージと比較するステップと
を含むステップをコンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する有形の記憶媒体。
【請求項６７】
複数の参照バイナリイメージのうちの任意の1つとの一致があるかどうかを決定するために、前記正規化されたバイナリイメージ内の識別された各関数を前記複数の参照バイナリイメージのそれぞれと比較するステップを、前記比較するステップが含むようなステップをコンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する請求項66に記載の有形の記憶媒体。
【請求項６８】
前記正規化されたバイナリイメージ内の前記識別された関数のうちの1つを選択するステップと、
一致があるかどうかを決定するために、前記識別された関数のうちの前記選択された1つにおけるビットパターンを前記参照バイナリイメージ内のビットパターンと比較することによって、前記識別された関数のうちの前記選択された1つを前記参照バイナリイメージと比較するステップと
を、前記比較するステップが含むようなステップをコンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する請求項66に記載の有形の記憶媒体。
【請求項６９】
前記正規化されたバイナリイメージ内の前記識別された関数のうちの次の1つを選択するステップと、
一致があるかどうかを決定するために、前記識別された関数のうちの前記選択された次の1つにおけるビットパターンを前記参照バイナリイメージ内のビットパターンと比較することによって、前記識別された関数のうちの前記選択された次の1つを前記参照バイナリイメージと比較するステップと
をさらに含むステップを、コンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する請求項66に記載の有形の記憶媒体。
【請求項７０】
前記正規化されたバイナリイメージ内の前記識別された関数のうちの1つを選択するステップと、
第1のハッシュ値を生成するために、前記識別された関数のうちの前記選択された1つにハッシュアルゴリズムを適用するステップと、
一致があるかどうかを決定するために、前記第1のハッシュ値を第1の参照ハッシュ値と比較するステップであって、前記参照バイナリイメージに前記ハッシュアルゴリズムを適用することによって、前記第1の参照ハッシュ値が生成されたステップと
を、前記比較するステップが含むようなステップをコンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する請求項66に記載の有形の記憶媒体。
【請求項７１】
前記正規化されたバイナリイメージ内の前記識別された関数のうちの次の1つを選択するステップと、
第2のハッシュ値を生成するために、前記識別された関数のうちの前記選択された次の1つに前記ハッシュアルゴリズムを適用するステップと、
一致があるかどうかを決定するために、前記第2のハッシュ値を前記第1の参照ハッシュ値と比較するステップと
をさらに含むステップを、コンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する請求項70に記載の有形の記憶媒体。
【請求項７２】
複数の参照ハッシュ値のうちの任意の1つとの一致があるかどうかを決定するために、前記第1のハッシュ値を前記複数の参照ハッシュ値のそれぞれと比較するステップであって、複数の参照バイナリイメージのそれぞれに前記ハッシュアルゴリズムを適用することによって前記複数のハッシュ値が生成されたステップを、前記第1のハッシュ値を参照ハッシュ値と比較する前記ステップが含むようなステップをコンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する請求項70に記載の有形の記憶媒体。
【請求項７３】
前記識別された関数のうちの少なくとも1つの中の構成要素パーツを識別するステップと、
前記識別された構成要素パーツのうちの第1のものを選択するステップと、
構成要素のハッシュ値を生成するために、前記識別された構成要素パーツのうちの前記選択された第1のものにハッシュアルゴリズムを適用するステップと、
一致があるかどうかを決定するために、前記構成要素のハッシュ値を参照のハッシュ値と比較するステップであって、前記参照バイナリイメージの構成要素パーツに前記ハッシュアルゴリズムを適用することによって、前記参照の構成要素のハッシュ値が生成されたステップと
をさらに含むステップを、コンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する請求項66に記載の有形の記憶媒体。
【請求項７４】
前記識別された関数のうちの少なくとも1つの中の構成要素パーツを識別するステップと、
前記識別された構成要素パーツのうちの第1のものを選択するステップと、
構成要素のハッシュ値を生成するために、前記識別された構成要素パーツのうちの前記選択された第1のものに前記ハッシュアルゴリズムを適用するステップと、
一致があるかどうかを決定するために、前記構成要素のハッシュ値を第2の参照のハッシュ値と比較するステップであって、前記参照バイナリイメージの構成要素パーツに前記ハッシュアルゴリズムを適用することによって、前記参照の構成要素のハッシュ値が生成されたステップと
をさらに含むステップを、コンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する請求項70に記載の有形の記憶媒体。
【請求項７５】
前記正規化されたバイナリイメージ内の分岐アドレスを正規化するステップをさらに含むステップをコンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する請求項66に記載の有形の記憶媒体。
【請求項７６】
以下を含むステップをコンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する有形の記憶媒体であって、
プロセッサと、
前記プロセッサに結合されたメモリと
を含み、前記プロセッサが
正規化されたバイナリイメージを生成するために、前記ソフトウェアのバイナリイメージ内のメモリレジスタおよびメモリアドレスの参照を正規化するステップと、
前記正規化されたバイナリイメージ内の関数を識別するステップと、
前記識別された関数のそれぞれの中の構成要素パーツを識別するステップと、
前記正規化されたバイナリイメージ内の前記識別された関数のうちの1つを選択するステップと、
前記識別された関数の前記選択された1つの中の前記識別された構成要素パーツのうちの1つを選択するステップと、
構成要素のハッシュ値を生成するために、前記識別された構成要素パーツのうちの前記選択された1つに前記ハッシュアルゴリズムを適用するステップと、
一致があるかどうかを決定するために、前記構成要素のハッシュ値を参照ハッシュ値と比較するステップであって、参照関数のバイナリイメージの構成要素パーツに前記ハッシュアルゴリズムを適用することによって、前記参照ハッシュ値が生成されたステップと
を含むステップを実行するためのソフトウェア命令で構成された
有形の記憶媒体。
【請求項７７】
複数の参照ハッシュ値のうちの任意の1つとの一致があるかどうかを決定するために、前記構成要素のハッシュ値を前記複数の参照ハッシュ値のそれぞれと比較するステップであって、複数の参照バイナリイメージの各構成要素パーツに前記ハッシュアルゴリズムを適用することによって前記複数の参照ハッシュ値が生成されたステップを、前記構成要素のハッシュ値を参照ハッシュ値と比較する前記ステップが含むようなステップをコンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する請求項76に記載の有形の記憶媒体。
【請求項７８】
前記正規化されたバイナリイメージ内の分岐アドレスを正規化するステップをさらに含むステップを、コンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する請求項76に記載の有形の記憶媒体。
【請求項７９】
前記識別された関数の前記選択された1つの中の前記識別された構成要素パーツのうちの1つを選択する前記ステップと、構成要素のハッシュ値を生成するために、前記識別された構成要素パーツのうちの前記選択された1つに前記ハッシュアルゴリズムを適用する前記ステップと、前記構成要素のハッシュ値を参照ハッシュ値と比較する前記ステップとが、前記識別された関数の前記選択された1つの前記構成要素パーツのそれぞれについての各構成要素のハッシュ値が前記参照ハッシュ値と比較されるまで繰り返されるようなステップをコンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する請求項76に記載の有形の記憶媒体。
【請求項８０】
前記正規化されたバイナリイメージ内の前記識別された関数のうちの1つを選択する前記ステップが、前記正規化されたバイナリイメージ内の前記識別された関数のそれぞれの前記構成要素パーツのそれぞれについて、すべての構成要素のハッシュ値が前記参照ハッシュ値と比較されるまで繰り返されるようなステップをコンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する請求項79に記載の有形の記憶媒体。
【請求項８１】
複数の参照ハッシュ値のうちの任意の1つとの一致があるかどうかを決定するために、前記構成要素のハッシュ値を前記複数の参照ハッシュ値のそれぞれと比較するステップであって、一致があるかどうかを決定するために、複数の参照バイナリイメージの各構成要素パーツに前記ハッシュアルゴリズムを適用することによって前記複数の参照ハッシュ値が生成されたステップを、前記構成要素のハッシュ値を参照ハッシュ値と比較する前記ステップが含むようなステップをコンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する請求項80に記載の有形の記憶媒体。
【請求項８２】
1つまたは複数の参照ハッシュ値に一致するいくつかの構成要素のハッシュ値を識別する出力を提供するステップをさらに含むステップを、コンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する請求項81に記載の有形の記憶媒体。
【請求項８３】
前記出力が参照関数内の構成要素パーツに一致する構成要素パーツの割合であるようなステップをコンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する請求項82に記載の有形の記憶媒体。
【請求項８４】
選択された関数内の一致した構成要素パーツの順序を参照関数内の一致した構成要素パーツの順序と比較する出力を提供するステップをさらに含むステップを、コンピュータのプロセッサに実行させるように構成されたプロセッサ実行可能ソフトウェア命令を格納する請求項76に記載の有形の記憶媒体。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は一般にコンピュータシステムに関し、より詳細には、特定の関数、アルゴリズム、またはモジュールを認識するために実行可能ソフトウェアを分析するための方法および装置に関する。
【背景技術】
【０００２】
コンピュータおよびモバイルデバイスは、命令のシーケンスによりプロセッサに命令するソフトウェアで構成される。ソフトウェアは通常、人が読むことができるコンピュータプログラミング言語であるソースコードで書かれている。プロセッサが命令のシーケンスを理解し、実行するために、ソースコードを、プロセッサ実行可能形式で命令を符号化する1およびOのシーケンスである実行可能なバイナリコードにコンパイルしなければならない。ソースコードを完成した実行可能な形式にコンパイルするプロセスは、時として「ビルド」と呼ばれ、アセンブリされた実行可能ソフトウェアは、時としてバイナリイメージと呼ばれる。
【０００３】
コンピュータおよびモバイルデバイスのアプリケーションの複雑さが増すにつれて、ソフトウェア開発者にとって、何のソースコードが実行可能なバイナリイメージにコンパイルされているかを決定できるツールの必要性が高まっている。こうしたツールを、バグフィックスがビルドに含まれていることを保証する、またはジェネラルパブリックライセンス(general public license:GPL)コードがビルドに含まれていないことを保証するなどの内部分析に使用することができる。リリースされたソフトウェアイメージにエラーがないことを確実にするための従来の方法は、所与の実行可能なバイナリイメージを生成するために使用されるソースコードを追跡し、または分析することに依存する。しかし、こうした従来の方法は、実行可能なバイナリイメージを直接分析することができず、したがって、バイナリイメージの中にあるものを正確に反映しない場合があり、ソースコードを利用できない実行可能ソフトウェアを分析する価値はあまりない。
【発明の概要】
【課題を解決するための手段】
【０００４】
様々な実施形態の方法およびシステムは、特定の関数、関数の部分、アルゴリズム、および演算ブロックを認識するために、実行可能ソフトウェアのバイナリソフトウェアのバイナリイメージを分析する。ソフトウェアのバイナリイメージ内のメモリレジスタおよびメモリアドレスの参照が正規化される。バイナリイメージ内の関数が識別される。一致があるかどうかを決定するために、バイナリイメージ内の識別された各関数を、既知のまたは参照関数の1つまたは複数の参照バイナリイメージと比較する。参照関数のバイナリイメージは、複数の関数のバイナリイメージを含む参照データベースに格納され得る。関数と参照関数との比較は、ビットパターンを比較することによって、または関数にハッシュ関数を適用することによって生成されるハッシュ値と参照関数とを比較することによって達成することができる。一実施形態において、分析中のバイナリイメージ内の関数内の構成要素パーツが識別され、参照関数内または参照関数の構成要素パーツのバイナリイメージのデータベース内における関数の構成要素パーツのバイナリイメージと比較される。構成要素パーツと参照の構成要素パーツとの比較は、それぞれのバイナリコードにおけるビットパターンを比較することによって、または構成要素パーツのそれぞれにハッシュ関数を適用することによって生成されるハッシュ値と参照構成要素パーツとを比較することによって達成することができる。比較の結果は、ソフトウェアのバイナリイメージが1つまたは複数の参照関数および/または関数の構成要素パーツに一致する度合いを決定するために使用され得る。
【０００５】
本明細書に組み込まれ、本明細書の一部を構成する添付の図面は、本発明の実施形態例を示し、上記の概要および以下の詳細な説明と共に、本発明の特徴を説明するのに役立つ。
【図面の簡単な説明】
【０００６】
【図１】ソフトウェアのバイナリイメージを分析するための第1の実施形態の方法を示すプロセスフロー図である。
【図２】ソフトウェアのバイナリイメージを分析するための代替の実施形態の方法を示すプロセスフロー図である。
【図３】図1に示した実施形態の方法の詳細な部分を示すプロセスフロー図である。
【図４】図1に示した実施形態の方法の別の詳細な部分を示すプロセスフロー図である。
【図５】図4に示した代替の詳細な部分を示すプロセスフロー図である。
【図６】ソフトウェアのバイナリイメージを分析するための代替の実施形態の方法を示すプロセスフロー図である。
【図７】ソフトウェアのバイナリイメージを分析するための代替の実施形態の方法を示すプロセスフロー図である。
【図８】ソフトウェアのバイナリイメージを分析するための代替の実施形態の方法を示すプロセスフロー図である。
【図９】一実施形態による参照関数のバイナリイメージデータベースを生成するための方法を示すプロセスフロー図である。
【図１０】一実施形態による参照関数および演算ブロックバイナリイメージハッシュデータベースを生成するための方法を示すプロセスフロー図である。
【図１１】様々な実施形態での使用に適したコンピュータシステムを示す構成要素図である。
【発明を実施するための形態】
【０００７】
様々な実施形態について、添付の図面を参照して詳しく説明する。可能な場合、同一の参照番号は、図面を通して同一または類似の部分を指すために使用される。特定の例および実装形態に対する言及は、例示の目的であり、発明または特許請求の範囲を限定するためのものではない。
【０００８】
この説明では、「例示」という用語は、本明細書では、「例、事例、または実例の役割を果たす」ことを意味する。「例示」として本明細書に記載した任意の実装形態は、必ずしも他の実装形態よりも好ましいまたは有利なものと解釈されないものとする。
【０００９】
本明細書で使用する際、「コンピュータ」および「コンピュータシステム」という用語は、存在し得る、または将来開発されるであろう任意の形のプログラム可能なコンピュータを含むことを意図しており、例えば、パーソナルコンピュータ、ラップトップコンピュータ、モバイルコンピューティングデバイス(例えば、携帯電話、パーソナルデータアシスタント(PDA)、パームトップコンピュータ、無線データカード、および多機能モバイルデバイス)、メインフレームコンピュータ、サーバ、および統合されたコンピューティングシステムを含む。コンピュータは通常、メモリ回路に結合されたソフトウェアプログラム可能プロセッサを含み、しかし図11を参照して以下で説明する構成要素をさらに含んでいてもよい。
【００１０】
本明細書で使用する際、「ソフトウェアのバイナリイメージ」、「バイナリイメージ」、「バイナリコード」、および「コード」という用語は、バイナリ形式の、すなわち「1」および「0」のシーケンスとして実行可能な(すなわちコンパイルされた)ソフトウェアを指す。本明細書で使用する際、「コードブロック」、「コードのブロック」、および「ブロック」という用語は、シーケンス内のいくつかのビットまたはバイトなど、バイナリイメージの特定の一部を指す。本明細書で使用する際、「関数」という用語は、プロセッサによって実行されると、何らかの所望の結果を達成するソフトウェア命令のシーケンスを指す。一部の関数は、1つまたは複数の他の関数を含み得る。本明細書で使用する際、「構成要素パーツ」という用語は、関数全体よりも小さい関数の一部分を指す。本明細書で使用する際、「モジュール」という用語は、別々に開発され、テストされるアプリケーションプログラムの一部を指し、通常、あるアプリケーションのために実行可能なバイナリイメージを生成するビルド内の他のモジュールと(コンパイル前または後に)結合される。
【００１１】
本明細書で使用する際、「ハッシュアルゴリズム」という用語は、任意のデータ量が与えられると、(何らかの確率的信頼を持って)使用することができる一定のサイズの数値を計算して、正確なバージョンの入力データを識別する任意の形の計算アルゴリズムを包含することが意図される。ハッシュアルゴリズムは、暗号的に安全である必要はない(すなわち計算すると同様に低減した数になるような別の入力を決定することは困難)が、それが使用される状況で、こうした要件が要求される場合がある。本明細書で使用する際、「ハッシュ」および「ハッシュ値」という用語は、ハッシュアルゴリズムの出力を指すものとする。
【００１２】
どのソースコードが実行可能なバイナリイメージにコンパイルされているかを理解する必要性が高まっている。この必要性は、ビルドが特定のバグフィックスを含むこと、または任意のジェネラルパブリックライセンス(GPL)コードを含まないことを保証するなど、内部分析によって駆動することができる。複雑なコンピュータソフトウェアの開発で遭遇するよくある問題は、特定のソフトウェアのビルドが既知のバグまたは問題を含む実行可能コードの一部を含むかどうかを決定することである。複雑なソフトウェアのビルド、特に多くの異なる開発グループおよび実装を伴うソフトウェアでは、たとえ個々のソフトウェア構成要素モジュールが完全にテストされているとしても、ソフトウェアのバグが誤ってもたらされる可能性がある。構成要素のソフトウェアモジュールをテストし、ソースコードの系統を追跡する現在の方法は、最終的なイメージを組み立てるときの人的なプロセスエラーに対して脆弱であり、したがって、実行可能なバイナリイメージのリリースが完璧であることを確実にするための最適な方法ではない。多くの場合、複雑なソフトウェアアプリケーションに入っているバグは知られているが、総合的なアセンブリや構築プロセスのある時点で、問題を知らない個人によって不注意にコピーされてしまう、小さいアルゴリズム、モジュールまたは関数の中に常駐している。欠陥のあるアルゴリズム、モジュール、または関数は、正しいコードとほとんど区別できない可能性があり、したがって、簡単な比較技術を使用しても容易には認識されない。さらに、バグは、ほとんどのモジュールがコンパイルされた後にもたらされるコードに存在していてもよく、したがって、ソースコードの分析では特定できない。メモリ使用量、レジスタの割り当て、および変数名の変動は、コンパイルされたコードのバイナリイメージを変更するので、直接バイナリ比較技術を使用しても問題のあるコードを突き止めることはできない。
【００１３】
この問題を解決し、ソースコードを調査し、ソースコードの系統を追跡する従来の方法の欠点を克服するために、様々な実施形態では、ソフトウェアのバイナリイメージを直接分析するための方法を提供する。これらの方法は、分析中のバイナリイメージ内に含まれる特定の参照関数、関数の構成要素、アルゴリズムおよび演算ブロックを認識することができる。こうした方法を使用して、ソフトウェアのバイナリイメージを迅速にスキャンして、ソースコードの分析に頼ることなく、任意の既知の問題のあるコード要素が含まれているかどうかを決定することができる。さらに、こうした方法によって、任意のソフトウェアのバイナリイメージをスキャンして、任意の既知のソフトウェアルーチンまたはモジュールが含まれている可能性があるかどうかを決定することができる。例えば、こうした方法を使用して、任意の会社のソフトウェアが実行可能なバイナリイメージとしてのみ使用可能なソフトウェアにコピーされているかどうかを決定することができる。
【００１４】
所与のソフトウェアのバイナリイメージ内のソースコードの系統を識別するための2つの基本的な実施形態の方法が本明細書に記載されている。第1の実施形態の方法は、コードの完全一致を識別するために適用される。すなわち、既知の関数がソフトウェアのバイナリイメージに含まれている場合、一致が検出される。第2の実施形態の方法は、コードの一致の可能性を検出するために適用される。すなわち、関数が既知の実装の一部を含む場合、既知の実装の割合を検出し、報告することができる。
【００１５】
完全一致の実施形態の方法では、各ソフトウェア関数は、分析中のバイナリイメージ内で識別される。識別された関数の開始命令および終了命令がバイナリイメージに記録され、またはタグ付けされ、または各関数を含むバイナリコードのブロックが一時データベースにコピーされてもよい。識別された各関数によって、そのレジスタの割り当て、およびメモリの割り当てが、参照関数のバイナリイメージのデータベースにおいてメモリのアドレスおよびレジスタが割り当てられる方法と一致するように調整(「正規化」)される。次いで、識別され、正規化された各関数のバイナリコードは、何らかの一致があるかどうかを決定するために、参照関数の1つまたは複数のバイナリイメージと比較される。この比較は、ビット単位またはバイト単位でビットパターン認識技術を使用して達成することができる。あるいは、最適化として、ハッシュアルゴリズムを、分析中の各関数に対応するバイナリコードに適用して、データベースにおける参照関数のバイナリイメージのそれぞれについて生成されたハッシュ値と演算で比較することができるハッシュ値を生成することができる。ハッシュ値間の一致が検出され、一致を識別し、記録することができる。このように、バイナリイメージ内の各関数を、参照関数のライブラリとの一致についてバイナリイメージをスキャンするために、データベースに格納されている複数の参照関数のバイナリイメージのそれぞれと個々に比較する。
【００１６】
一致の可能性(likely match)の実施形態の方法は、比較を関数の構成要素パーツのレベルで達成できることを除いて、完全一致の実施形態の方法に似ている。参照データベース内の各参照関数のバイナリイメージを、その構成要素パーツに分割することができ、構成要素パーツのバイナリイメージは、関数および関数の構成要素パーツのバイナリイメージの参照データベースに格納されている。オプションで、参照データベース内の関数のバイナリイメージおよび関数の構成要素パーツのバイナリイメージごとにハッシュを生成することができ、結果として得られたハッシュ値が参照ハッシュデータベースに格納される。分析中のソフトウェアのバイナリイメージは、レジスタおよびメモリアドレスの参照を正規化するために前処理され、次いで関数および関数の構成要素パーツに分割され、これらは、一時データベースにおいて記録され、タグ付けされ、または格納され得る。次いで構成要素パーツのそれぞれが、ビット単位またはバイト単位の方法で、コンパイルされた関数の構成要素パーツの参照データベースに格納されている関数の構成要素パーツと比較され得る。オプションで、ハッシュ関数を各構成要素パーツのバイナリイメージに適用して、ハッシュ値を生成することができる。各構成要素パーツのハッシュ値は、参照ハッシュデータベースと比較することができ、一致が識別される。データベースと一致した各関数および構成要素パーツのテーブルまたは同様のリストを生成することができる。分析中のバイナリイメージ内の関数が、参照データベース内の参照関数と同じまたはほぼ同じである可能性は、参照ハッシュデータベースにおいて反映される参照関数の構成要素パーツと一致するソフトウェアのバイナリイメージにおける構成要素パーツの割合に基づいて推測され得る。分析中のバイナリイメージ内の任意の所与の関数は、1つまたは複数の参照関数からの構成要素パーツについて一致がある可能性がある。バイナリイメージ内の関数内のかなりの割合の構成要素パーツが参照データベース内の構成要素パーツのバイナリイメージに一致する場合、これは、関数または関数の一部がコピーされている可能性があることを示し得る。次いで一致の可能性は、参照関数データベース内で一致した参照関数のバイナリイメージに対して分析中のバイナリイメージの一致する部分のより詳細な分析を行うことによって確認することができる。こうしたより詳細なその後の分析には、バイナリイメージのビット対ビット分析(bit for bit analysis)、または対応するソースコードの行単位のレビュー(line by line review)などがある。
【００１７】
バイナリコードの特定の大きいブロックが他のものと同じかどうかを確認するために使用される1つの方法は、各バイナリコードブロックに巡回冗長検査(CRC)アルゴリズムまたはMD5暗号技術的ハッシュアルゴリズムなどのハッシュアルゴリズムを適用してある数値(すなわちハッシュ値)を生成し、次いで2つのハッシュ値を比較することである。こうした方法を使用して、そのハッシュ値を、認証機関から提供されたハッシュ値と比較することによって、特定のソフトウェアのバイナリイメージを認証することができる。認証機関は、特定のソフトウェアのバイナリイメージにエラーやマルウェアがないことをテストし、確認すると、秘密暗号鍵を使用して、そのソフトウェアのバイナリイメージの暗号技術的ハッシュを生成することができる。いくつかの実装形態では、認証機関は、受信者がデジタル署名を復号できるようにする秘密暗号鍵を使用して、認証機関が暗号技術的ハッシュを生成したことを確認することもできる。次いで、ソフトウェアのバイナリイメージにおいて類似の暗号技術的ハッシュアルゴリズムを実行し、結果をソフトウェアに関連付けられているハッシュ値と比較することによって、コンピュータがソフトウェアのバイナリイメージバージョンを確認できるように、ハッシュ値がリリースされたソフトウェアパッケージに含められる。こうした方法は、コンピュータ技術では周知である。しかし、この従来のハッシュ比較方法は、2つのバイナリイメージが同一であるかどうかを決定するだけである。イメージのうちの1つの中に深く埋もれた2つのバイナリイメージの間のわずかな違いでさえ、異なるように生成されたハッシュ値となる。したがって、ソフトウェアのバイナリイメージを検証する従来のハッシュ比較方法は、含まれている関数および関数の構成要素パーツに関する任意の情報を決定することはできない。
【００１８】
図1は、完全一致の実施形態の方法で実施され得るステップ例を示すプロセスフロー図である。上述したように、本実施形態の方法は、関数のバイナリイメージの参照データベースに格納され得る1つまたは複数の既知の参照関数に対する、分析中のソフトウェアのバイナリイメージ内での関数の完全一致を識別しようとする。ステップ10で、実行可能ソフトウェアのバイナリイメージが、実施形態の方法を実行するためのソフトウェアで構成されるコンピュータによって受信され得る。ソフトウェアのバイナリイメージは、例えば、コンパクトディスク(CD)、デジタルビデオ/多用途ディスク(DVD)などの有形の記憶媒体上に、ディスクドライブまたはUSBメモリユニットなどの内部または外部メモリから、またはネットワーク接続を介してネットワークからなどを含めて、様々な形で受信され得る。いったん受信されると、ソフトウェアのバイナリイメージは、分析の準備のために前処理され得る。この前処理は、バイナリイメージ内のレジスタおよびメモリアドレスの参照を正規化して、正規化されたバイナリイメージを生成するステップ、すなわちステップ12と、バイナリイメージ内で関数の境界を識別するステップ、すなわちステップ14とを含む。図1は、バイナリイメージ内で関数の境界を識別するステップ、すなわちステップ14の前に、レジスタおよびメモリアドレスを正規化するステップ、すなわちステップ12を示すが、これらのステップは逆の順(すなわちステップ12の前にステップ14)でまたは同じ前処理のステップで実行することもできるため、この順序は、例示の目的にすぎない。
【００１９】
ステップ12のレジスタおよびメモリアドレスを正規化するプロセスステップでは、分析中のソフトウェアのバイナリイメージは、メモリレジスタおよびメモリアドレスへの参照を識別するためにスキャンされ、識別されたレジスタおよびアドレスは、すべてゼロなど、正規化された値に変更される。正規化された値は、以下にさらに説明される、参照関数データベース22に格納された参照関数についてのメモリレジスタおよびアドレスに割り当てられた同じ値である。レジスタおよびメモリのアドレスのこの正規化は、ソフトウェアのバイナリイメージの分析が、レジスタおよびメモリアドレスの割り当てによって惑わされることなく、関数および命令のパターンを認識できることを確実にするために行われる。通常、コンパイルされたソフトウェアの異なるブロックについてのレジスタおよびメモリアドレスの割り当ては、特定の関数を取り巻くソフトウェアの他の部分に含まれるメモリの割り当てに依存する。このような可変性がレジスタおよびメモリアドレスの割り当てにあることは、異なるソフトウェアのビルドにおいて実装される2つの同一の関数に異なるレジスタおよびメモリアドレスが割り当てられ、2つのソフトウェアのバイナリイメージが異なっているように見えることにつながり得るので、ソフトウェアのバイナリイメージ内の関数ブロックを識別する問題の一因となる。ソフトウェアのバイナリイメージ内のレジスタおよびメモリアドレスを正規化して、正規化されたバイナリイメージを生成することによって、その後の分析では、命令のシーケンスに焦点を当てることができるようになる。というのは、すべてのレジスタおよびアドレスが、次いで分析中のバイナリイメージおよび参照データベース22に格納されている参照関数のバイナリイメージ内で同じになるからである。メモリレジスタおよびアドレスの割り当ては、逆コンパイラまたは所与のプロセッサにおける所与のコンパイラについての関数の開始および終了を識別するための周知の技術を使用してバイナリイメージを分析するステップ、すなわちステップ16、または図3を参照して後述するように、バイナリイメージをスキャンして、バイナリシーケンス内のレジスタまたはメモリアドレスの参照を認識するステップを含めて、様々な方法を使用して、分析中のバイナリイメージで識別することができる。
【００２０】
関数レベルでのソフトウェアのバイナリイメージを分析するために、ステップ14で、ソフトウェアのバイナリイメージは、バイナリシーケンス内の関数の境界を識別するためにも分析される。このプロセスは本質的に、ソフトウェアのバイナリイメージを、個々に分析し、参照データベース22に格納されている既知の関数と比較することができるバイナリコードの関数ブロックに分割する。関数レベルでのソフトウェアのバイナリイメージの分析によって、本実施形態の方法は、バイナリイメージを作成するためにコンパイルされたソースコードを考慮する必要なく、コンパイルされたソフトウェア内の特定の関数を認識することができる。関数の境界は、逆コンパイラアプリケーションなどの既知の方法、またはステップ16で、所与のプロセッサにおける所与のコンパイラについての関数の開始および終了を識別するための、命令を認識し、関数ブロックを識別してバイナリシーケンスを構文解析する周知の技術を使用して、ソフトウェアのバイナリイメージのバイナリシーケンス内で識別することができる。あるいは、本実施形態の方法は、バイナリイメージのバイナリシーケンスをスキャンして、関数の開始および終了に関連付けられている命令のパターンを識別し、こうした認識された命令パターンを使用して、図4を参照して以下にさらに詳しく説明するように、関数の境界を提示することができる。
【００２１】
分析中のバイナリイメージ内で関数の境界が識別されると、各関数に関連付けられているバイナリコードのブロックの開始および終了のビットの位置は、例えばポインタの形でメモリに格納される、または境界ラベル(例えば、フラグ、一意のビットパターンなど)がバイナリイメージに付加されて識別することができる。あるいは、バイナリコードの各関数のブロックは、関数の一時データベースに別々に格納され得る。開始および終了のビット位置をメモリに格納する、または関数の境界のラベルでバイナリイメージにタグ付けすることによって、ソフトウェアのバイナリイメージのバイナリシーケンスを開始から終了まで通じてその後の処理が行われ、バイナリイメージにおいて出現するシーケンスで各関数を分析することができるようになる。一時データベースに識別された関数のバイナリコードのブロックを別々に格納することによって、分析中のバイナリイメージのそれ以上の構文解析を行うことなく、各関数を、任意のシーケンスで分析することができる。また、識別された各関数のバイナリコードのブロックを、分析中のバイナリイメージにおいて出現する順序で一時データベースに格納することができ、それによって、出現するシーケンスで関数を分析することができる。
【００２２】
レジスタおよびメモリアドレスが正規化され、関数の境界が識別された(または関数が一時データベース内に個別に格納されている)状態で、各関数を個別に分析するプロセスを開始することができる。この処理は、図1に示すようにソフトウェアのバイナリイメージを処理するループ内で実行することができる。そのために、ステップ18で、分析のために、コードの関数ブロックが選択される。分析ループを通る最初のパスでは、ステップ18で選択したコードの関数ブロックは、バイナリシーケンスまたは一時データベース内のコードの最初の関数ブロックになり、分析ループを通るその後のパスでは、ステップ18で選択したコードの次の関数ブロックは、バイナリシーケンスまたはデータベースになる。この選択では、テスト20でそのコードのブロック内のビットのパターンを参照関数の参照バイナリイメージと比較できるように、選択した関数に関連付けられているコードの全ブロックがアクティブなメモリに格納されてもよい。選択した各関数をデータベース内の1つ、一部、またはすべての参照関数と比較できるように、参照バイナリイメージが参照データベース22に格納されていてもよい。この比較テスト20は、パターン認識およびビット単位またはバイト単位の比較を含めて、ビットシーケンスを比較するための周知の方法を使用して達成することができる。特定の関数が分析中のバイナリイメージに含まれているかどうかを決定するために分析が行われている場合のように、単一の参照関数のバイナリイメージを、テスト20で、コードの選択された関数ブロックと比較することができる。あるいは、参照関数のバイナリイメージのデータベース22内の複数の参照バイナリイメージをコードの選択された関数ブロックと比較して、データベースに含まれる任意の関数が分析中のコードの選択された関数ブロックに存在するかどうかを決定することができる。
【００２３】
一実施形態において、コードの選択されたブロック全体を、全体的に見て参照関数のバイナリイメージと比較する代わりに、コードの選択された関数ブロックを、サブユニットレベル(すなわち、コードの選択されたブロックの一部)で、参照データベース22内の参照関数のバイナリイメージと比較することができる。例えば、比較プロセスを簡略化するために、分析を、一時にコードの選択されたブロック内のいくつかのバイト、例えば4バイトから10バイトまでなどに対して行うができる。別の例として、例えば条件文(すなわち「if-then」ソフトウェアステップのコンパイルされた実装など、条件テストに応じて分岐をもたらす命令)の間のコードのブロックを選択することによって、分析を演算ユニットのレベルで行うことができる。こうしたブロック単位またはセグメント単位の分析は、全関数の比較より実行が容易である可能性があり、参照データベース22に格納される参照関数のバイナリイメージとはわずかに異なる方法で実装されている関数を認識するために使用することができる。次いで、ブロック単位またはセグメント単位の比較の結果を組み合わせて、テスト20で、ステップ18で選択された関数全体が参照データベース22内の関数と一致するかどうかを決定することができる。言い換えると、すべてのブロックまたはセグメントが、参照関数で出現するのと同じ順序で参照データベース22内の関数内の対応するブロックまたはセグメントと一致する場合、選択された関数は、その特定の参照関数と一致する。すべてのブロックまたはセグメントが、参照データベース22内の関数内の対応するブロックまたはセグメントと一致し、しかし、参照関数で出現するのと必ずしも同じ順序ではない場合、これは、関数が一致する可能性があることを示す。同様に、ブロックまたはセグメントの多くが、参照データベース22内の関数内の対応するブロックまたはセグメントに一致する場合、これは、関数が機能的に等しい可能性があることも示す。以下により十分説明するように、比較が一致の可能性があることを明らかにする場合、選択された関数および参照関数が完全に一致しているかどうか、または参照関数がコピーされているかどうかを決定するために、さらなる分析を行うことができる。
【００２４】
別の実施形態において、必ずしもすべてのブロックまたはセグメントが参照データベース22内の参照関数のブロックまたはセグメントと一致するとは限らないとき、パターンマッチングをテキストアナライザで使用される分析技術と組み合わせて、関数内で一致するブロックまたはセグメントを認識することができる。いくつかの場合、関数の実装の結果、いくつかのコードが関数内の共通の構成要素パーツ間に点在することになるので、関数の動作は機能的に等しいにもかかわらず、コードの選択された関数ブロックが、参照データベース22内の参照関数と完全に一致しない可能性がある。例えば、その全プロセスを変更しないように選択された関数の途中のどこかにいくつかのコードを追加して、参照データベース22内の参照関数を、分析中のバイナリイメージにおいてわずかに変更することができる。一例として、関数は、特定の構成要素パーツが、等しいがわずかに異なる構成要素パーツによって置き換えられた状態で実装されてもよい。別の例として、コードの関数ブロック全体が異なるように見えるように、いくつかの取るに足らないコードを関数に追加してもよい。
【００２５】
こうした選択された関数をブロック単位またはセグメント単位で参照関数と比較すると、ブロックまたはセグメントは、挿入部分または変更部分に出くわすまで参照データベース22内の参照関数のものと一致することが確認され、その時点で一致が検出されなくなる。次いで、置換または挿入されたバイナリコードは、参照データベース22における参照関数のバイナリイメージでのビットシーケンスからのコードにおける選択された関数ブロックのバイナリコードの残りをオフセットするため、選択された関数内のその後のブロックまたはセグメントは一致しない。この問題を克服するために、テキストアナライザのアプリケーションで使用されるような、パターン認識ソフトウェアを実装することにより、一致しないブロックまたはセグメントに後続するコードの選択された関数ブロック内のビットシーケンスをスキャンし、コードの選択された関数ブロックを、参照データベース22における参照関数のバイナリイメージに関して再配列できるかどうかを決定するようにしてもよい。このプロセスでは、コードの選択された関数ブロックと参照関数のバイナリイメージとの間で任意の一致するパターンがあるかどうかを決定するために、その後のビットパターンが分析される。その後のビットパターンの一致がコードの選択された関数ブロック内で認識される場合、この情報を使用して、ビットパターンが一致する時点で参照関数のバイナリイメージとのブロック単位またはセグメント単位の比較を再開することができる。この方法を使用すると、構成要素パーツが異なる順序で実装されるときでさえ、またはそれがコピーされているという事実を隠すために、分析中のコードのブロックが変更されているときでさえ、関数の一致を識別することができる。
【００２６】
コードの選択された関数ブロックが、参照データベース22内の参照関数のバイナリイメージと一致する、またはほぼ一致することをテスト20で行われたコード一致分析が決定する場合、ステップ30で、参照関数への特定の一致を記録することができる。単一の関数のみが検索されている場合を除き(その場合、一致によってプロセスが終了し得る)、テスト32で、分析すべきバイナリイメージ内に別の関数があるかどうかを決定し、そうである場合、ステップ18で、分析のためにコードの次の関数ブロックを選択するプロセスステップに戻ることによって、プロセスが続行し得る。選択された関数ブロックが参照データベース22内の参照関数のバイナリイメージと一致しない、またはほぼ一致しないことを、テスト20で行われたコード一致分析が決定した場合(すなわち、テスト20=「No」)、プロセスは、テスト32で、分析すべき別の関数があるかどうかを決定し、そうである場合、ステップ18で、分析のためにコードの次の関数ブロックを選択するプロセスステップに戻ることによって、分析のためにコードの次の関数ブロックを選択し続けることができる。分析中のバイナリイメージ内のすべての関数がいったん分析されると(すなわち、テスト32=「No」)、分析プロセスは、ステップ34で、参照データベース22内に含まれる参照関数と一致することが確認された関数のすべてを列挙することによって終了し得る。
【００２７】
参照データベース内の参照関数のバイナリイメージに対する完全なまたはほぼ完全な一致についてソフトウェアのバイナリイメージを分析するための代替実施形態が図2に示されている。この代替実施形態では、関数のバイナリイメージのライブラリに対するバイナリコードの選択された部分のビット単位、ブロック単位、またはセグメント単位の比較のプロセッサの負荷の大きいステップは、コードセグメントハッシュ値のより効率的な比較によって置き換えられる。上述したように、ハッシュアルゴリズムを使用して、大きいバイナリシーケンス(例えば、コンパイルされたソフトウェアコードの一部)をその特定のバイナリイメージに統計的に一意であるはるかに少ない数値に変換することができる。2つの異なるバイナリイメージが同じハッシュ値をもたらす可能性は、バイナリイメージのサイズ、およびハッシュ値の桁数によって異なるが、典型的なハッシュアルゴリズムの場合、この確率は非常に低く、ハッシュ値は、関連付けられているバイナリイメージを一意に識別するものとして扱われ得る。2つのハッシュ値を比較することは、単純な算術演算である。というのは、2つの数値は余りがあるかどうかを決定するために単純に減算することができるからであり、余りがある場合、2つのバイナリイメージは異なる。この簡略化された処理の結果として、関数および関数の構成要素パーツを、多数の参照関数のバイナリイメージと迅速に比較することができる。しかし、たとえ図1を参照して上述したようなブロック単位またはセグメント単位の比較が一致を検出する可能性があるとしても、選択された関数ブロックと参照関数イメージとの間の微妙な差は、一致がないという決定をもたらす。したがって、図2に示した本実施形態は、大規模なデータベースに対してバイナリイメージをはるかに高速に分析することはできるが、一致に近いものが見落とされる可能性があるという欠点がある。
【００２８】
図2に示した実施形態に伴うプロセスステップは、図1を参照して上述したステップの多くを伴う。特に、ステップ10で受信したソフトウェアのバイナリイメージは、ステップ12で、レジスタおよびメモリの参照を正規化し、ステップ14で、関数の境界を識別するために前処理される。図1に示した実施形態と同様に、ソフトウェアのバイナリイメージの分析は、ループ内で識別された各関数の分析に順々に取りかかる。各関数を分析するために、ステップ19で、コードのその選択されたブロックについて、関数が選択され、ハッシュ値が生成される。図1を参照して上述したステップ18と同様に、分析ループを通る最初のパスでは、ステップ19で選択したコードの関数ブロックは、バイナリシーケンスまたは一時データベース内における最初のものになり、分析ループを通るその後のパスでは、ステップ19で選択したコードの次の関数ブロックは、バイナリシーケンスまたはデータベースになる。次いで、コードの選択された関数ブロック用に生成されたハッシュ値を、テスト21で、特定の参照関数のバイナリイメージのハッシュ値またはハッシュデータベース24内のハッシュ値と比較することができる。ステップ19で選択された関数のハッシュ値を生成するために使用されるハッシュアルゴリズムは、参照関数のバイナリイメージのハッシュ値を生成するために使用されるものと同じハッシュアルゴリズムである。一実施形態では、ハッシュアルゴリズムは、CRCアルゴリズムなどの一方向ハッシュである。
【００２９】
任意の参照関数のバイナリイメージのハッシュ値は、テスト21において比較時に生成することができるが、より効率的な手法は、参照データベース22に格納された参照関数のバイナリイメージのハッシュ値を生成し、それらのハッシュ値をハッシュデータベース24に格納するステップを伴う。こうしたハッシュデータベース24は、各ハッシュ値に関連付けられている参照関数を識別する識別子(ID)を含むことができる。次いでハッシュデータベース24は、ソフトウェアのバイナリイメージの分析を開始する前にいつでも生成することができる。
【００３０】
周知の2進数比較技術(例えば、減算し、余りをテストする)を使用することによって、テスト21で達成された比較は、コードの選択された関数ブロック用に生成されたハッシュ値がハッシュデータベース24に格納されたハッシュ値のいずれかに一致するかどうかを迅速に決定することができる。一致が検出された場合(すなわち、テスト21=「Yes」)、ステップ30で、ハッシュデータベース24における一致するハッシュ値の識別子が記録され得る。ステップ30で関数の一致がいったん記録されると、またはハッシュの一致が検出されない場合(すなわち、テスト21=「No」)、テスト32で、分析すべきバイナリイメージ内に別の関数があるかどうかを決定し、そうである場合、ステップ19で、分析のためにコードの次の関数ブロックを選択し、そのハッシュ値を生成するステップに戻ることによって、プロセスが続行し得る。分析中のバイナリイメージ内のすべての関数がいったん分析されると(すなわち、テスト32=「No」)、分析プロセスは、ステップ34で、参照データベース22内に含まれる参照関数と一致することが確認された関数のすべてを列挙することによって終了し得る。
【００３１】
上述したように、ステップ16で、逆コンパイラアプリケーション、または所与のプロセッサにおける所与のコンパイラについての関数の開始および終了を識別するための周知の技術を使用することによって、または分析中のバイナリイメージを直接スキャンして、レジスタまたはメモリアドレスの参照を認識することによって、ステップ12で、メモリレジスタおよびメモリアドレスの値を識別し、正規化することができる。レジスタおよびメモリアドレスの参照についての分析中のバイナリイメージをスキャンするために、ステップ12内で実装され得るプロセスステップの例を図3に示す。このプロセスでは、ステップ120で、バイナリイメージ内のバイナリコードのブロックを選択することができ、選択されたブロックは、レジスタおよびメモリアドレスの参照に関連付けられている命令の大きさに対応するバイト数としての大きさになっている。次いで、テスト122で、バイナリコードの選択されたブロックが、既知のレジスタまたはメモリ位置の参照についてバイナリビットパターンと比較される。図3に示すように、このプロセスは、分析中のバイナリイメージを処理するループとして構成されてもよい。ループを通る最初のパスでは、ステップ120で選択したコードブロックは、バイナリイメージ内の最初のXバイトになり、分析ループを通るその後のパスでは、ステップ120で選択されたコードブロックは、直前のパスで処理されたものを超えたバイナリイメージにおけるコードの次のXバイトになる(すなわち、Xバイトまたは最後の選択を超えたX+Yバイト)。コードの選択されたブロックがレジスタまたはメモリ位置の参照を含む場合(すなわち、テスト122=「Yes」)、ステップ124で、ビットのその後のブロックが選択され、正規化される(例えば、等しい選択されたビットのすべてをゼロに設定する)。この選択におけるビット数は、バイナリイメージの対象となるプロセッサまたはオペレーティングシステムにおいて実装されるアドレスサイズに依存する。例えば、16、32、または64ビットを選択し、正規化することができる。一部の命令では、その後のビットではなく、命令自体の中でレジスタ値が符号化され、この場合、ビットのブロックを選択し、正規化するステップは、レジスタ値を符号化する命令内のこうしたビットを選択する。
【００３２】
選択されたビットがいったん正規化されると、またはステップ120で選択されたコードがレジスタまたはメモリ位置の参照に対応していない(すなわち、テスト122=「No」)場合、テスト126で、分析すべきバイナリコードがさらにあるかどうかを決定し、そうである場合、戻って、ステップ120で、分析のためにコードの次のブロックを選択することによって、プロセスが続行し得る。すべてのコードがそのように分析されると(すなわち、テスト126=「No」)、処理は、図1および図2を参照して上述したように、ステップ14など、次のステップに進むことができる。
【００３３】
上述したように、ステップ16で、逆コンパイラアプリケーション、または所与のプロセッサにおける所与のコンパイラについての関数の開始および終了を識別するための周知の技術を使用することによって、または分析中のバイナリイメージを直接スキャンして、関数を開始または終了する命令パターンを認識することによって、ステップ14で、関数ブロックをバイナリイメージ内で識別することができる。ステップ14で、関数の境界についてバイナリイメージをスキャンするように実装することができるプロセスステップの一例を図4に示す。関数、および特に構成要素パーツ(例えば、条件付き命令によって画定されたセグメント)は、ループ内にネストされ得るため、バイナリイメージ内の関数ブロックを識別するプロセスは、ステップ140で、分析の開始時に「0」に初期化される得るループカウンタi(またはバイナリイメージ内にネストされた再帰的ループを追跡する同様の方法)の使用を含み得る。このプロセスでは、ステップ142で、バイナリコードのブロックを選択することができ、コードブロックは、関数の開始および終了に関連付けられている命令の大きさに対応するバイト数としての大きさになっている。図4に示すように、このプロセスは、分析中のバイナリイメージを処理するループとして構成されてもよい。ループを通る最初のパスでは、ステップ142で選択したコードブロックは、バイナリイメージ内の最初のXバイトになり、分析ループを通るその後のパスでは、ステップ142で選択されたコードブロックは、直前のパスで処理されたものを超えたバイナリイメージにおけるコードの次のXバイトになる。次いで、テスト144で、バイナリコードの選択されたブロックが、ループ-開始命令(loop-beginning instruction)または分岐-開始命令(branching-beginning instruction)など、関数の開始を特徴付ける命令のパターンと比較される。通常、関数または分岐は、スタックに命令ポインタをプッシュし、関数開始命令に分岐することによって開始する。こうした命令のパターンは、関数の開始を決定する(すなわち、関数の開始の境界を識別する)ために容易に認識することができる。
【００３４】
関数の開始が認識された場合(すなわち、テスト144=「Yes」)、ステップ146で、その命令のビットシーケンスの位置は、メモリ内に格納されるか、関数開始マーカーでマークされる。ネストされた関数に対応するために、特定の関数の開始マーカーは、ネストされた関数の開始および終了を正確に相関付けることができるように、ステップ148で、次いでインクリメントされる、ループカウンタ値iまたはネストされたループを追跡する他の方法で識別され得る。次いで、テスト156で、分析すべきバイナリコードがさらにあるかどうかを決定し、そうである場合、ステップ142に戻って、分析のために次のコードブロックを選択することによって、処理が続行し得る。
【００３５】
選択されたコードブロックが関数の開始を含まない場合(すなわち、テスト144=「No」)、テスト150で、関数の終了を示す命令が含まれるかどうかを決定するために、コードブロックをテストすることができる。関数または分岐の開始と同様に、通常の関数は、スタックから命令ポインタ(アドレスシーケンサ値)をポップし、指示された命令のアドレスに分岐して戻ることによって終了する。こうした命令パターンは、関数の終了を決定する(すなわち、関数の終了の境界を識別する)ために容易に認識することができる。関数の終了が識別されている場合(すなわち、テスト150=「Yes」)、特定の関数終了マーカーは、例えば、すなわちそのアドレスが分岐命令のアドレスより小さい分岐である「上向きの」条件分岐を探すことによって、ステップ152で、特定のループに相関付けられ得る。同様に、「if」ステートメントは、下向きの条件分岐である。ステップ152で、その命令のビットシーケンス位置をメモリに格納し、または関連するループ-開始ステートメントと相関付けられる関数終了マーカーでマークされる。ネストされた関数に対応するために、ステップ154で、関数の開始および終了を正確に追跡できるように、ループカウンタをインクリメントすることもできる。次いで、テスト156で、分析すべきバイナリコードがさらにあるかどうかを決定し、そうである場合、ステップ142に戻って、分析のために次のコードブロックを選択することによって、処理が続行し得る。すべてのバイナリイメージがいったんそのように分析されると(すなわち、テスト156=「No」)、次いで処理は、図1を参照して上述したように、ステップ18など、分析の次のステップに進むことができる。
【００３６】
ステップ146および152でバイナリイメージに関数開始タグおよび終了タグを追加する代わりに、アドレスポインタをデータベースに格納することができ、ポインタは、バイナリイメージのビットシーケンス内、または関数の開始または終了に関連付けられているビットを含むメモリ内の特定の位置を示す。アドレスポインタのこうしたデータベースは、単に、バイナリイメージ内の関数の開始位置および終了位置を示すために、対で格納され得るメモリ位置のテーブルとすることができる。その後の処理で、こうしたメモリ位置をプロセッサによって使用して、関数開始ポインタに格納されているメモリ位置におけるイメージの読み取りを開始し、関数終了ポインタに格納されているメモリ位置に到達すると、読み取りプロセスを停止することによって、分析のためにバイナリイメージの関数ブロックを選択することができる(ステップ18または19)。
【００３７】
上述したように、識別された関数は、バイナリイメージ内の関数の境界をマーク付けする代わりに、一時データベース(または同様のデータ構造)に個別に格納されてもよい。ステップ14で、バイナリイメージをスキャンし、認識された関数をデータベースに格納するために実施され得るプロセスステップの一例が図5に示されている。関数終了命令が識別されると(すなわち、テスト150=「Yes」)、ステップ146で認識された関数開始命令と、テスト150で認識された関数終了命令との間に及ぶコードのブロックが、ステップ153で、関数コードブロックとしてメモリに格納されることを除いて、この代替プロセスは、図4を参照して上述したものと非常によく似ている。関数コードブロックが格納されているデータベースは、周知の様々なデータ構造で構成することができ、バイナリイメージで関数が開始した場所(例えば、テスト144で最初に認識された命令のビットシーケンス位置)の指示を含むことができるため、関数は、バイナリイメージにおいて出現する順序で選択することができる(例えば、ステップ18または19で)。そうすることによって、関数が互いの中にネストされている状況に対応し、その場合、関数終了命令は、関数開始名命令が出現するシーケンスとは異なるシーケンスで出現し得る。認識された関数のコードブロックがいったん格納されると、次いで、テスト156で、分析すべきコードがさらにあるかどうかを決定し、そうである場合、ステップ142に戻って、分析のために次のコードブロックを選択することによって、プロセスが続行し得る。すべてのバイナリイメージがいったんそのように分析されると(すなわち、テスト156=「No」)、次いで処理は、図1を参照して上述したように、ステップ18など、分析における次のステップに進むことができる。
【００３８】
関数が他の関数を呼び出したり、他の関数を含んでいることが多いことは当業者であれば理解されよう。上記の実施形態は、スタンドアロンの関数、別の関数内にネストされた関数、および関数の関数に対応する。参照関数イメージデータベース22内に含まれる関数が他の関数を含む関数、および含まれる関数のうちの1つまたは複数を含むときの場合のように、ネストされた関数の場合、複数の関数の一致を得る可能性がある。例えば、参照関数イメージデータベース22が参照Viterbiデコーダ関数、および同じViterbiデコーダ関数を含む参照モデム制御関数を含む場合、両方の参照関数との一致は、分析中のバイナリイメージがその特定のモデム制御関数を含むときに決定される。
【００３９】
一実施形態では、図3および図4に示すステップ12および14における処理は、単一のループで進むように、結合することができる。この実施形態では、ステップ120または142で選択されたコードの各ブロックは、テスト122で、それがレジスタラベルまたはメモリアドレスの参照のいずれかを含むかどうかを決定するために分析され、そうでない場合、テスト144で、ループ-開始または分岐-開始命令を含むかどうか、またはテスト150で、ループ-終了または分岐-リターン命令(branch-return instruction)を含むかどうかを決定するために、同じコードブロックが分析される。任意のテストが正である場合(すなわち、テスト122、144、または150のうちの任意の1つ=「Yes」)、関連する処理が達成され(すなわち、ステップ124、146、152、または153のうちの1つ)、分析すべきコードがさらにあるかどうかを決定し(テスト126、156)、そうである場合、コードの次のブロックを選択する(すなわち、120または142を繰り返す)ことによって、ループが続行する。この実施形態によって、バイナリイメージの前処理を単一のパスで達成することができる。
【００４０】
上記の実施形態は、この方法が参照データベース22内の関数イメージに対する完全なまたはほぼ完全な一致を認識するため、関数の特定のバージョンがソフトウェアのビルド内に含まれているかどうかを決定するのによく適している。これらの実施形態は、リリース前にソフトウェアのバイナリイメージの内容を確認するために、または、バイナリイメージ内に存在し得る既知のバグを特定する際に非常に役に立つ可能性がある。
【００４１】
他の状況または用途では、任意のバイナリイメージが、いくつかの機能を含む可能性が高いかどうかを決定することが望ましい場合がある。こうした状況の一例には、任意の関数が許可なしにコピーされているかどうかを決定するためにソフトウェアが分析される場合がある。こうした状況で、完全一致を探すことによって、関数コードに取るに足らない変更を含めることによってコピーを隠す手間に対して、この方法は脆弱になり得る。こうした状況に対処するために、一致の可能性の実施形態の方法は、関数のパーツが既知の関数の実装に一致するかどうかを決定するために、分析中のにバイナリイメージを、関数内の構成要素パーツのレベルで参照データベースと比較する。
【００４２】
より小さい関数-構成要素セグメントで分析中のバイナリイメージを分析することによって、類似の関数の構成要素パーツを、分析中のバイナリイメージが参照関数および既知の関数の実装に機能的に似ている度合いを決定するために使用することができる参照データベース内の関数内の参照の構成要素パーツに一致させることができる。統計的または図式的なメトリックスで一致した構成要素パーツの情報を提示することによって、一致の可能性の実施形態の方法は、分析中のバイナリイメージがコピーされたソフトウェアを含む可能性に関してユーザに通知することができる。たとえ結果が絶対でないとしても、こうした可能性の評価は、バイナリイメージのビット単位の比較またはソースコードの行単位の比較など、より厳密な分析の方法を実行する価値があるかどうかを決定する際に役に立つ可能性がある、したがって、一致の可能性の実施形態の方法は、さらなる調査が適切かどうかを決定するために、バイナリイメージを多数の既知の実装と比較するための選別ツールとして使用することができる。
【００４３】
一致の可能性の実施形態の方法で実施され得るプロセスステップ例が図6に示されている。図1および図2を参照して上述したように、ステップ10で、分析のために受信されたバイナリイメージは、ステップ12で、レジスタおよびメモリアドレスの参照を正規化し、ステップ14で、関数ブロックを識別するために前処理される。上述したように、この前処理は、ビルドによって異なるレジスタおよびメモリアドレスの値の邪魔をすることなく、関数と関数の構成要素パーツとの比較を可能にする。上記の実施形態によって提供されるよりも、より詳細なレベルでバイナリイメージを分析するために、ステップ40で、演算および類似の構成要素のブロックなど、関数内の構成要素パーツを識別することによって、前処理が続行する。ステップ40で、関数内の構成要素パーツの境界を識別するために、様々な基準を使用することができ、したがって、このさらなる細分化は、演算ブロックだけに限定されず、図における「演算ブロック」の使用はあくまでも例示のためである。ステップ16で、逆コンパイラアプリケーション、または所与のプロセッサにおける所与のコンパイラについての関数の開始および終了を識別するための周知の技術を使用して、関数のこうした構成要素パーツを識別することができる。というのは、逆コンパイラおよび他の技術は、分岐、条件文、および類似の命令を識別することができるからである。あるいは、関数内の重要なコンポーネントの開始および終了を識別するために、バイナリイメージのブロック単位の分析を、図4および図5を参照して上述した方法で行うことができる。例えば、多くの関数は、その固有のビットパターンに基づいて認識することができる条件文を含む。関数内の構成要素パーツは、分岐命令から認識することもでき、分岐命令は、それらのビットパターンに基づいてまたはスタックに命令シーケンサ値をプッシュする命令に基づいて認識することができ、構成要素パーツの終了は、スタックから前記シーケンサ値をポップすることによって示される。
【００４４】
ステップ40で構成要素パーツを識別する際、構成要素が個別に識別される、またはその一部である特定の関数に対応するものとして識別され得る。いずれの手法も機能するが、各手法には長所と短所があり、特定の用途または状況において一方の手法が勝る可能性がある。
【００４５】
図4および図5を参照して上述したように、関数を識別できる、または一時データベースに格納できる方法と同様に、例えば、バイナリイメージに追加された開始および終了マーカーによって、バイナリイメージ内の開始および終了ビットを示すポインタを格納することによって、または識別された構成要素パーツのコードブロックを一時データベースに格納することによって、関数の識別された構成要素パーツを識別することができる。
【００４６】
関数およびその構成要素パーツが識別され、またはデータベースに格納されている状態で、ステップ42で、分析のために構成要素パーツを選択することによって、処理が進み得る。図6に示すように、この処理を分析中のバイナリイメージを処理するためのループで実行することができる。分析ループを通る最初のパスでは、ステップ42で選択したコードのブロックは、バイナリシーケンスまたは一時データベース内における最初のものになり、分析ループを通るその後のパスでは、ステップ42で選択したコードの次のブロックは、バイナリシーケンスまたはデータベースにおける次のものになる。一実施形態では、コードの選択された構成要素パーツまたは演算ブロックは、図1を参照して上述したように、テスト20のビット単位の比較方法を使用して構成要素パーツの参照データベース46に格納された参照の構成要素パーツと比較することができる。しかし、バイナリイメージが関数ではなく、構成要素パーツに分割されるとき、特に、各構成要素パーツを参照の構成要素パーツのバイナリイメージの大きいライブラリと比較するとき、大量の比較を行う必要があり得る場合、好ましい実施形態は、ステップ42で、選択された構成要素パーツまたは演算ブロックの一方向ハッシュを生成する。次いで、生成されたハッシュを、テスト44で、構成要素のハッシュデータベース47に格納することができる参照の構成要素パーツのハッシュ値と比較することができる。図2を参照して上述したように、構成要素パーツのハッシュ値のデータベースは、分析の前に生成され、実施形態の方法で使用するためにライブラリまたはデータベース内に保持することができる。上述したように、ハッシュ値の比較は、ビット単位でバイナリコードを比較すること、またはバイナリシーケンス内のパターンを認識することよりもはるかに少ない処理を伴い、したがって、この方法を使用して、多くの構成要素パーツを所与の処理時間内で参照データベースと比較することができる。
【００４７】
ステップ42において生成されたコードの選択された構成要素パーツのブロックのハッシュ値が、参照の構成要素パーツのハッシュデータベース47内のハッシュ値と一致する場合(すなわち、テスト44=「Yes」)、ステップ48で、その一致が記録される。実装に応じて、一致する構成要素パーツを、単独で、またはその構成要素である関数との組み合わせで記録することができる。言い換えれば、構成要素パーツのハッシュデータベース47が構成される方法に応じて、プロセスは、一致した構成要素パーツを単体で、または特定の関数内で一致した構成要素パーツを追跡することができる。多くの演算ブロックは、異なる様々な関数で使用され得るため、バイナリイメージ内のこうした演算ブロックの一致は、特定の関数におけるこうした演算ブロックの一致ほど重要ではない場合がある。一方、バイナリイメージ内の任意の位置における極めて一意の演算ブロックの一致は、一致した一意の演算ブロックを含めて、ソフトウェアの少なくとも一部がコピーされている可能性を示し得る。別の実施態様では、一致が検出されたという事実のみを、例えば一致カウンタの形でなどで記録することができる。例えば、一致する構成要素の割合(すなわち、構成要素のハッシュデータベース47内の構成要素に一致するすべての構成要素ブロックの割合)は、単に、一致の数および比較された構成要素ブロックの数をカウントすることによって計算することができる。
【００４８】
選択された構成要素パーツがハッシュデータベース47内の任意のハッシュ値と一致しない場合(すなわち、テスト44=「No」)、またはステップ48で検出された一致が記録されている場合、テスト50で、分析する別の構成要素パーツまたは演算ブロックがあるかどうかを決定し、そうである場合、ステップ42に戻って、コードの次の構成要素パーツのブロックを選択し、そのハッシュ値を生成することによって、プロセスが続行する。
【００４９】
すべての構成要素パーツがいったん分析されると(すなわち、テスト50=「No」)、ステップ52で、記録された一致を使用して、一致する関数グループを既知の実装と比較することができる。バイナリイメージの内容に関する結論に到達するために記録された一致の結果を使用して、異なる様々な分析を行うことができる。例えば、ステップ56で、バイナリイメージ全体について、一致する構成要素パーツの単純な割合を生成することができ、出力は、統計手段として提供される。こうした統計は、バイナリイメージ全体が類似のソフトウェアアプリケーションのコピーに基づいている可能性に関連する情報を明らかにする。しかし、バイナリイメージがコピーされたいくつかの関数しか含んでいない場合、こうした総合的な割合の統計値では、コピーされたことが明示されない場合がある。そのため、ステップ52で、大部分の構成要素パーツが参照データベース22、46内の参照関数のものと一致する関数を識別するために、構成要素のグループの関数との一致を比較することができる。関数内の大部分の構成要素パーツが参照データベース22、46における参照関数のものと一致する場合、これは、その特定の関数がコピーされている可能性が高いことを示す可能性がある。これはまた、ステップ56で、特定の関数内での構成要素パーツの一致を示す統計値として表示され得る。
【００５０】
より詳細な分析では、ステップ52で、一致する構成要素パーツが関数内において出現する順序を評価することができる。多くの場合、コンポーネントプロセスが実行される順序は、関数全体には影響せず、したがって、参照データベース22、46内の参照の構成要素パーツに一致する関数内の構成要素パーツの数は、コピーを示すのに十分であり得る。しかし、いくつかの関数では、構成要素パーツが実行される順序は重要である。こうした関数では、多数の一致する構成要素パーツは、分析中のバイナリイメージ内の関数において出現する順序が参照データベース22、46内の参照関数内のものと異なる場合、コピーの可能性があることを示さない場合がある。こうした情報は、特定の参照関数を識別する形で、ステップ54で、構成要素パーツが既知の実装に一致する方法で、ユーザに提示することができる。
【００５１】
構成要素パーツの一致の結果のさらなる分析では、結果は、分析中のバイナリイメージ内の特定の構成要素パーツが様々な参照関数において出現する頻度を明らかにすることができるヒストグラムの形で提示され得る。この手法は、多くの異なる関数において出現する構成要素パーツに、またはコピーの全体的なパターンを検出するのに有用であり得る。
【００５２】
別の例では、関数またはいくつかの関数内の特定の構成要素パーツの出現は、特定の実装に一意である可能性があり、したがって、それらの一致は、コピーの可能性が高いことを示す可能性がある。こうした分析は、ステップ54で、既知の実装との比較、またはステップ56で、統計的一致として出力され得る。
【００５３】
別の例では、分析中のバイナリイメージ内、またはそのバイナリイメージ内の特定の関数内において構成要素パーツが出現する順序が既知の実装と比較され得る。関数は、多くの場合、階層内で呼び出され、したがって、関数の呼び出しの階層は、特定の関数またはソフトウェアのリリースに一意であり得る。多くの一致する関数または多くの一致する関数の構成要素パーツが存在する可能性がある状況では、構成要素パーツまたは関数が呼び出される順序は、ソフトウェアがコピーされている可能性をより適当に感知させ得る。したがって、コピーの確率は、所与のバイナリイメージ内で、共通の関数および構成要素パーツが呼び出されるシーケンスに関係する可能性がある。
【００５４】
ステップ52で、これらの様々な分析は、コピーの可能性の尺度を生成するために、例えばベイズ統計分析を含めて、様々な周知の論理的および統計的プロセスを利用することができる。
【００５５】
分岐アドレスを正規化するために追加の前処理を含む代替の実施形態が図7に示される。分岐機能の正規化は、関数およびアルゴリズムのブロックが識別された後に達成することができる。分岐アドレスは、アドレスをゼロに設定するか、または相対アドレスを計算し、関数またはアルゴリズムのブロックのベースアドレスとしてゼロを使用することによって正規化することができる。後者のプロセスは、いくつかの状況において、より正確であり得る。参照データベース内のものとは異なる順番で提示される関数の構成要素パーツをよりよく検出することができるように、ステップ41で、分岐アドレスを正規化するために、分析中のバイナリイメージをさらに前処理してもよい。上述したように、関数内の分岐は、ステップ40で演算ブロックおよび構成要素パーツを検出するために使用され得る。こうした分岐が検出されると、こうした命令に含まれている分岐アドレスを、ステップ41で、例えばすべてゼロなどの基準値に設定する、または関数またはアルゴリズムのブロックのゼロのベースアドレスに対する計算された相対アドレスに設定することができ、したがって、結果として得られたコードの正規化されたブロックを、分岐アドレスに関係なく比較することができるようになる。分岐アドレスを正規化するためのステップ41の追加以外に、本実施形態におけるステップの処理は、図6を参照して上述したように進む。
【００５６】
図8に示す別の実施態様では、完全一致および一致の可能性の実施形態は、単一のプロセスに結合され得る。この実施形態では、ステップ18または19で、コードの関数ブロックを選択し、テスト20または21で、関数レベルで参照データベース22と比較することができる。この比較は、図1を参照して上述したように、テスト20で、それらのビットパターンに基づいて、または図2を参照して上述したように、テスト21で、ハッシュ値の比較に基づいて行うことができる。一致が検出された場合、図1および図2を参照して上述したように処理が続行し得る。しかし、関数の一致が検出されない場合、この実施形態のプロセスは、ステップ42で、その関数内の、演算ブロックなど構成要素パーツを選択することによって続行し得る。次いで、テスト44で、その選択された構成要素パーツを、参照関数の構成要素パーツの参照データベース46と比較することができる。一致が検出された(すなわち、ハッシュ値が等しい)場合、ステップ48で、それを記録することができ、選択された関数内の次の構成要素パーツを選択し、テスト50が関数内により多くの構成要素パーツがあることを示す場合(すなわち、テスト50=「Yes」)、ステップ42を繰り返すことによって、プロセスが続行する。選択された関数が参照データベース22内の参照関数と一致する場合、ステップ42〜50までの構成要素パーツの一致分析を実行する必要はないことに留意されたい。関数のすべての構成要素パーツがいったん分析され、分析すべき関数がさらにある場合(すなわち、テスト32=「Yes」)、プロセスは戻ってコードの次の関数ブロックを選択し、ステップ18または19を繰り返す。この結合された実施形態において、前処理、ステップ10〜14および40〜42、および結果のその提示、ステップ34、56は、図1〜2および図6〜7を参照して上述したプロセスを実施する。この結合された実施形態では、ソフトウェアのバイナリイメージの単一の分析で、完全な関数の一致および関数のコピーの可能性の両方を検出することができる。
【００５７】
図8に示した実施形態の別の代替では、ステップ42で、関数が参照関数のハッシュデータベース24における関数に一致しない場合(すなわち、テスト21=「No」)、関数内の演算ブロックまたは構成要素パーツを識別するプロセスのみを実行することができる。この代替実施形態では、ステップ40は、ステップ42のすぐ前に実行され、ステップ19で選択された関数に限定される。そうでない場合、本実施形態の処理は、図8を参照して上述したものと実質的に同じように先行する。
【００５８】
様々な実施形態には、いくつかの有用な用途があり得る。上述したように、ある用途は、既知のバグまたは古いソフトウェアモジュールを含まないことを確認するためにリリース前にバイナリイメージを選別するためのものである。コードが実行可能なバイナリイメージにコンパイルされ、変換された後にこの処理を達成することができるので、このチェックは、ソフトウェアソースの追跡またはバイナリイメージの内容を追跡するために使用される他の高価な方法に依存しない。別の用途では、運用上の問題を診断したり、特定のバイナリイメージ内のバグのソースを決定するために、特定の関数またはソフトウェアモジュールを認識するためにこうした方法を使用することを伴う。別の用途は、パブリックリソースのソフトウェアまたはライセンスが入手できないソフトウェアなど、サードパーティによって書かれた関数またはソフトウェアモジュールをバイナリイメージが含んでいないことを確認するための方法の使用である。また、上述したように、こうした方法は、ソフトウェアまたは関数の不正コピーを検出するために使用することができる。この点で、こうした方法は、さらなる分析が適当であり得るコピーされた関数を含み得るソフトウェアを識別するための選別ツールとして使用することができる。
【００５９】
既知の関数のイメージの参照データベース22は、図1および図2を参照して上述した同じ前処理ステップを使用して生成することができる。図9に示すように、参照データベース22に追加すべき実行可能な関数のバイナリイメージは、例えば有形の記憶媒体の形(例えば、CD、DVD、または外付けハードドライブ)で、またはネットワークを介してなど、ステップ60で、処理中のコンピュータによって受信され得る。この受信された関数は、分析中のバイナリイメージに出現し得る形と似た実行可能なコンパイル済みの形式にする必要がある。バイナリイメージは、コンパイラによって異なる場合があるため、一実施形態では、遭遇し得るある範囲のバイナリイメージを生成するために、関数を、様々なコンパイラブランドおよびコンパイラバージョンでコンパイルすることができる。次いで、図1を参照して上述したステップ12と同様の方法を使用して、ステップ62で、レジスタおよびメモリアドレスの参照を正規化するために、受信された各関数のバイナリイメージが分析される。アドレスおよびレジスタが設定される正規化の値は、例えば、すべてのアドレスをゼロに設定するなど、バイナリイメージを分析するのに使用されるものと同じである必要がある。図7に示すように、ステップ41を参照して上述したように、分析において分岐アドレスが正規化されている場合、受信された関数は、オプションのステップ64で、その分岐アドレスを正規化することも必要である。ハッシュ値を比較することによって、関数の内容についてバイナリイメージを分析する場合、オプションのステップ66で、そのハッシュ値を生成するために、ハッシュアルゴリズムが正規化された関数に適用される。最後に、ステップ68で、正規化されたコードまたはハッシュ値が参照データベースに格納される。この参照データベースは、任意の周知のデータ構造を使用して構成することができ、一致が検出された場合、一致する関数を容易に識別できるように、特定の関数の識別子(ID)を含むことができる。
【００６０】
関数の構成要素パーツの参照データベースを、同様の方法で生成することができる。図10に示すように、参照データベースに格納すべき関数のバイナリイメージは、ステップ70で、上記の形式のいずれかでコンピュータで受信することができる。バイナリイメージは、コンパイラによって異なる場合があるため、一実施形態では、関数は、遭遇し得るある範囲のバイナリイメージを生成するために、様々なコンパイラブランドおよびコンパイラバージョンでコンパイルすることができる。次いで、受信された関数のバイナリイメージは、ステップ72で、メモリレジスタおよびメモリアドレスの参照を正規化し、ステップ74で、受信された関数内で構成要素パーツまたは演算ブロックの境界を識別するために前処理される。構成要素パーツが識別された状態で、ステップ76で、コードの最初の構成要素パーツのブロックが選択される。ステップ78で、ステップ80で構成要素のハッシュデータベースに格納されるそのハッシュ値を生成するために、コードの選択された構成要素パーツのブロックに、ハッシュアルゴリズムが適用される。このデータベースは、周知の任意のデータ構造を使用して構成することができ、また、一致が検出された場合、一致する関数および構成要素パーツを容易に識別できるように、特定の関数および構成要素パーツのIDを含むことができる。テスト82で、別の構成要素パーツまたは演算ブロックが関数内にあるかどうかを決定し、そうである場合、コードの次の構成要素パーツのブロックを選択して、ハッシュデータベースに格納するためのハッシュ値を生成して、ステップ76、78、および80を繰り返すことによってプロセスが続行し得る。すべてのパーツがいったん処理されると(すなわち、テスト82=「No」)、この関数の処理が完了する。
【００６１】
参照データベース22、24、46、47は、一度に1つの関数ごとに構築することができるが、全ソフトウェアのバイナリイメージをロードすることもでき、この場合、図9および図10に示した処理は、図1、4、および5を参照して上述したように、ステップ14で、関数を識別するステップを含む。このように、図9および10に示した方法を実行するように構成されているコンピュータにそれらを連続して提供することによってリリースされているすべてのソフトウェアのバイナリイメージについて、ライブラリを迅速に生成することができる。
【００６２】
それらがリリースに向けて承認されるとき、新しい関数のイメージを格納することによって、参照関数および参照関数の構成要素パーツのライブラリのデータベースを生成することができる。この方法で、データベースを、ユーザの会社によってすべてのソフトウェアのリリースを反映するために時間をかけて構築することができる。
【００６３】
様々な異なる参照データベースが生成され、実施態様の方法の様々な使用をサポートするために使用され得る。例えば、ある参照データベースは、それらがこうした既知の問題を含んでいないことを確認するために、既知のバグを有する関数のバイナリイメージのみを、選別ソフトウェアリリースで使用するために含み得る。別の参照データベースは、不正コピーを検出するために他社によってリリースされた選別ソフトウェアを選別するのに使用するために、ある会社の承認されたソフトウェアリリースをすべて含み得る。さらなる参照データベースは、古いソフトウェアモジュールを含まないことを確認するために、ソフトウェアリリースを選別するのに使用するためにすべての古い関数のイメージを含む場合がある。
【００６４】
上述の実施形態は、図11に示すパーソナルコンピュータ160上に実装されてもよい。こうしたパーソナルコンピュータ160は通常、揮発性メモリ162およびディスクドライブ163などの大容量の不揮発性メモリに結合されたプロセッサ161を含む。コンピュータ180は、プロセッサ161に結合されるフロッピー（登録商標）ディスクドライブ164およびCD/DVDドライブ165も含み得る。通常、コンピュータ160は、キーボード166およびディスプレイ137のようなユーザ入力デバイスも含む。コンピュータ160は、ユニバーサルシリアルバス(USB)ポート(図示せず)など、プロセッサ161に結合された外部メモリデバイスを受信するためのいくつかのコネクタポート、およびプロセッサ161をネットワークに結合するためのネットワーク接続回路(図示せず)を含むこともできる。
【００６５】
様々な実施形態は、記載した方法のうちの1つまたは複数を実施するように構成されたソフトウェア命令を実行するコンピュータプロセッサ161によって実装され得る。こうしたソフトウェア命令は、別個のアプリケーション、または実施形態の方法を実施するコンパイルされたソフトウェアとしてメモリ162、163に格納され得る。参照データベースは、内部メモリ162内に、ハードディスクメモリ164に、有形の記憶媒体上に、またはネットワーク(図示せず)を介してアクセス可能なサーバ上に格納され得る。さらに、ソフトウェア命令およびデータベースは、ランダムアクセスメモリ162、ハードディスクメモリl63、フロッピー（登録商標）ディスク(フロッピー（登録商標）ディスクドライブ164で読み取り可能)、コンパクトディスク(CDドライブ165で読み取り可能)、読み取り専用メモリ、フラッシュメモリ、電気的に消去可能プログラム可能読み取り専用メモリ(EEPROM)、および/またはコンピュータ160にプラグインされたメモリモジュール(図示せず)、例えば外部メモリチップまたはUSB接続可能外部メモリ(例えば「フラッシュドライブ」)など、任意の形の有形のプロセッサ可読メモリに格納され得る。
【００６６】
本明細書に開示された実施形態との関連で説明されている様々な例示的な論理ブロック、モジュール、回路、およびアルゴリズムのステップは、電子ハードウェア、コンピュータソフトウェア、またはその両方の組み合わせとして実装され得ることを、当業者であれば理解されよう。ハードウェアとソフトウェアのこの互換性を明確に示すために、様々な例示の構成要素、ブロック、モジュール、回路、およびステップは、それらの機能に関して一般的に上記に記載されている。こうした機能がハードウェアとして実装されるかソフトウェアとして実装されるかは、特定のアプリケーションおよびシステム全体に課せられた設計の制約に依存する。当業者であれば、各特定の用途について様々な方法で説明する機能を実装することができるが、こうした実装の決定は、本発明の範囲からの逸脱を引き起こすものと解釈されないものとする。
【００６７】
上記で説明した、および図面に示した方法のステップの順序は、例示の目的にすぎず、いくつかのステップの順序は、本発明および特許請求の範囲の意図および範囲から逸脱することなく、本明細書に記載したものから変更されてもよい。本明細書に開示した実施形態との関連で説明した方法またはアルゴリズムのステップは、ハードウェア、プロセッサによって実行されるソフトウェアモジュール、または2つの組み合わせで直接具体化され得る。ソフトウェアモジュールは、RAMメモリ、フラッシュメモリ、ROMメモリ、EPROMメモリ、EEPROMメモリ、レジスタ、ハードディスク、取り外し式ディスク、CD-ROM、または当分野で既知の任意の他の形の記憶媒体のいずれかとすることができるプロセッサ可読メモリにあり得る。例示的な記憶媒体は、プロセッサが記憶媒体から情報を読み取り、記憶媒体に情報を書き込むことができるようにプロセッサに結合されている。代替では、記憶媒体は、プロセッサと一体化されてもよい。プロセッサおよび記憶媒体はASICに存在していてもよい。ASICは、ユーザ端末またはモバイルデバイスにあってもよい。代替では、プロセッサおよび記憶媒体は、ユーザ端末またはモバイルデバイス内の個別の構成要素として存在していてもよい。さらに、いくつかの態様では、方法またはアルゴリズムのステップおよび/または作用は、コンピュータプログラム製品に組み込むことができる機械可読媒体および/またはコンピュータ可読媒体上のコードおよび/または命令のうちの1つまたは任意の組み合わせまたはセットとして存在し得る。
【００６８】
様々な実施形態の上記の説明は、当業者が本発明を作成し、または使用するために提供されている。これらの実施形態に対する様々な変更は、当業者にとっては容易に明らかであり、本明細書で定義される一般的な原理は、本発明の意図または範囲から逸脱することなく他の実施形態に適用することができる。したがって、本発明は、本明細書に示された実施形態に限定されることは意図されておらず、代わりに特許請求の範囲は、本明細書に開示された原理および新規の特徴と一致する最も広い範囲が与えられるものとする。
【符号の説明】
【００６９】
22  参照関数データベース
24  ハッシュデータベース
46  参照データベース
47  ハッシュデータベース
【図１】
2012525648.tif 000003
【図２】
2012525648.tif 000004
【図３】
2012525648.tif 000005
【図４】
2012525648.tif 000006
【図５】
2012525648.tif 000007
【図６】
2012525648.tif 000008
【図７】
2012525648.tif 000009
【図８】
2012525648.tif 000010
【図９】
2012525648.tif 000011
【図１０】
2012525648.tif 000012
【図１１】
2012525648.tif 000013
【国際調査報告】
2012525648.tif 000014
2012525648.tif 000015
2012525648.tif 000016