Domanda

Sto tentando di scrivere un'applicazione userspace che può collegare in stack di rete di un sistema operativo, annusare i pacchetti volanti quelli passati e modificare che la sua nel interessati.

Dopo molte Googling, mi sembra che il metodo più semplice (ancora ragionevolmente robusta) di farlo (su qualsiasi piattaforma) è di Linux libnetfilter_queue progetto. Tuttavia, sto avendo problemi a trovare alcuna documentazione ragionevole per il progetto, al di fuori della ufficiale documentazione. Le sue caratteristiche principali (come dichiarato dal primo link sono)

  • ricezione di pacchetti in coda dal kernel nfnetlink_queue sottosistema
  • l'emissione di verdetti e / o la reintroduzione alterati per il kernel nfnetlink_queue sottosistema

L'enfasi è mia. Esattamente come sono io intendevo andare su questo? Ho provato la modifica del codice esempio previsto, ma forse sto malinteso qualcosa. Il codice funziona in modalità NFQNL_COPY_PACKET, in modo da I am che riceve l'intero pacchetto - ma le mie modifiche ad esso sembrano essere limitato alla mia propria applicazione - come ci si aspetterebbe, data la "copia" semantica .

La mia sensazione è che sto intenzione di fare uso di NF_QUEUE in qualche modo, ma non ho abbastanza grokked esso. Tutti gli indicatori?

(Se v'è un meccanismo più semplice per fare questo, che è anche cross-platform, mi piacerebbe sentire su di esso!)

È stato utile?

Soluzione

Non riesco a credere di aver perso questo in precedenza. Come reticenti come sono a postare domande sul SO, ho pensato che non avrei mai lavorare questo fuori me stesso. :)

Non ho guardo il prototipo di funzione correttamente. Risulta nella funzione "giudizio" (descritto di seguito),

int nfq_set_verdict(struct nfq_q_handle *qh,
    u_int32_t id,
    u_int32_t verdict,
    u_int32_t data_len,
    const unsigned char *buf     
)

Gli ultimi due parametri sono per i dati da restituito per lo stack di rete. Ovvio col senno di poi, ma ho perso completamente la funzione print_pkt non prende i dati a pacchetto come un parametro, ma estratti dal struct nfq_data.

La chiave è NF_ACCEPT il pacchetto e passare la schiena pacchetto opportunamente modificato per il kernel.

Altri suggerimenti

Solo una supposizione selvaggia di scavare tutto il codice sorgente: provare ad aggiungere in modo esplicito il payload maciullato utilizzando nfnl_addattr_l(…, NFQA_PAYLOAD, …)

?
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top