我有一个进程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);
}
}
答案 0 :(得分:0)
如果要挂接子进程,则应该绕开CreateProcess()
而不是ShellExecuteEx()
,这将在需要创建新进程时在内部调用CreateProcess()
。
无论如何,您的d_ShellExecuteExW()
钩子的签名缺少必需的__stdcall
调用约定,该约定由WINAPI
中存在的t_ShellExecuteExW
宏包装类型。
更改此:
BOOL d_ShellExecuteExW(SHELLEXECUTEINFOW *pExecInfo)`
对此:
BOOL WINAPI d_ShellExecuteExW(SHELLEXECUTEINFOW *pExecInfo)