Проблема в обходе ShellExecuteEx, любая идея? - PullRequest
0 голосов
/ 12 июня 2019

У меня есть процесс X, в который я вливаю свою DLL, чтобы обойти некоторые функции и сделать некоторые исправления памяти.Мне нужно обойти ShellExecuteEx(), потому что этот процесс запускает другие процессы, а затем мне нужно также внедрить мою DLL в дочерние процессы.

Кажется, что моя обходная функция нормально вызывается, и когда я вызываюоригинальная функция, она возвращает TRUE.Но затем процесс, в который внедряется моя DLL, закрывается через несколько секунд, когда он вызывается (пока не было введено никакого дочернего процесса, так как я не кодировал его).Есть идеи почему?

static BOOL(WINAPI *t_ShellExecuteExW)(SHELLEXECUTEINFOW *pExecInfo) = ShellExecuteExW;

BOOL d_ShellExecuteExW(SHELLEXECUTEINFOW *pExecInfo)
{
    BOOL result;

    printf("ShellExecuteEx %ls \n", pExecInfo->lpFile);

    try
    {
        result = t_ShellExecuteExW(pExecInfo);
    }
    catch (const std::exception& e)
    {
        printf("Exception %s", e.what());
    }

    if (result)
        printf("Result True");
    else
        printf("Result False");

    return result;
}

void makeHooks()
{
    HMODULE module = LIBpatching_loadLibrary("shell32.dll", 10000);
    FARPROC address;

    if ((address = GetProcAddress(module, "ShellExecuteExW")) != nullptr)
    {
        printf("[shell32] [ShellExecuteExW] Address found\n");

        LIBpatching_hookFunction((PBYTE)address, (PBYTE)d_ShellExecuteExW);
    }
}

1 Ответ

0 голосов
/ 12 июня 2019

Если вы хотите подключить дочерние процессы, вам следует обойти CreateProcess() вместо ShellExecuteEx(), который просто вызовет CreateProcess() внутри, когда ему потребуется создать новый процесс.

В любом случае,в сигнатуре вашей d_ShellExecuteExW() ловушки отсутствует требуемое соглашение о вызовах __stdcall, заключенное в макрос WINAPI, который присутствует в вашем типе t_ShellExecuteExW.

Изменить это:

BOOL d_ShellExecuteExW(SHELLEXECUTEINFOW *pExecInfo)`

На это:

BOOL WINAPI d_ShellExecuteExW(SHELLEXECUTEINFOW *pExecInfo)
...