1

これは簡単なプログラムです。x86_64 用に生成されたアセンブリと C ソース コードを貼り付けました。

int main()
{
  4004b4:   55                      push   %rbp
  4004b5:   48 89 e5                mov    %rsp,%rbp
    int array[10];

    array[0] = 5;
  4004b8:   c7 45 d0 05 00 00 00    movl   $0x5,-0x30(%rbp)

    return 0;
  4004bf:   b8 00 00 00 00          mov    $0x0,%eax
}

IDA-pro や dcc などのプログラム逆コンパイル ツールについては知っていますが、それらのプログラムが配列境界などの詳細をどのように把握できるかはわかりません。より一般的には、アセンブリだけを見て、

movl $0x5,-0x30(%rbp)実際に操作int array[10]ですか?-gプログラムがデバッグ情報でコンパイルされている場合、objdumpソースコードが表示され、それを理解できることがわかります。バイナリにデバッグの詳細がない場合、商用の逆コンパイラはどのようにこれを把握しますか?

4

1 に答える 1

0

あなたの例ではそれを理解できないと思います。その関数のコードが少なすぎます。

配列を複数回使用するより大きな関数である場合は、それを示すヒントが見つかるかもしれません。生成されたマシン コード全体で、ベース アドレス + 異なるオフセット ポップ インとアウトのように。

弱い仮定:

for (i = 0; i < 10; i++)
        array[i] = i * 2;

これにより、生成されたコードを見ることで、10 個の int の配列を扱っていると推測できます。

より強いケース:

int *array = NULL;
array = malloc(10 * sizeof *array);
if (array == NULL)
        return ENOMEM;
for (i = 0; i < 10; i++)
        array[i] = i * 2;

これにより、10 個の int の配列を扱っていることが確実になります。

あなたの場合、生の情報しかありません。関数はスタックに 10 * sizeof(int) バイトを割り当てました。(これは実際にはオプティマイザーにも依存しますが、それは別のトピックです)。

つまり、IDA のようなプログラムが可能な限り多くの信頼できる情報を提供するために使用するヒューリスティックとコード パターン認識アルゴリズムがすべてです。

あとはリバースの経験次第。

于 2012-08-07T18:23:36.890 に答える