hola estoy auyudando a un amigo a parhear una api pero intentamos de todo y no lo logramos..
lib  = psapi.dll 
api = EnumProcesses
La api comienza aqui:
76BB3A9A > $ 6A 1C PUSH 1C
76BB3A9C . 68 C83BBB76 PUSH psapi.76BB3BC8
76BB3AA1 . E8 5BDBFFFF CALL psapi.76BB1601
76BB3AA6 . BE 00800000 MOV ESI,8000
76BB3AAB . 8975 E4 MOV DWORD PTR SS:[EBP-1C],ESI
76BB3AAE . 56 PUSH ESI
76BB3AAF . 8B3D B810BB76 MOV EDI,DWORD PTR DS:[<&KERNEL32.LocalAl>; kernel32.LocalAlloc
76BB3AB5 . EB 25 JMP SHORT psapi.76BB3ADC
cuantos bytes abria que cojer?
pd: usamos dll inyeccion
Gracias, saludos!!
			
			
			
				Léete este taller de MazarD, muy bueno:
http://mazard.info/tutos/apihooking.pdf
Saludos :P
			
			
			
				Si usas el metodo mas comun de poner un jmp a tu direccion (5 bytes) tenes que guardar en memoria, para ejecutar despues si queres llamar a la funcion original, las dos primeras instrucciones (7 bytes).
			
			
			
				gracias pero probe desde 5,7,9,18,20 y peta igalmennte ...
si hookeo otra api va de lujo pero esa no se como hacerlo...
yo creo k son 7bytes pero k tengo k recalcular la distancia de salto...
			
			
			
				Pon el código de como lo estas haciendo, el salto (E9) son 5 bytes, y tu cojes 7, seguro saltas 7-5=2 bytes antes de donde tienes que saltar, con un debuger puedes verlo  :P.
Saludos
			
			
			
				esta es la funcion:
bool Hook(char* lpLib, char* lpModule, int iBytes, BYTE *ucDstAddress, HOOK_ADDR *hook) {
   HMODULE hLib;
   hLib = GetModuleHandle(lpLib);
   if (hLib) {
      BYTE *ucSrcAddress;
      ucSrcAddress = (BYTE *) GetProcAddress(hLib, lpModule);
      if (ucSrcAddress) {
         DWORD ulOldProtect;
		 if ((Buffer = (BYTE *) malloc(iBytes + 5)) == NULL) return 0;
         if (VirtualProtect((void *) Buffer, iBytes + 5, PAGE_EXECUTE_READWRITE, &ulOldProtect) == 0) return 0;
         memcpy(Buffer, ucSrcAddress, iBytes);
         Buffer += iBytes;
         *Buffer = 0xE9;
         Buffer++;
         *((signed int *) Buffer) = ucSrcAddress - Buffer + (iBytes - 5) + 1;
         if (VirtualProtect((void *) ucSrcAddress, iBytes, PAGE_EXECUTE_READWRITE, &ulOldProtect) == 0) return 0;
         hook->ulDstModAddr = (unsigned long) ucDstAddress;
         *ucSrcAddress = 0xE9;
         ucSrcAddress++;
         *((signed int *) ucSrcAddress) = ucDstAddress - ucSrcAddress - 4;
         FlushInstructionCache(GetCurrentProcess(), NULL, NULL);
         strcpy(hook->lpLib, lpLib);
         strcpy(hook->lpModule, lpModule);
         hook->uiBytes = iBytes;
         hook->ulSrcModAddr = (unsigned long) ucSrcAddress;
         return true;
	  }
   }
   return false;
}
y se usaria asi:
  ret = Hook("psapi", "EnumProcesses", 7, (BYTE *) EnumProcesses_Hook, &addr);
  pEnumProcesses = (BOOL (__stdcall *)(DWORD*, DWORD, DWORD*)) (Buffer - 7 - 1);
saludos!!
			
			
			
				Si puedes poner un compilado tambien me ayudaría, seguramente la línea:
*((signed int *) Buffer) = ucSrcAddress - Buffer + (iBytes - 5) + 1;
Sea la causante del fallo, pero a ojo no me aclaro para calcular la distancia del salto  :xD. 
Saludos
			
			
			
				Eso parece estar bien ... ¿No estara mal el hook mismo (EnumProcesses_Hook)? ¿Estas usando stdcall? Y de cualquier manera: ¿Cual es EXACTAMENTE el problema? Hasta ahora solo dijiste que "no logran" parchear una funcion ...
			
			
			
				Bueno las declaraciones y protipos de las funciones estan correctas, son estas.
 BOOL WINAPI EnumProcesses_Hook  (DWORD*, DWORD, DWORD*);
 BOOL (__stdcall *pEnumProcesses)(DWORD*, DWORD, DWORD*);
mm la idea es inyectar una dll al taskmgr.exe para modificar el resultado de la api "EnumProcesses" y ocultar un proceso, probe antes con la api "TerminateProcess" y va de lujo, la de terminateprocess son 5 bytes y se hookea bien y sirve todo perfect, pero al poner la otra algo en el hook ago mal k cuando la inyecto al llamar el taskmgr.exe (admin de tareas) a esa api entones falla y salta el tipico error de la memoria no se puede leer....
pero lo raro esk si hookeo la api "FindNextFileA" o "FindNextFileW" ambas de 7 bytes de salto sirve perfecto pero enumprocesses no...
EI: lo siento pero las reglas prohiben dejar binarios.
ai van el inyector y la dll.
abrir el admin de tareas, luego el inyector y poner "taskmgr.exe" e inyectarla, si pongo 7 bytes no peta pero tampoco hace nada el admin sirve = y eso k puse en la  funcion falsa
BOOL WINAPI EnumProcesses_Hook (DWORD *pProcessIds, DWORD cb, DWORD *pBytesReturned) {
   return false;
}
alguna solucion?
			
			
			
				La solucion es hookear la funcion correcta, el Task Manager no usa esa funcion:
http://foro.elhacker.net/ingenieria_inversa/saber_q_apis_usa_el_task_manager-t188983.0.html
			
			
			
				vale gracias a todos aclarado, hookear una api k no esta en el proceso es mala idea xdddddddddd, pensaba k usaba esa :(
bueno gracias a todos
saludos!!
			
			
			
				De nadas  ::)