1

プログラムから強制的にコアダンプを取得したい (または他の方法で特定の時間にそのメモリを確認したい)。ただし、いくつかの問題があります。

  • wine で実行しています (アプリケーションが検出するため、winedbg 経由では実行できません)
  • アプリケーションは、非標準イベントをキャプチャする例外/SEH/その他のハンドラーを使用します
  • strace をアタッチしても、プログラムが動作しなくなります
  • ぶらぶらしたいので、印刷できる特定の領域はありません
  • うーん...ソースがありません

コードを両方に変更してみました:

xor eax, eax
call eax

そして、実際の命令ではないいくつかのランダムなもの-SEHが起動してアプリケーションを救出したときの両方。

どうすれば情報を入手できますか? 特定の時間のメモリ イメージが必要で、それが発生した正確な場所にパッチを適用できます。

4

2 に答える 2

3

wine のソース コードにアクセスできるので、wine SEH コードやIsDebuggerPresent()関数の実装を変更することをお勧めします。

もう 1 つのオプションは、SIGSTOP シグナルを発生させてアプリケーション自体を一時停止するように変更することです。Wine の Windows アプリケーションは引き続き を呼び出すことint $0x80で Linux API にアクセスできるため、次のようなコードを挿入できます。

mov %eax, $20  ;; sys_getpid
int $0x80
mov %ebx, %eax ;; load pid parameter
mov %eax, $37  ;; sys_kill
mov %ecx, $19  ;; sig = SIGSTOP
int $0x80      ;; after executing this instruction, execution will halt

次に、プロセスのメモリを読み取り、そのコマンドをmmapアタッチして使用することもできます。代わりに、これを単純に発生させるか、その場でコアダンプをトリガーする何かに変更することもできます(wine にハンドラーがインストールされていないと仮定しますが、適切なシステムコールも同様に克服できます)。/proc/(pid)/memgdbgenerate-core-fileSIGQUITSIGQUIT

于 2010-08-29T04:27:43.503 に答える
0

MSVCのようにやってみてください。アプリケーションの例外ハンドラをバイパスする UnhandledExceptionFilter を直接呼び出します。gs_report.c から (一部の #ifdef は省略):

/* Make sure any filter already in place is deleted. */
SetUnhandledExceptionFilter(NULL);
UnhandledExceptionFilter((EXCEPTION_POINTERS *)&GS_ExceptionPointers);
TerminateProcess(GetCurrentProcess(), STATUS_STACK_BUFFER_OVERRUN);

もう 1 つの可能性は、空のハンドラーをリストの先頭に置くことです。このようなもの:

#include <stdio.h>
#include <excpt.h>
#include <intrin.h>
int main()
{
  __try
  {
    __writefsdword(0, -1); // put chain end marker (-1) in fs:0
    *(int*)9 = 0;          // trigger the exception
  }
  __except( EXCEPTION_EXECUTE_HANDLER )
  {
    printf("Exception!\n");  // this does not appear
  }
}

編集:申し訳ありませんが、今まで「ソースを持っていない」ことに気づきませんでした。しかし、コードにパッチを当てることができれば、おそらく "mov fs:[0], -1" を追加できます。

于 2010-08-30T09:35:55.000 に答える