Pregunta

Así que tengo una aplicación que inicia otra aplicación con mi DLL inyectada (con desvíos). El punto de entrada es DllMain. No puedo hacer mucho desde DllMain, y ciertamente no puedo repetir. Entonces, ¿cómo llamo a las funciones de mi monitor DLL cada x segundos? Leí que no puedes crear un hilo desde DllMain (al menos hasta que regrese) y es cierto porque me ha fallado. Así que intenté crearlo en el evento adjuntar hilo y me bloqueó. Entonces, ahora lo que intento hacer es inyectarlo nuevamente (en caso de que Detours falle) para que pueda obtener el controlador del módulo. Luego obtengo la dirección de una función de inicializador que crea mi hilo. Me sale bien el módulo, pero no creo que pueda obtener la dirección de la función. Hice la función vacía, y todavía me bloqueó. Por lo tanto, ni siquiera llega a llamar a la función. Visual Studio dijo que no tengo acceso de lectura.

Entonces, ¿qué se supone que debo hacer? ¿Qué haces para repetir tus funciones de DLL cuando no eres el propietario del programa adjunto (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);

La función Starter se exporta en C externa y se ve bien inspeccionada (es el ordinal 1).

No tengo idea de qué podría estar mal, y simplemente espero que alguien haya tenido experiencia con este tema y se haya bloqueado.

Aquí está el código DLL:

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

//Hook.cpp
void Starter(void)
{

}

Gracias

¿Fue útil?

Solución

No puede hacerlo de esa manera porque la DLL se inyecta en un proceso diferente y está intentando ejecutar la función en el espacio de direcciones de su proceso de enlace.

Lo que tendrá que hacer es llamar a CreateRemoteThread , pasando la dirección que obtiene de GetProcAddress en el parámetro lpStartAddress. Esto creará un nuevo hilo en el proceso remoto y ejecutará la función en el espacio de direcciones de ese proceso, en el contexto del nuevo hilo.

Por cierto, técnicamente debería poder crear un nuevo hilo en DllMain / DLL_PROCESS_ATTACH, siempre que no esté sincronizando con otros hilos, aunque no es recomendable. Sin embargo, no estoy seguro de qué problemas podrían existir si se hace esto cuando se inyecta la DLL.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top