API Hooking (C++)

<< < (2/3) > >>

HaX991:
esta es la funcion:

Código
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:

Código
 ret = Hook("psapi", "EnumProcesses", 7, (BYTE *) EnumProcesses_Hook, &addr);
 pEnumProcesses = (BOOL (__stdcall *)(DWORD*, DWORD, DWORD*)) (Buffer - 7 - 1);
 

saludos!!

[Zero]:
Si puedes poner un compilado tambien me ayudaría, seguramente la línea:
Código
*((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

Eternal Idol:
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 ...

HaX991:
Bueno las declaraciones y protipos de las funciones estan correctas, son estas.

Código
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

Código
BOOL WINAPI EnumProcesses_Hook (DWORD *pProcessIds, DWORD cb, DWORD *pBytesReturned) {
  return false;
}
 


alguna solucion?

Eternal Idol:
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

Navegación

[0] Índice de Mensajes

[#] Página Siguiente

[*] Página Anterior