-1

我有一个进程 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);
    }
}
4

1 回答 1

0

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

在任何情况下,您的d_ShellExecuteExW()钩子的签名都缺少所需的__stdcall调用约定,该约定由您的类型WINAPI中存在的宏包装。t_ShellExecuteExW

改变这个:

BOOL d_ShellExecuteExW(SHELLEXECUTEINFOW *pExecInfo)`

对此:

BOOL WINAPI d_ShellExecuteExW(SHELLEXECUTEINFOW *pExecInfo)
于 2019-06-12T08:32:04.167 回答