Comunque ti do uno spunto che, almeno personalmente, potresti provare. Devi applicare un paio di patch al kernel (rigorosamente non testate in esecuzione):
La prima č alquanto dubbia, ma per quello che devi fare potrebbe andar bene. E' una modifica al layer socket che consente di tenere traccia del pid del creatore di un socket:
Codice:
--- linux-2.6.11.4/net/socket.c.org 2005-06-13 20:51:53.000000000 +0200
+++ linux-2.6.11.4/net/socket.c 2005-06-13 20:39:11.000000000 +0200
@@ -404,6 +404,7 @@
file->f_mode = FMODE_READ | FMODE_WRITE;
file->f_flags = O_RDWR;
file->f_pos = 0;
+ file->f_owner.pid = get_current()->pid;
fd_install(fd, file);
}
La seconda č una patch al modulo ip_queue. Invece di inserire un campo pid nella struct ipq_packet_msg (sarebbe l'ideale, ma ti obbligherebbe a ricompilare anche iptables), "riciclo" il campo timestamp_usec per metterci dentro il pid:
Codice:
--- linux-2.6.11.4/net/ipv4/netfilter/ip_queue.c.org 2005-06-13 20:56:37.000000000 +0200
+++ linux-2.6.11.4/net/ipv4/netfilter/ip_queue.c 2005-06-13 20:56:28.000000000 +0200
@@ -234,7 +234,9 @@
pmsg->packet_id = (unsigned long )entry;
pmsg->data_len = data_len;
pmsg->timestamp_sec = entry->skb->stamp.tv_sec;
- pmsg->timestamp_usec = entry->skb->stamp.tv_usec;
+// pmsg->timestamp_usec = entry->skb->stamp.tv_usec;
+ pmsg->timestamp_usec = entry->skb->sk->sk_socket->file ?
+ entry->skb->sk->sk_socket->file->f_owner.pid : 0;
pmsg->mark = entry->skb->nfmark;
pmsg->hook = entry->info->hook;
pmsg->hw_protocol = entry->skb->protocol;
Ho verificato che, almeno nella catena OUTPUT della tabella nat (quella che ti interessa, per i programmi locali), il risultato č corretto per un programma a singolo thread. Non ti consiglio di usare QUEUE per le altre catene; te lo sconsiglio vivamente per le catene di ingresso, qualsiasi esse siano (non ho verificato la patch su queste; se ti va bene, il campo ->file č nullo e non succede altro; se ti va male, c'č una "remota" possibilitā di kernel oops

)
Quote:
mmmhh...
me la devo pensare meglio
|
Apri /proc/<pid>/maps, prendi i file indicati nei segmenti marcati "x" (eseguibile), e ne fai l'md5sum. I path sono assoluti, LD_PRELOAD č fregato.