CreateProcessWithDLLEx-Hooked процесс запускается, но не может возобновиться
Я пытаюсь получить базовый хук, используя обход Microsoft. Моя программа может успешно запустить 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;
}
И я создаю свою dll с помощью файла.def, гарантируя, что в ординале 1 есть необходимая функция для правильной работы обходных путей:
LIBRARY HBOTDLL
EXPORTS
NullExport @1
Кто-нибудь знает, что вызывает процесс не работает? Как примечание, я попробовал это с пустым dll, где он просто содержит требуемую функцию с порядковым номером 1 и ничего больше, и, похоже, результаты идентичны.
Кроме того, мой инжектор работает вечно, пока процесс notepad.exe отображается в списке процессов. Это в ответ на WaitForSingleObject, который, кажется, указывает, что процесс был порожден правильно.
1 ответ
На комментарий Ханса Пассанта я вернулся и понял, что объявил pi и si, а также _Information и _StartupInfo. Я не обнулял вторую группу, которую я создал, и это была группа, которую я использовал. Поэтому я изменил вызов CreateProcessWithDllEx, чтобы использовать &pi и &si. Теперь все отлично работает.