2011-01-16 1 views
12

ad es. le versioni recenti di TCPView hanno tale funzionalità: visualizzazione dei byte inviati/ricevuti per connessione TCP (il conteggio inizia all'avvio di TCPView). è possibile senza sniffering dei pacchetti? Windows fornisce alcuna API per questo? Non ho trovato come contatori di prestazionicome contare i byte inviati e ricevuti per connessione TCP (a livello di sistema)?

come enumerare tutte le connessioni sono descritte here

EDIT: fa TDI aiuto per ricevere statistiche di trasferimento per-socket? NetBIOS? qualche link dove scavare?

+0

Ho questa domanda come preferita, non fornirò questa risposta, ma semplicemente un commento per guidare, ma hai guardato http://msdn.microsoft.com/en-us/library/aa394291%28v = vs.85% 29.aspx? – Anders

+0

@Anders: come ho capito, sono informazioni di sistema, non per connessione TCP, giusto? –

+0

Sembra così. Hai trovato qualcos'altro? – Anders

risposta

3

Desidero implementare anche questa funzione, quindi invertire tcpview 3.0.2.

Ho trovato, tcpview utilizza un contatore delle prestazioni WMI MSNT_TcpIpInformation.

Ma MSNT_TcpIpInformation non è supportato ufficialmente in xp e 2003.

ecco la descrizione, è possibile fare riferimento a. http://www.scriptinternals.com/new/us/support/Internal/WMI_MSNT_TcpIpInformation.htm

tra l'altro, MSNT_TcpIpInformation abbiamo informazioni sui pacchetti, quindi tcpview basta incrementare inviati e pacchetti Revd ogni volta. Ecco l'smontare:

CPU Disasm 
Address Hex dump   Command           Comments 
0040B41B |. 83E8 02  SUB EAX,2           ; Switch (cases 2..3, 3 exits) 
0040B41E |. 74 29   JE SHORT 0040B449 
0040B420 |. 83E8 01  SUB EAX,1 
0040B423 |. 75 40   JNE SHORT 0040B465 
0040B425 |. 8B57 1C  MOV EDX,DWORD PTR DS:[EDI+1C]      ; Case 3 of switch Tcpview.40B41B 
0040B428 |. 0196 90060000 ADD DWORD PTR DS:[ESI+690],EDX 
0040B42E |. 119E 94060000 ADC DWORD PTR DS:[ESI+694],EBX 
0040B434 |. 8386 C0060000 ADD DWORD PTR DS:[ESI+6C0],1 
0040B43B |. 119E C4060000 ADC DWORD PTR DS:[ESI+6C4],EBX 
0040B441 |. 5E   POP ESI 
0040B442 |. 5F   POP EDI 
0040B443 |. 5D   POP EBP 
0040B444 |. 5B   POP EBX 
0040B445 |. 83C4 3C  ADD ESP,3C 
0040B448 |. C3   RETN 
0040B449 |> 8B47 1C  MOV EAX,DWORD PTR DS:[EDI+1C]      ; Case 2 of switch Tcpview.40B41B 
0040B44C |. 0186 78060000 ADD DWORD PTR DS:[ESI+678],EAX 
0040B452 |. 119E 7C060000 ADC DWORD PTR DS:[ESI+67C],EBX 
0040B458 |. 8386 A8060000 ADD DWORD PTR DS:[ESI+6A8],1 
0040B45F |. 119E AC060000 ADC DWORD PTR DS:[ESI+6AC],EBX 
0040B465 |> 5E   POP ESI           ; Default case of switch Tcpview.40B41B 
0040B466 |. 5F   POP EDI 
+1

interessante. "non è supportato in xp e 2003 ufficialmente". ma è supportato, giusto? che dire di vista/w7? –

+0

da vista, Windows fornisce alcune API per ottenere tutte le statistiche delle connessioni. come GetPerTcpConnectionEStats, GetUdpTcpConnectionEStats, è possibile ottenere maggiori informazioni da MSDN. – xjdrew

3

Controllare il progetto di esempio LSP WinSock a http://connect.microsoft.com/WNDP/Downloads

Troverete un campione in nonifslsp \ sockinfo.cpp che "illustra come sviluppare un provider di servizi a più livelli che è in grado di contare tutti i byte trasmessi attraverso un Socket TCP/IP "

+0

+1: tnx, informazioni interessanti, ancora in cerca di qualcosa di più facile –

0

La mia migliore scommessa sarebbe agganciare le chiamate API" invia "e registrare l'importo inviato ogni volta. Anche se questo non sembra valerne la pena, sono abbastanza sicuro che funzionerebbe. In bocca al lupo!

+0

'SetWindowsHookEx()' non è possibile agganciare 'send()' –

+0

Ah sì, ho parlato troppo presto, mi dispiace. Ad ogni modo, forse dovresti guardare il codice in modalità kernel dato che è lì che tutti gli send() finiscono .. solo un pensiero. – returneax

+0

No, non dovresti aver bisogno di sporcarti le mani nel kernel: puoi collegare 'send()' usando un protocollo a più livelli come fornitore di servizi all'interno di Windows Sockets, come a cui si riferiva la risposta di Maxim. –

2

La versione sysinternals di netstat (netstatp) esegue questa operazione. IIRC, utilizza SNMP per raccogliere le informazioni. Cerca in rete e trova una versione che ti piace. I nomi dei file sono netstatp.c e netstatp.h
Sysinternals non pubblica più netstatp di cui sono a conoscenza.

Puoi anche andare a here e ottenere tcpview e/o tcpconv uno dei quali è disponibile in formato sorgente.

+0

+1. tnx per le informazioni. Non ho trovato alcun codice relativo ai byte per connessione inviati/ricevuti in [netstatp.c] (http://www.google.com/url?sa=t&source=web&cd=2&ved=0CBcQFjAB&url=http%3A%2F % 2Fsource.sphene.net% 2Fsvn% 2Fgoim% 2Ftrunk% 2Fnet.sphene.goim.netstat% 2Fnative% 2Fsrc% 2Fnetstatp.c & ei = y9Q0TeiiCMaeOsK1vLcC & USG = AFQjCNEY07vDNoSm8XcEgwxmvjOHlxZoaQ & SIG2 = ywN__2eZr7fkMxh_Df0vKw). tcpview non è disponibile in origine e tcpconv non fornisce tale funzionalità. Qualche informazione aggiuntiva su cosa scavare in SNMP? –

+0

@robin hood: Spiacente, non riesco a trovare il vecchio codice che sysinternals ha usato per pubblicare. La prossima volta che andrò al mio ufficio fisico cercherò di vedere se è lì. So che puoi ottenere le informazioni da SNMP, ma non conosco gli OID. – JimR

1

Date un'occhiata al codice sorgente per BitMeterOS, funziona su XP +. molti anche voi vogliono guardare allo TCPDump/Libpcap pure. entrambi questi traffico di rete monitor di rete, libpcap sarà probabilmente ciò che il vostro dopo però

c'è anche Winpcap, una più finestre orientata 'versione', un semplice tutorial su statistiche di traffico di rete può essere trovato here, sarete anche in interessato a this per il filtro basato sulla connessione e this per la dimensione dei pacchetti non elaborati.

+0

controllato BitMetereOS, assomiglia alle sue statistiche di sistema, non per socket/connessione. Winpcap: come ricordo non cattura il traffico di loopback. Pls mi correggono –

+0

@Andy T: secondo le FAQ, non lo fa, ma questo è un problema con Windows: http://www.winpcap.org/misc/faq.htm tuttavia, wireshark, che usa winpcap, ha un metodo su come farlo: http://wiki.wireshark.org/CaptureSetup/Loopback anche se dovrei semplicemente usare un plug di loop fisico dal lavoro: P – Necrolis

7

tutto, in pratica ho completamente annullato tcpview 3.0.2 e implementato la stessa funzione in base a ciò che ho appreso.

tcpview use ETW per il monitoraggio dell'attività di rete.

Le API chiave sono StartTrace, OpenTrace, ProcessTrace.

Utilizzare KERNEL_LOGGER_NAME e abilitare i flag EVENT_TRACE_FLAG_NETWORK_TCPIP.

Quindi è possibile recuperare i dati dell'attività di rete da EventCallback, quindi analizzarlo come TcpIp_TypeGroup1 e altre strutture. Secondo il documento, queste strutture sono supportate solo da Vista. Comunque puoi chiamarlo e usarlo in xp (guess from reverse) e 2003 (My environment is 2003, no test su xp). Certamente devi definire tutte queste strutture da solo.

Da vista, win fornisce alcune API per il recupero di tutte le informazioni statistiche delle connessioni. Come GetPerTcpConnectionEStats, GetPerUdpConnectionEStats, è possibile ottenere maggiori dettagli da MSDN.

Inoltre, da vista, è possibile utilizzare Presa RAW per terminare lo stesso lavoro (più preciso penso). Prima di vista, RAW Socket non può recuperare i pacchetti SEND, è un peccato.