2

したがって、プログラムのレジスタにアクセスできると仮定します。私はesp、ebp、eipにアクセスできます。eipは実行する必要のある次の命令を指しており、ebpは別のフレームポインターを指しており、espはスタックの最上位を指しています。私はこれを理解していますが、スタックの残りの部分やそれを解析する方法を理解していません。

たとえば、フレームのローカル変数を取得したい場合は、減算して(それがよりも大きいアドレスであるebp - espことを知っている)、それらのアドレスを調べて逆参照する必要がありますか?これは、その特定のフレームからローカル変数を取得するための適切な方法ですか?ebpesp

別の質問ですが、どの機能が各フレームに関連しているかを把握するための最良の方法は何でしょうか?アドレスから1を減算し、ebpその値を逆参照する場合、リターンアドレス「0x804 ...」を取得する必要がありますか?このアドレスと機能の関係は何ですか?たとえば、Foo()のPCアドレスが高く、PCアドレスが0x8045555低い場合0x8045550、これらのアドレスの間にある差出人住所はありますか?

事前に感謝し、私が十分に明確でなかった場合は私に知らせてください。

注:誰かがより良いタイトルを持っている場合、それを提案しますが、私はより良いタイトルを見つけられませんでした。

4

2 に答える 2

1

レジスタとスタックにあるデータは、単なる一連のバイトです。データは、バイトをシリーズに入れるさまざまな命令とアプリケーションによって構造化されますが、バイトの構造に関する情報は、一連のバイトの一部ではなく、利用できる場合と利用できない場合がある追加情報です。

たとえば、ソース コードがコンパイルされ、バイナリ コードがコンパイラによって生成されると、バイナリ コードに追加の説明情報が含まれます。追加の説明情報の量は、選択したコンパイラ オプションと、使用するツール チェーン内の他のさまざまなツールの機能によって異なります。

たとえば、関数名などの追加情報を使用してデバッグ ビルドを作成するオプションがあり、ツール チェーンが追加情報を使用したバイナリ コードの表示をサポートしている場合、変数、関数名、およびステッピングを適切に表示できます。ソース コード レベルでのコードを通じて。

一方、オプションが追加情報なしで最適化されたビルドを作成することである場合、ツールチェーンは追加情報を使用してバイナリコードの表示をサポートし、より人間が読めるビューでバイナリコードを表示することをサポートしている可能性があります。そこにないと、ツール チェーンは、ソース、変数、関数名などの行を示すソース コード レベルでバイナリ コードを表示できません。

したがって、やりたいことを達成するには、バイナリ コードと追加情報を組み合わせることができるように、追加情報が必要です。追加情報がなければ、メモリ内には大量のバイトしかありません。これらのバイトは、アセンブラ コードとして解釈するか、テキスト文字列として解釈するなど、さまざまな方法で表示できます。ただし、追加情報がなければ、あなたは推測をしているだけです。

プラットフォームやオペレーティング システムが異なれば、コンパイラやツール チェーンが異なれば、さまざまなタイプの追加情報が生成されます。そのため、ツール チェーンによって提供される特定の情報に関する情報が必要になります。

于 2012-11-08T02:16:56.920 に答える
1

この詳細は、CPU 命令セット アーキテクチャ (明らかに 32 ビット x86 を使用している) とコンパイラ ツールチェーン (推測できません) によって異なります。一般に、スタック フレームをウォークするコードを自分で書き直すことは望ましくありません。これは、複雑で壊れやすく、コンパイラの最適化とデバッグの設定に依存するためです。

プログラムをデバッグしようとしている場合は、プラットフォームのデバッガーにスタックの整理を試みることから始める必要があります。たとえば、 を使用してgdb実行btすると、「バックトレース」を取得できます。

問題のプログラム内からこれを実行しようとしていて、GNU C ライブラリを使用している場合は、backtrace(3)関数を使用できます。

物事が実際にどのように機能するかを理解したい場合は、次のブログ投稿が役立ちます: http://eli.thegreenplace.net/2011/02/04/where-the-top-of-the-stack-is-on-x86 /

理解を深めるには、Wikipedia のx86 Calling Conventionsの記事を試してください。さらに深く掘り下げるには、Linux のような ELF ベースのアーキテクチャを使用している場合は、ELF ABI 仕様を参照してください。

于 2012-11-08T02:00:47.670 に答える