7

メインの現在のスタックのチェックサムを作成して、2つのポイント間で変更されているかどうかを確認したいと思います。

例えば:

int main(void) {
    ...
    stack_checksum();

    ... process ...

    if(stack_checksum() != ...)
        altered.
}

スタックの最上位のベーススタックアドレスと現在のアドレスを取得するにはどうすればよいですか?

編集: @MiroslavBajtošの助けを借りて、アプローチのステップ:

  • ローカル変数を構造体に入れる
  • バックトレースリターン配列を確認してください
4

2 に答える 2

6

使用している標準ライブラリのコンパイラ/実装によって異なります。

gcc (または glibc を使用するその他のコンパイラ) の場合、backtrace()関数を使用できますexecinfo.h。詳細については、これらの回答を参照してください: gcc C++ アプリがクラッシュしたときにスタックトレースを生成する方法と、より詳細なバックトレースを取得する方法

Microsoft コンパイラの場合、StackWalk64()関数を使用できます。詳細については、次の記事を参照してください: Walking-the-callstack。StackOverflow でも同様の質問がありました: StackWalk64 on Windows - Get symbol name

スタックを調べることができれば、チェックサムの計算は簡単です。

于 2013-01-13T17:45:24.937 に答える
3

これにはインラインアセンブリを使用する必要があると思います。次のコードは、ベース ポインターと現在のポインターの現在の値を と に格納しbaseますcurrentgcc64ビットマシン用です:

// make these variables global (if not, the stack registers would change)
void *base, *current;
__asm__("movq %%rbp, %0;"
        "movq %%rsp, %1;"
        : "=r"(base), "=r"(current)
        :
        :
);

32 ビット マシンを使用している場合は、 ebpandespの代わりにandrbprsp使用する必要があります。構文について質問がある場合は、このgcc のインライン アセンブリ チュートリアル を確認することをお勧めします。movlmovq

于 2013-01-13T17:52:50.193 に答える