0

プロセスで例外を処理するために SetUnhandledExceptionFilter を試みています。

  1. SetUnhandledExceptionFilter をメモリ内の関数割り当て (PAGE_EXECUTE_READWRITE を使用した VirtualAlloc) に設定します。
  2. 他のメモリ内の他の関数がクラッシュし、Windows がメモリ内の例外ハンドルを呼び出すようにします。

それはWin32で機能しますが、Win64でビルドするとクラッシュしますが、WindowsはSetUnhandledExceptionFilterで設定された関数を呼び出しません

#include <iostream>
#include <windows.h>

using namespace std;

LONG WINAPI OurSetUnhandledExceptionFilter(EXCEPTION_POINTERS * ExceptionInfo)
{
    cout << "Gotcha!" << endl;
    Sleep(-1);
    return EXCEPTION_CONTINUE_EXECUTION;
}

void Exception()
{
    SetUnhandledExceptionFilter((LPTOP_LEVEL_EXCEPTION_FILTER)OurSetUnhandledExceptionFilter);
    MessageBox(0, TEXT("Exception"), 0, 0);
}

typedef void (*fException)(void);

DWORD WINAPI xf(LPVOID x)
{
    fException a = (fException)x;
    a();//Call fException

    //Crash
    char *p = 0;
    p[1] = 0;//<-

    return 0;
}

int main()
{
    LPVOID nef = VirtualAlloc(0, (INT64)main - (INT64)xf, MEM_COMMIT|MEM_RESERVE, PAGE_EXECUTE_READWRITE);
    memcpy(nef, xf, (INT64)main - (INT64)xf);
    CreateThread(0, 0, (LPTHREAD_START_ROUTINE)nef, Exception, 0, 0);
    Sleep(-1);
    return 0;
}
4

0 に答える 0