Condividi tramite


Identificazione del chiamante dal thread del server

È possibile determinare cosa ha effettuato una determinata chiamata RPC, anche se le uniche informazioni disponibili sono il thread del server che ha eseguito la chiamata.

Ciò può essere molto utile, ad esempio per scoprire chi ha passato parametri non validi a una chiamata RPC.

A seconda della sequenza di protocollo usata da questa particolare chiamata, è possibile ottenere diversi gradi di dettaglio. Alcuni protocolli (ad esempio NetBios) non dispongono di queste informazioni.

Identificazione del chiamante dal thread del server

  1. Avviare un debugger in modalità utente con il thread del server come destinazione.

  2. Ottenere l'ID del processo usando | (Stato processo) Comando:

    0:001> |
      0     id: 3d4 name: rtsvr.exe
    
  3. Ottenere le chiamate attive in questo processo usando l'estensione !rpcexts.getcallinfo . Per una spiegazione della sintassi, vedere la pagina di riferimento. È necessario specificare l'ID processo di 0x3D4:

    0:001> !rpcexts.getcallinfo 0 0 FFFF 3d4
    Searching for call info ...
    PID  CELL ID   ST PNO IFSTART  THRDCELL  CALLFLAG CALLID   LASTTIME CONN/CLN
    ----------------------------------------------------------------------------
    03d4 0000.0004 02 000 19bb5061 0000.0002 00000001 00000001 00a1aced 0000.0003
    

    Cercare le chiamate con stato 02 o 01 (inviato o attivo). In questo esempio, il processo ha una sola chiamata. In caso contrario, è necessario usare l'estensione !rpcexts.getdbgcell con il numero di cella nella colonna THRDCELL. In questo modo è possibile esaminare gli ID del thread in modo da poter determinare la chiamata a cui si è interessati.

  4. Dopo aver appreso la chiamata a cui si è interessati, esaminare il numero di cella nella colonna CONN/CLN. Si tratta dell'ID cella dell'oggetto connessione. In questo caso, il numero di cella è 0000,0003. Passare questo numero di cella e l'ID del processo a !rpcexts.getdbgcell:

    0:001> !rpcexts.getdbgcell 3d4 0.3
    Getting cell info ...
    Connection
    Connection flags: Exclusive
    Authentication Level: Default
    Authentication Service: None
    Last Transmit Fragment Size: 24 (0x6F56D)
    Endpoint for the connection: 0x0.1
    Last send time (in seconds since boot):10595.565 (0x2963.235)
    Last receive time (in seconds since boot):10595.565 (0x2963.235)
    Getting endpoint info ...
    Process object for caller is 0xFF9DF5F0
    

Questa estensione visualizzerà tutte le informazioni disponibili sul client di questa connessione. La quantità di informazioni effettive varia a seconda del trasporto utilizzato.

In questo esempio, le named pipe locali vengono usate come trasporto e viene visualizzato l'indirizzo dell'oggetto processo del chiamante. Se si collega un debugger del kernel (o si avvia un debugger del kernel locale), è possibile usare l'estensione !process per interpretare l'indirizzo del processo.

Se LRPC viene usato come trasporto, verrà visualizzato l'ID del processo e l'ID del thread del chiamante.

Se TCP viene usato come trasporto, verrà visualizzato l'indirizzo IP del chiamante.

Se le named pipe remote vengono utilizzate come trasporto, non saranno disponibili informazioni.

Nota Nell'esempio precedente viene illustrato come trovare il thread client se si conosce il thread del server. Per un esempio della tecnica inversa, vedere Analisi di un problema di chiamata bloccata.