Итак, у меня есть приложение, которое запускает другое приложение с моей внедренной DLL (с обходами). Точка входа — DllMain. Я мало что могу сделать из DllMain и уж точно не могу зацикливаться. Итак, как мне вызывать функции монитора DLL каждые x секунд? Я читал, что вы не можете создать поток из DllMain (по крайней мере, пока он не вернется), и это правда, потому что он разбил меня. Поэтому я попытался создать его в событии потока прикрепления, и это привело меня к сбою. Итак, теперь я пытаюсь ввести его снова (в случае сбоя Detours), чтобы я мог получить дескриптор модуля. Затем я получаю адрес функции инициализации, которая создает мой поток. Я отлично понимаю дескриптор модуля, но не думаю, что смогу получить адрес функции. Я сделал функцию пустой, и она все равно разбила меня. Так что до вызова функции дело даже не доходит. Visual Studio сказала, что у меня нет доступа для чтения.
Так что же мне делать? Что вы делаете, чтобы зациклить свои функции DLL, когда у вас нет прикрепленной программы (exe).
//Application.exe
STARTUPINFO si = {sizeof(STARTUPINFO)};
PROCESS_INFORMATION pi = {0};
DetourCreateProcessWithDll(filename, NULL, NULL, NULL, TRUE,
CREATE_DEFAULT_ERROR_MODE | CREATE_SUSPENDED, NULL, path,
&si, &pi, detoured, hook, NULL);
processID = pi.dwProcessId;
hDll = InjectDLL(processID, hook);
if(hDll != NULL)
{
STARTER Starter = (STARTER)GetProcAddress(hDll, "Starter");
if(Starter != NULL)
Starter();
}
ResumeThread(pi.hThread);
Функция Starter экспортируется из extern C и выглядит хорошо проверенной (это порядковый номер 1).
Я понятия не имею, что может быть не так, и просто надеюсь, что у кого-то есть опыт работы с этой темой и сбоем.
Вот код DLL:
//Hook.h
extern "C"
{
void __declspec(dllexport) Starter(void);
}
//Hook.cpp
void Starter(void)
{
}
Спасибо