Где внутри закачанной DLL зациклить? - PullRequest
1 голос
/ 21 июня 2009

Итак, у меня есть приложение, которое запускает другое приложение с моей внедренной DLL (с ​​помощью Detours). Точка входа - 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);

Функция стартера экспортирована из внешнего C и выглядит хорошо проверенной (порядковый номер 1).

Я понятия не имею, что может быть не так, и просто надеюсь, что кто-то там имел опыт работы с этой темой и сбоем.

Вот код DLL:

//Hook.h
extern "C"
{
    void __declspec(dllexport) Starter(void);
}

//Hook.cpp
void Starter(void)
{

}

Спасибо

1 Ответ

1 голос
/ 21 июня 2009

Вы не можете сделать это таким образом, потому что DLL внедряется в другой процесс, и вы пытаетесь выполнить функцию в адресном пространстве вашего процесса перехвата.

Что вам нужноdo вызывает CreateRemoteThread , передавая адрес, полученный из GetProcAddress, в параметре lpStartAddress.Это создаст новый поток в удаленном процессе и выполнит функцию в адресном пространстве этого процесса в контексте нового потока.

Кстати, технически вы должны быть в состоянии создать новый поток вDllMain / DLL_PROCESS_ATTACH, если вы не выполняете синхронизацию с другими потоками, хотя это не рекомендуется.Я не уверен, какие проблемы могут возникнуть, если делать это во время инъекции DLL.

...