Где внутри вложенной DLL зациклиться?

Итак, у меня есть приложение, которое запускает другое приложение с моей внедренной 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)
{

}

Спасибо


person Eric Muyser    schedule 21.06.2009    source источник


Ответы (1)


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

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

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

person Gerald    schedule 21.06.2009