2011-12-19 5 views
8

Come ottenere l'elenco di ganci installati globalmente in Windows (utilizzando l'API SetWindowsHookEx)?Elenco dei ganci di Windows installati

+0

@DavidStratton Penso che stia chiedendo un elenco di tutto ciò che ha chiamato "SetWindowsHookEx". – vcsjones

+0

Tastiera per esempio. SetWindowsHookEx installa una procedura di hook definita dall'applicazione in una catena di aggancio. Voglio ottenere questa catena di gancio. – lightstep

+0

Non puoi farlo da solo; cosa stai cercando di realizzare? – Michael

risposta

3

Un modo malvagio sarebbe quello di agganciare tutte le funzioni di aggancio prima che qualcos'altro abbia la possibilità di farlo.

+0

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

+0

Non quel tipo di gancio. Funzione di importazione agganciare a 'SetWindowsHookEx'. In questo modo puoi contare quando un processo chiama quella funzione. – kichik

+0

Vedo, ma come posso essere sicuro di agganciare SetWindowsHookEx prima che qualcuno lo chiami? – lightstep

5

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:

  1. chiamata PsGetCurrentThread e ottenere la struttura ETHREAD del thread corrente. ETHREAD è una struttura di dati opaca in base alla documentazione MSDN .
  2. Estrarre la struttura THREADINFO chiamando PsGetThreadWin32Thread. Entrambi sono privi di documenti.
  3. Estrarre il DESKTOPINFO.
  4. È 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:

  1. Dato un ID thread.
  2. Chiama PsLookupThreadByThreadId e ottieni la struttura ETHREAD del thread specificato.
  3. Estrarre la struttura THREADINFO chiamando PsGetThreadWin32Thread.
  4. È 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

Ma io ancora non ho trovato un modo affidabile per farlo.

+2

* "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