Programadores => General Programadores => Mensaje iniciado por: Julio0 en 11 de Junio de 2019, 05:00:35 am

Título: ayuda en c++
Publicado por: Julio0 en 11 de Junio de 2019, 05:00:35 am
esto es el codigo en el que estoy trabajando para dll pero nose si me falta una variable o algo porque cuando le doy a inyectar al momento de activarlo no funciona y al hacerlo manualmente si porque sera?
#include <stdio.h>
#include <windows.h>
bool nombre = false; //ejemplo <nombre> nombre de lo que se va a modificar
bool salir = false;
void dll()
{
   while (salir) //bucle infinito (while 1 = true) variable salir es = a false osea a terminar el procceso
   {
      
     if (nombre) //si es verdadera

    {                              
      *(DWORD*)(0x01A1B9FC) = 16000; //04E50C5C
     }
   Sleep(200); //milisegundos de espera del bucle
  }

}

void Teclado() //nombre de la variable
{
 
  while (1) //bucle
  {
     if (GetAsyncKeyState(VkKeyScan('o')) & 1) //usar teclado para activar
     {
    nombre = !nombre; //lo contrario de verdadero De true a false o de false a true
    }
     Sleep(500);
  }
}

//DLL.MAINT

BOOL WINAPI DllMain(HINSTANCE module, DWORD reason, LPVOID reserved)
{
   if (reason == DLL_PROCESS_ATTACH)
    {
     CreateThread(0, 0, (LPTHREAD_START_ROUTINE)dll, 0, 0, 0);
    CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Teclado, 0, 0, 0);
}
   else if (reason == DLL_PROCESS_ATTACH)
    {
   
     salir = true;
   }

    //devolver
   return true;

}

Título: Re:ayuda en c++
Publicado por: TrOnTxU en 11 de Junio de 2019, 04:54:52 pm
Sé que soy pesao, pero es que poneis preguntas sin nada de contexto, y hay que echarle un rato para averiguar a que os referis :(

De entrada, cosas que veo 
Código: [Seleccionar]
*(DWORD*)(0x01A1B9FC) = 16000; //04E50C5C
Porque escribes en una direccion de de memoria hardcodeada?
Por lo que veo utilizas librerias de windows, y con todo lo de la memoria virtual y el espacio de memoria protegido (no estas en una plataforma embebida como era la NintendoDS, etc.)
Esa direccion la tendrias que obtener de algun sitio, no?

Luego veo que arrancas dos hilos, que parece que nunca terminan.

Y estas modificando un bool desde dos hilos (nombre), y ni siquiera lo has marcado con volatile!
El problema no es que pueda haber una race condition, pero al menos deberias de asegurarte q esa modificacion es atomica y marcada como volatile para que el compilador entienda que no se debe tocar eso al optimizar.

Y esta parte?:
Código: [Seleccionar]
if (reason == DLL_PROCESS_ATTACH)
    {
     CreateThread(0, 0, (LPTHREAD_START_ROUTINE)dll, 0, 0, 0);
    CreateThread(0, 0, (LPTHREAD_START_ROUTINE)Teclado, 0, 0, 0);
}
   else if (reason == DLL_PROCESS_ATTACH)
    {
   
     salir = true;
   }
Tienes un if y luego un else if con la misma condición?
No entiendo el proposito.

Si explicas un poco más que quieres hacer quizás pueda ayudarte un poco.

Salu2