绕道 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)
我有一个进程 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)