Come ottenere l'elenco di ganci installati globalmente in Windows (utilizzando l'API SetWindowsHookEx)?Elenco dei ganci di Windows installati
risposta
Un modo malvagio sarebbe quello di agganciare tutte le funzioni di aggancio prima che qualcos'altro abbia la possibilità di farlo.
So che è possibile installare il mio hook che verrà chiamato prima di qualsiasi altro, ma non indica quanti hook registrati seguono quando il mio hook chiama CallNextHookEx. – lightstep
Non quel tipo di gancio. Funzione di importazione agganciare a 'SetWindowsHookEx'. In questo modo puoi contare quando un processo chiama quella funzione. – kichik
Vedo, ma come posso essere sicuro di agganciare SetWindowsHookEx prima che qualcuno lo chiami? – lightstep
Vedi
Trovare ganci Rispetto ad altre operazioni, enumerando l'installe d ganci è abbastanza facile.
I ganci specifici del filetto sono registrati nei dati per thread di win32k struttura taggata, piuttosto immaginativa, come THREADINFO 1. Questo è essenzialmente una struttura simile a ETHREAD/TEB ma uno su misura specifico per le informazioni dell'utente e di gdi. Uno dei suoi membri (aphkStart) è una serie di puntatori a 16 elementi, singolarmente essi sono o puntano a NULL o la testa di un elenco collegato di strutture HOOK. L'enumerazione dei ganci è semplicemente una misura dell'abbandono delle catene .
Per comodità, e probabilmente così che iterazione non è necessario per vedere se è impostato un qualsiasi ganci, il ThreadInfo contiene un altro membro, fsHooks, che è un campo di bit. Se è attivo un bit, l'indice corrispondente nell'array hook è valido. Invece di 33 confronti (16 per NULL e 17 per un ciclo for), dire se ci sono hook richiede solo uno, nifty!
ganci globali, che sono per desktop 2, vengono anche memorizzati in un per-oggetto struttura , anche chiamato fantasia (DESKTOPINFO), e sono anche memorizzati in un array con un campo di bit di accompagnamento. Colpendo il due è pDeskInfo, un membro di THREADINFO che punta al proprio proprietario DESKTOPINFO.
Nonostante il mal di pancia nell'introduzione, lavorare con tutte queste strutture non documentate non è in realtà troppo difficile in pratica. I simboli di Windows 7 per win32k.sys includono i loro layout, che è bello. I simboli per l'era di Vista/Server 2008 non lo fanno, è qui che lo studio arriva e salva la giornata.
Conoscere ciò che queste strutture assomigliano è una cosa, ottenendo a loro è un altro ...
Dopo aver ottenuto i nostri guanti sporche su di loro, troviamo strutture HOOK record di maggior parte delle informazioni rilevanti stessi:
struct tagHOOK
{
THRDESKHEAD head; // info about the creator
struct tagHOOK* phkNext; // next entry in linked list
int iHook; // WH_ hook type
UINT_PTR offPfn; // RVA to hook function in ihmod library
UINT flags; // HF_ flags (GLOBAL, ANSI)
int ihmod;
THREADINFO* ptiHooked; // the hooked thread
PVOID rpDesk; // saved desktop pointer
ULONG nTimeout :7;
ULONG fLastHookHung :1;
};
È possibile scaricare il software here
Una panoramica per rivelare hook globali installate segue:
- chiamata PsGetCurrentThread e ottenere la struttura ETHREAD del thread corrente. ETHREAD è una struttura di dati opaca in base alla documentazione MSDN .
- Estrarre la struttura THREADINFO chiamando PsGetThreadWin32Thread. Entrambi sono privi di documenti.
- Estrarre il DESKTOPINFO.
- È possibile trovare tutti i ganci installati a livello globale. Sono organizzati in un array. Ogni elemento è un elenco collegato e corrisponde a un hook specifico (WH_ *).
Una panoramica di rilevamento installati hook locali segue:
- Dato un ID thread.
- Chiama PsLookupThreadByThreadId e ottieni la struttura ETHREAD del thread specificato.
- Estrarre la struttura THREADINFO chiamando PsGetThreadWin32Thread.
- È possibile trovare tutti i ganci installati localmente per il thread specificato. Sono organizzati in un array. Ogni elemento è un elenco collegato e corrisponde a un hook specifico (WH_ *).
È possibile visualizzare i plug source here
for Process Hacker 2 (http://processhacker.sourceforge.net), ganci sistema visualizza e in grado di sganciare (destra menu clic).
Prendere l'origine di Process Hacker e compilarlo, quindi aggiungere HookTools.vcxproj a Plugins.sln. VS 2013 è stato utilizzato. Impostare il percorso della libreria nelle directory VC++.
o correlata domanda con risposta qui
- Detecting Keyboard Hooks
- https://security.stackexchange.com/questions/17904/what-are-the-methods-to-find-hooked-functions-and-apis
Ma io ancora non ho trovato un modo affidabile per farlo.
* "Questa pagina web non è disponibile" *. Si prega di consultare [Come scrivere una buona risposta?] (Http://stackoverflow.com/help/how-to-answer), in particolare: * "Fornire contesto per i collegamenti: i collegamenti a risorse esterne sono incoraggiati, ma si prega di aggiungere contesto attorno al link in modo che i tuoi colleghi abbiano un'idea di cosa sia e perché è lì. ** Cita sempre la parte più rilevante di un link importante, nel caso in cui il sito target sia irraggiungibile o vada permanentemente offline **. "* – IInspectable
@DavidStratton Penso che stia chiedendo un elenco di tutto ciò che ha chiamato "SetWindowsHookEx". – vcsjones
Tastiera per esempio. SetWindowsHookEx installa una procedura di hook definita dall'applicazione in una catena di aggancio. Voglio ottenere questa catena di gancio. – lightstep
Non puoi farlo da solo; cosa stai cercando di realizzare? – Michael