SEH с RtlAddFunctionTable в загружаемой вручную DLL - PullRequest
0 голосов
/ 05 октября 2019

Я вручную отображаю dll в процесс, который компилируется с (/ EHa). Это может поймать исключения, как показано ниже. Проблема в том, что, поскольку я вручную отображаю dll, исключения / функции не регистрируются, что приводит к сбою программы, как только происходит исключение. Чтобы решить эту проблему, я пришел к выводу, что мне нужно использовать эту функцию "RtlAddFunctionTable (...)". К сожалению, я не могу получить первые два параметра (FunctionTable и EntryCount) для вызова функции. Может кто-нибудь помочь мне и сказать, как я могу получить первые два параметра?

BOOL APIENTRY DllMain(HMODULE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
    RUNTIME_FUNCTION runtimeFunction = ?;
    DWORD size = ?;

    RtlAddFunctionTable(&runtimeFunction, size, (DWORD64)hModule);

    try
    {
        int var = *reinterpret_cast<int*>(0xFFFF);
    }
    catch (...) 
    {
        cout << "Exception" << endl;
    }

    return TRUE;
}

Редактировать, я решил:

bool EnableExceptions(DWORD64 moduleBase)
{
    PIMAGE_DOS_HEADER pDOSHeader;
    PIMAGE_NT_HEADERS pNTHeader;
    PIMAGE_OPTIONAL_HEADER pOptHeader;

    pDOSHeader = (PIMAGE_DOS_HEADER)moduleBase;
    if (pDOSHeader->e_magic != IMAGE_DOS_SIGNATURE)
        return false;

    pNTHeader = (PIMAGE_NT_HEADERS)((PBYTE)pDOSHeader + pDOSHeader->e_lfanew);
    if (pNTHeader->Signature != IMAGE_NT_SIGNATURE)
        return false;

    pOptHeader = (PIMAGE_OPTIONAL_HEADER)& pNTHeader->OptionalHeader;
    if (pOptHeader->Magic != IMAGE_NT_OPTIONAL_HDR_MAGIC)
        return false;

    PRUNTIME_FUNCTION pFunctionTable = (PRUNTIME_FUNCTION)((DWORD64)pOptHeader->DataDirectory[IMAGE_DIRECTORY_ENTRY_EXCEPTION].VirtualAddress + moduleBase);
    cout << "functionTable " << hex << functionTable << endl;

    DWORD sizeFunctionTable = (pOptHeader->DataDirectory[3].Size / (DWORD)sizeof(RUNTIME_FUNCTION));
    cout << "functionTableSize " << dec << functionTableSize << endl;

    BOOL success = RtlAddFunctionTable(pFunctionTable, sizeFunctionTable, moduleBase);
    cout << "RtlAddFunctionTable " << success << endl;

    return success;
}

1 Ответ

0 голосов
/ 06 октября 2019

Поскольку вы создаете .DLL с включенным SEH, необходимая информация уже должна быть в файле PE.

Согласно этой записи блога , статические таблицы в PE имеют приоритетнад динамически добавляемыми таблицами.

Если вам по какой-то причине нужно использовать пользовательскую таблицу, вам нужно использовать VirtualAlloc для выделения памяти для таблицы и кода, поскольку адреса являются относительными(РВА).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...