CreateProcessWithDLLEx-Hooked 进程启动但无法恢复
Posted
技术标签:
【中文标题】CreateProcessWithDLLEx-Hooked 进程启动但无法恢复【英文标题】:CreateProcessWithDLLEx-Hooked process starts but can't resume 【发布时间】:2012-07-22 19:42:18 【问题描述】:我正在尝试使用 microsoft detours 获得一个基本的钩子。我的程序能够成功运行 CreateProcessWithDllEx 并注入一个 dll。但是,我似乎无法恢复实际的挂钩程序。我正在使用记事本进行测试,我可以看到notepad.exe 在我的进程列表中运行,但记事本窗口实际上并没有出现。
我的dll如下:
#undef UNICODE
#include <cstdio>
#include <windows.h>
#include <detours.h>
#pragma comment(lib, "detours.lib")
typedef void (WINAPI *pFunc)(void);
DWORD WINAPI MyFunc(void);
pFunc FuncToDetour = (pFunc)DetourFindFunction("Winmm.dll", "timeGetTime"); //Set it at address to detour in
//the process
extern "C" __declspec( dllexport )VOID NullExport( VOID )
INT APIENTRY DllMain(HMODULE hDLL, DWORD Reason, LPVOID Reserved)
switch(Reason)
case DLL_PROCESS_ATTACH:
DisableThreadLibraryCalls(hDLL);
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
//DetourAttach(&(PVOID&)FuncToDetour, MyFunc);
//DetourTransactionCommit();
break;
case DLL_PROCESS_DETACH:
DetourTransactionBegin();
DetourUpdateThread(GetCurrentThread());
DetourDetach(&(PVOID&)FuncToDetour, MyFunc);
DetourTransactionCommit();
break;
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
break;
return TRUE;
DWORD WINAPI MyFunc()
return 0;
而我的喷油器如下:
#undef _UNICODE
#include "stdafx.h"
#include <cstdio>
#include <windows.h>
#include <detours.h>
int main()
STARTUPINFO si;
PROCESS_INFORMATION pi;
ZeroMemory(&si, sizeof(STARTUPINFO));
ZeroMemory(&pi, sizeof(PROCESS_INFORMATION));
si.cb = sizeof(STARTUPINFO);
WCHAR DirPath[MAX_PATH+1];
wcscpy_s(DirPath, MAX_PATH, L"C:\\Documents and Settings\\Administrator\\My Documents\\Visual Studio 2010\\Projects\\hbotinjector\\Release");
char DLLPath[MAX_PATH+1] = "C:\\Documents and Settings\\Administrator\\My Documents\\Visual Studio 2010\\Projects\\hbotinjector\\Release\\hbotdll.dll";
WCHAR EXE[MAX_PATH+1]=0;
wcscpy_s( EXE, MAX_PATH, L"C:\\Documents and Settings\\Administrator\\My Documents\\Visual Studio 2010\\Projects\\hbotinjector\\Release\\notepad.exe" );
STARTUPINFO _StartupInfo;
PROCESS_INFORMATION _Information;
ZeroMemory( &_Information, sizeof( PROCESS_INFORMATION ) );
if(DetourCreateProcessWithDllEx( EXE, NULL, NULL, NULL, TRUE,
CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, DirPath, &_StartupInfo, &_Information,
DLLPath, NULL ))
MessageBoxA(NULL,"INJECTED", NULL, NULL);
ResumeThread(_Information.hThread);
WaitForSingleObject(_Information.hProcess, INFINITE);
else
char error[100];
sprintf(error, "%d", GetLastError());
MessageBoxA(NULL, error, NULL, NULL);
return 0;
我使用 .def 文件构建我的 dll,确保在序号 1 处有所需的函数,以便绕道正常工作:
LIBRARY HBOTDLL
EXPORTS
NullExport @1
有谁知道是什么原因导致进程无法运行?附带说明一下,我也尝试了一个空白 dll,它只包含序号 1 处所需的函数,没有其他内容,它似乎具有相同的结果。
此外,只要 notepad.exe 进程显示在进程列表中,我的注入器就会永远运行。这是对 WaitForSingleObject 的响应,这似乎表明进程已正确生成。
【问题讨论】:
ZeroMemory( &_Information, sizeof( PROCESS_INFORMATION ) );
没有。看看代码开头是如何正确完成的,si 变量。
你就是那个男人。我不确定为什么我声明了同一组结构的两个不同版本。但是通过使用最初声明的结构解决了问题:并将调用更改为: if(DetourCreateProcessWithDllEx( EXE, NULL, NULL, NULL, TRUE, CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, DirPath, &si, &pi, DLLPath, NULL ))
【参考方案1】:
在 Hans Passant 的评论中,我回过头来意识到我已经声明了 pi 和 si 以及 _Information 和 _StartupInfo。我没有将我创建的第二组归零,那是我正在使用的组。所以我改变了对 CreateProcessWithDllEx 的调用以使用 &pi 和 &si。现在一切正常。
【讨论】:
以上是关于CreateProcessWithDLLEx-Hooked 进程启动但无法恢复的主要内容,如果未能解决你的问题,请参考以下文章