绕道 ShellExecuteEx 时出现问题,有什么想法吗?

Problem at detouring ShellExecuteEx, Any Idea?

我有一个进程 X,我将我的 DLL 注入其中以绕过一些功能,并制作一些内存补丁。我需要绕道ShellExecuteEx(),因为这个进程运行其他进程,然后我也需要将我的DLL注入到子进程中。

我绕路的函数好像调用的很好,当我调用原来的函数时,它returns 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);
    }
}

如果你想挂钩子进程,你应该绕过 CreateProcess() 而不是 ShellExecuteEx(),它只会在需要创建新进程时在内部调用 CreateProcess()

在任何情况下,您的 d_ShellExecuteExW() 钩子的签名都缺少所需的 __stdcall 调用约定,它被 WINAPI 宏包装在您的 [=18] 中=] 类型。

改变这个:

BOOL d_ShellExecuteExW(SHELLEXECUTEINFOW *pExecInfo)`

为此:

BOOL WINAPI d_ShellExecuteExW(SHELLEXECUTEINFOW *pExecInfo)