在绕行ShellExecuteEx时遇到问题,知道吗?

时间:2019-06-11 21:34:58

标签: c++ hook detours shellexecuteex

我有一个进程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 :(得分:0)

如果要挂接子进程,则应该绕开CreateProcess()而不是ShellExecuteEx(),这将在需要创建新进程时在内部调用CreateProcess()

无论如何,您的d_ShellExecuteExW()钩子的签名缺少必需的__stdcall调用约定,该约定由WINAPI中存在的t_ShellExecuteExW宏包装类型。

更改此:

BOOL d_ShellExecuteExW(SHELLEXECUTEINFOW *pExecInfo)`

对此:

BOOL WINAPI d_ShellExecuteExW(SHELLEXECUTEINFOW *pExecInfo)