3

C ファイルで定義された変数のサイズは、コンパイル後のコードに相当するアセンブリのどこに表示されますか?

最初のコードが次のようになっていると想像してください。

char buffer[2];
char a[3];

次のコードは次のとおりです。

char buffer[3];
char a[2];

ここで、「buffer」と「a」は関数のローカル変数です。

どちらの場合も、esp関数に入ると同じバイト数だけ削減されますが、ソース コードにアクセスできず、バイナリを逆アセンブルするだけの場合、境界を区別する方法はありますか?

変数のサイズを追跡するセグメントがバイナリにあるかどうか疑問に思っています。

4

3 に答える 3

4

私の知る限り、この状況で判断する唯一の方法は、スタックがどのように使用されているかを見ることです。

コードがアセンブリにコンパイルされると、型情報は実際には保持されません。推測できるのは、使用されているアセンブリ命令の型だけです (ビット、ワード、ダブルワードなどで動作するかどうか)。

IDA Pro には、C 機能への逆アセンブル機能があり、通常はほとんど正確です。ほとんどの場合、C を動作させることはありませんが、ASM の高速分析では非常に強力です。それが行うことの1つは配列のサイズを見つけることですが、多くの場合、配列はバイト(または文字)配列としてのみ型付けされるため、コードを分析して正確にどのように使用されているかを確認する必要がある場合があります.

于 2013-02-21T13:23:00.203 に答える
1

変数のサイズを追跡するセグメントがバイナリにあるかどうか疑問に思っています。

いいえ、ありません。

せいぜい、変数の相対オフセットと、割り当てられた合計スタックを見つけることができます。

于 2013-02-21T13:23:55.563 に答える
0

通常、それは別のファイルに入れられます (または、より一般的にはどこにもありません) が、このようなデバッグ情報はバイナリに保持される場合があります。もちろん、それに頼ることはできませんが、バイナリの生成を制御できる場合は、そこに情報を配置することができます。

于 2013-02-21T13:29:38.790 に答える