Foro de elhacker.net

Programación => Programación C/C++ => Mensaje iniciado por: Debci en 16 Agosto 2010, 10:30 am



Título: FindWindow() funciona bien bajo win Vista?
Publicado por: Debci en 16 Agosto 2010, 10:30 am
Buenas a todos, recientemente hice un pequeño codigo en C++ para dopar una aplicacion, bajo windows XP funciona perfectamente pero cuando la quiero correr en Vista nada:

Código
  1. #include <iostream>
  2. #include <windows.h>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8. HWND hVentana;
  9.  
  10. if (!(hVentana = FindWindow(NULL,"ProgramaCrackeado")))
  11. {
  12. MessageBox(NULL,"No se pudo encontrar la ventana","Error",MB_OK);
  13. return -1;
  14. }
  15. }
  16.  
Necesito conseguir el Handle de la ventana para obtener el PID del proceso y modificar sectores concretos de su memoria.

Lo que ocurre es que parece no encontrar la ventana puesto que el nombre es correcto, porque lo hago con la calculadora de windows y ocurre exactamente lo mismo, nunca encuentra la ventana, asi que puse el parametro del nombre como null y segun MSDN deben coincidir todas las ventanas con esa "Busqueda" pero ocurrian cosas indeseadas pues injectaba en memoria de procesos que no queria injectar.


Como lo mas probable es que este deprecated o en Vista no funcione, queria preguntar si existe alguna otra manera de obtener el PID de un proceso en ejecucion.



Título: Re: FindWindow() funciona bien bajo win Vista?
Publicado por: Littlehorse en 16 Agosto 2010, 12:22 pm
A simple vista debería funcionar, llama a GetLastError (http://msdn.microsoft.com/en-us/library/ms679360%28VS.85%29.aspx) luego de FindWindow para tener una idea de donde proviene el error.

En cuanto al PID, hay demasiadas formas para obtenerlo, un ejemplo básico podría ser este:

Código
  1. DWORD ProcessID;    
  2. HANDLE Handle;
  3. PROCESSENTRY32 ProcI;
  4.  
  5. Handle=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
  6. ProcI.dwSize=sizeof(PROCESSENTRY32);
  7.  
  8. while(Process32Next(Handle,&ProcI))
  9.     if(!strcmp(ProcI.szExeFile,"ejemplo.exe"))
  10.        ProcessID=ProcI.th32ProcessID;
  11.  
  12. std::cout<<ProcessID<<std::endl;
  13. CloseHandle(Handle);
  14.  

Por supuesto agregándole los chequeos que corresponden.

CreateToolhelp32Snapshot (http://msdn.microsoft.com/en-us/library/ms682489%28VS.85%29.aspx)
Process32First (http://msdn.microsoft.com/en-us/library/ms684834%28v=VS.85%29.aspx)
Process32Next (http://msdn.microsoft.com/en-us/library/ms684836%28VS.85%29.aspx)

Pero obviamente hay infinidad de métodos y combinaciones, por ejemplo utilizando funciones como:

GetWindowThreadProcessId (http://msdn.microsoft.com/en-us/library/ms633522%28VS.85%29.aspx)
GetProcessId (http://msdn.microsoft.com/en-us/library/ms683215%28VS.85%29.aspx)
OpenProcess (http://msdn.microsoft.com/en-us/library/ms684320%28VS.85%29.aspx)
EnumProcesses (http://msdn.microsoft.com/en-us/library/ms682629%28v=VS.85%29.aspx)

Incluso llamadas nativas como ZwQueryInformationProcess (http://msdn.microsoft.com/en-us/library/ms687420.aspx). Un largo etc.

También hay que tener en cuenta el contexto de seguridad de cada proceso y los privilegios de acceso. Podes leer sobre eso aquí (http://msdn.microsoft.com/en-us/library/ms684880%28v=VS.85%29.aspx)

Saludos


Título: Re: FindWindow() funciona bien bajo win Vista?
Publicado por: Debci en 16 Agosto 2010, 13:09 pm
Muchisimas gracias, excelente respuesta, en cuanto a la seguridad del proceso creo eso ocurre cuando intento escribir o leer memoria, pero por lo que veo hay maneras de saltarlo.

Saludos


Título: Re: FindWindow() funciona bien bajo win Vista?
Publicado por: Garfield07 en 16 Agosto 2010, 15:18 pm
a mi me va bien