2012-01-24 12 views
5

Intro Info: Windows 7 64-bit. C++. App e DLL a 64 bit. Agganciare senza Disturbi MS.API Hooking senza Detours

Domanda: Ho faticato sul problema di ottenere un esempio funzionante che dimostra l'aggancio in Windows. La maggior parte dei tutorial sembra essere stata scritta durante un periodo in cui Windows XP a 32 bit era l'unico sistema operativo ... Da allora ho superato gli ostacoli a 64 bit di comprensione e ho iniettato una DLL con successo. Il mio prossimo passo in questo viaggio di conoscenza è l'aggancio. In linea con la nostalgia dell'argomento, i Detours di MS non supportano 64 bit (gratuitamente) e di sicuro non sto pagando $ 10.000 per nulla. Così ho perseguito i metodi convenzionali in this tutorial.

Questa tut è impressionante, ma sto avendo un po 'di difficoltà a capire questo segmento:

void BeginRedirect(LPVOID newFunction) 
{ 
    BYTE tempJMP[SIZE] = {0xE9, 0x90, 0x90, 0x90, 0x90, 0xC3}; 
    memcpy(JMP, tempJMP, SIZE); 
    DWORD JMPSize = ((DWORD)newFunction - (DWORD)pOrigMBAddress - 5); 
    VirtualProtect((LPVOID)pOrigMBAddress, SIZE, 
       PAGE_EXECUTE_READWRITE, &oldProtect); 
    memcpy(oldBytes, pOrigMBAddress, SIZE); 
    memcpy(&JMP[1], &JMPSize, 4); 
    memcpy(pOrigMBAddress, JMP, SIZE); 
    VirtualProtect((LPVOID)pOrigMBAddress, SIZE, oldProtect, NULL); 
} 

In particolare, sto lottando con il byte tempJMP e tutto il memcpy in corso. Ho un indirizzo per la funzione InsertDate() del blocco note che voglio dirottare, ma non sono sicuro su dove puntarlo ... Questo sarebbe l'indirizzo della nuova funzione? O non è relativo? Idk, sto solo cercando alcuni suggerimenti.

risposta

1

L'idea è quella di "sovrascrivere" il codice originale che esegue Messagebox a:

JuMP <CustomMessageBoxFunction> 
RETurn (back to program execution) 

Quindi,

In primo luogo egli copie suo shellcode per serie JMP:

memcpy(JMP, tempJMP, SIZE); 

Poi copia i byte del codice assembly originale dall'indirizzo originale nella sua memoria temporanea "oldBytes" in modo che possa copiarlo dopo l'esecuzione della sua funzione personalizzata:

memcpy(oldBytes, pOrigMBAddress, SIZE); 

Poi copia l'indirizzo che taglia precedentemente calcolato matrice JMP destra dopo il comando JMP:

memcpy(&JMP[1], &JMPSize, 4); 

Infine la matrice JMP [] contiene lo shellcode richiesto per chiamare la sua funzione, per esempio

JMP 1234 
RET 

così ora deve copiare che nel corso dei byte originali in cui il programma si aspetta di trovare la funzione MessageBox originale:

memcpy(pOrigMBAddress, JMP, SIZE); 

Ora venendo alla tua domanda, se si vuole agganciare InsertDate() allora invece di usare pOrigMBAddress puoi usare l'indirizzo di InsertDate.

Ma non sono sicuro che funzionerà con finestre a 64 bit.

2

Le funzioni di attivazione a caldo iniziano con le seguenti istruzioni mov edi, edi e sono precedute da 5 istruzioni NOP (codice cave se non ricordo male).

In caso di hotpatching, il mov edi, edi viene sovrascritto con un breve salto nella caverna del codice. Anche la code cave viene riscritta con un salto al gestore del gancio (la funzione in cui intercetti la chiamata API e la inoltra alla vera funzione API).

Problemi correlati