2013-04-29 2 views
14

Stavo facendo con un cosiddetto "aggancio seh". In realtà cambia il permesso della regione di memoria e cattura l'eccezione quando vi si accede, quindi può agganciare la funzione.È impostato il trap a step singolo disponibile su win 7?

utilizza la trappola passo singolo che assomiglia a:

info->ContextRecord->EFlags |= 0x100; 

per riprendere la protezione a PAGE_NOACCESS.

L'app funziona bene su win xp ma non come eccetto su win 7. Si è appena congelata su win 7. Dubito fortemente che sia a causa della cosa del "set single step trap", ma non ne sono sicuro.

Click here al link per il download diretto del pacchetto sorgente

+3

Basta agganciare la funzione nel modo normale. È probabile che questo tipo di tecniche pazze ottengano il tuo codice contrassegnato come malware. –

+0

Hai avviato il programma come amministratore? Windows 7 aggiunge un securi .. livello di disturbo per programmare i permessi. È possibile richiedere le autorizzazioni con l'impostazione Linker-> File manifest> Livello di esecuzione UAC-> requireAdmin – typ1232

risposta

11

Risposta breve:

Sì, la sola bandiera passo è parte del achitecture x86 e anche ancora implementato in Windows 7 tramite la componente EFlag del processore contesto.

Sono riuscito a scaricare il progetto e tutto funziona correttamente senza modifiche su Windows 8 con UAC disattivato. Quindi dovrebbe funzionare anche su Windows 7. All'avvio di VEH Hooking Test.exe vengono visualizzate due finestre di messaggi, dopo ciascuna di esse viene visualizzato l'output della console MessageBoxA, quindi l'hook ha funzionato. Forse prova ad avviare il programma come amministratore su Windows 7?


Risposta lunga:

SEH sta per la gestione delle eccezioni strutturata, ma ciò che si sta descrivendo suona più come VEH - vectored di gestione delle eccezioni.

L'aggancio VEH è un metodo di aggancio che è davvero dannatamente lento, quindi non può essere realmente utilizzato in hook di prestazioni critiche, come ad esempio il gancio grafico, in cui i ganci colpiscono più volte al secondo. Di solito è usato per i ganci di una volta. Lo scopo dell'aggancio VEH è di essere veramente furtivo. Non c'è memoria scritta nel codice di qualcuno Elses e non è necessario utilizzare i registri di debug.


Quanto segue è come implementarlo utilizzando C++.

Per prima cosa è necessario registrare un gestore eccezioni vettoriale. Questo è un gestore di eccezioni globale per il processo. Ogni eccezione generata che non è stata gestita e sarebbe caduta nel sistema operativo verrà catturata da questo gestore.

PVOID pExHandler = AddVectoredExceptionHandler(1, VectoredHandler); 

Dopo questo si dovrebbe impostare la protezione della memoria della pagina in cui il vostro HOOK_LOCATION (l'indirizzo di agganciare) è in. La nuova protezione che sto utilizzando è PAGE_EXECUTE_READ|PAGE_GUARD. Una pagina protetta causerà un'eccezione all'accesso e rimuoverà automaticamente la protezione di protezione in seguito. Questa eccezione non verrà gestita da nessuno, quindi passerà al nostro gestore vettoriale. Dopo che l'eccezione è stata lanciata, la pagina è di nuovo accessibile. (vedi Creating Guard Pages)

La memoria può essere protetta solo nelle pagine (in genere 0x1000 byte). Questo è il motivo per cui non possiamo solo proteggere la posizione del gancio e avere l'enorme sovraccarico delle prestazioni.

DWORD orgProt; 
VirtualProtect(HOOK_LOCATION, 1, PAGE_EXECUTE_READ|PAGE_GUARD, &orgProt); 

Ora per il nostro gestore di eccezioni. Ecco come potrebbe essere:

LONG CALLBACK VectoredHandler(PEXCEPTION_POINTERS exc) 
{ 
    if (exc->ExceptionRecord->ExceptionCode == STATUS_GUARD_PAGE_VIOLATION) 
    { 
     // guard page exeption occured. guard page protection is gone now 

     if (HOOK_LOCATION == reinterpret_cast<long*>(exc->ContextRecord->Eip)) { 
      // hook location was hit! call any hook callbacks here 
     } else { 
      // hook was not hit and has to be refreshed. set single-step flag 
      exc->ContextRecord->EFlags |= 0x100; 
     } 

     return EXCEPTION_CONTINUE_EXECUTION; 
    } 

    if (exc->ExceptionRecord->ExceptionCode == STATUS_SINGLE_STEP) 
    { 
     // single-step exeption occured. single-step flag is cleared now 

     // set guard page protection 
     DWORD oldProt; 
     VirtualProtect(HOOK_LOCATION, 1, PAGE_EXECUTE_READ|PAGE_GUARD, &oldProt); 

     return EXCEPTION_CONTINUE_EXECUTION; 
    } 

    return EXCEPTION_CONTINUE_SEARCH; 
} 

Se il codice viene eseguito nella pagina di memoria protetta, verrà generata la violazione della pagina di guardia. Controlliamo se fossimo nella posizione del gancio. Se siamo tutto va bene e possiamo chiamare il callback di hook. Se non siamo nella posizione corretta, abbiamo in qualche modo bisogno di riproteggere il codice, ma se lo faremo ora, non potremmo avanzare e ottenere sempre un'eccezione nella stessa posizione e bloccare l'applicazione. Quindi impostiamo il flag del singolo step del processore.

Ora, quando si riceve l'eccezione del passaggio singolo, è possibile impostare nuovamente la protezione di protezione, perché abbiamo avanzato da un'istruzione. Questo è il modo in cui possiamo sempre avere la pagina di destinazione protetta e non perdere nessuna sorpresa.

Il costo è di due eccezioni e una protezione della pagina per istruzione che viene eseguita nella pagina di destinazione. Non provare a farlo con un debugger allegato. Andrà pazzo.

Per un'implementazione effettiva potrebbero essere necessari oggetti di sincronizzazione per sbarazzarsi dell'hook senza causare il crash del programma e una migliore gestione degli hook.

Mi piace molto questo meccanismo intelligente e spero che alcune persone ne abbiano imparato un po '.

+0

Non sono sicuro che questo risponda alla domanda OP, ma grazie per la spiegazione, mi è piaciuto leggerlo! –

+0

@ dema80 grazie per il feedback. in realtà sono riuscito a indovinare dove scaricare il file ora. Tutto funziona perfettamente con Windows 6.x – typ1232

+0

@ typ1232 Ho modificato la mia domanda per aggiungere un link per il download diretto alla fonte, ci scusiamo per l'inconveniente –