nixp.ru v3.0

27 мая 2017,
суббота,
09:09:48 MSK

DevOps с компанией «Флант»
wiener написал 12 января 2006 года в 21:41 (841 просмотр) Ведет себя как мужчина; открыл 30 тем в форуме, оставил 76 комментариев на сайте.

Всем доброго времени суток.

Не подскажите как в C перевести сетевую карту в режим promiscuous, а то вижу только широковещательные и адресованные мне пакеты.

Читал man-ы (setsockopt, socket и пр.), но не понял.

Заранее благодарю.

PS: Программа для мирных целей. Для оценки работы сети.

myst

А SNMP как же?

wiener

Свой анализатор.

Uncle Theodore
wiener
Всем доброго времени суток.

Не подскажите как в C перевести сетевую карту в режим promiscuous, а то вижу только широковещательные и адресованные мне пакеты.

Читал man-ы (setsockopt, socket и пр.), но не понял.

Ну почитай еще man pcap

Или найди libcap

PS: Программа для мирных целей. Для оценки работы сети.

Хто ж сумлевался-то? :-)

Good Luck,

UT

Genie

поглядеть исходник tcpdump, который это умеет делать.

Steck

Когда то разбирался с pcap

[root(~)] ./test
tun0: promiscuous mode enabled
Use iface tun0
205.188.8.173[5190] -> 205.188.8.173[56658] (8594)
87.103.141.5[56658] -> 87.103.141.5[5190] (1654)
205.188.8.173[5190] -> 205.188.8.173[56658] (6033)
87.103.141.5[56658] -> 87.103.141.5[5190] (1398)
205.188.8.173[5190] -> 205.188.8.173[56658] (50315)
87.103.141.5[56658] -> 87.103.141.5[5190] (1142)

Вот сам код..

#include "lib.h"
static pcap_t *pd;                                                                      struct ip *myip;
  struct tcphdr *mytcp;
void get(char *, struct pcap_pkthdr *, u_char *packet);
int main(int argc, char *argv[])
{
  struct bpf_program filter;
  char errbuf[PCAP_ERRBUF_SIZE];
  char *cmd;
  struct pcap_pkthdr handl;
  pcap_handler lsp;
  bpf_u_int32 localnet, netmask;
  char *iface = 0;
  const u_char *pack;
    if((iface = pcap_lookupdev(errbuf)) == 0)
    {
      fprintf(stderr,"%s\n",errbuf);
      exit(0);
    }
  printf("Use iface %s\n",iface);
  pd = pcap_open_live(iface,BUFSIZ,1,1000,errbuf); 1 - это твой promiscuous режим
  pcap_lookupnet(iface,&localnet,&netmask,errbuf);
  pcap_compile(pd,&filter,"ip proto TCP",0,netmask);
  pcap_setfilter(pd,&filter);
  lsp = (pcap_handler)get;
  if(pcap_loop(pd,-1,lsp,NULL)){
    pcap_perror(pd,"pcap_loop");
    pcap_close(pd);
    exit(0);
  }
  pcap_close(pd);
  return 0;
}
void get(char *user, struct pcap_pkthdr *header, u_char *pack)
{
  myip = (struct ip *)(pack + PPP_HDRLEN);
  mytcp = (struct tcphdr *)((char *)myip+(myip->ip_hl * 4));
  printf("%s[%d] -> %s[%d] (%u)\n",inet_ntoa(myip->ip_src),ntohs(mytcp->th_sport),inet_ntoa(myip->ip_dst),ntohs(mytcp->th_dport),myip->ip_sum);
}

Мож поможет..

Longobard

Если что — мы тебе этого не говорили ;)

Steck
LONGOBARD
Если что — мы тебе этого не говорили ;)

Ггг, сами мы не месные, от поезда отстали ага ;o)

wiener

А можно без использования p_cap, а то у меня через socket сделано:

//***

int s_handle = socket(PF_PACKET,SOCK_RAW,0×300);

if (s_handle == -1) {

printf(«Socket error\n»);

return 0;

}

if (setsockopt(s_handle,SOL_SOCKET, SO_BINDTODEVICE,«eth0\x00»,strlen(«eth0\x00»)+1)){

printf(«Bind error\n»);

return 0;

}

//***

Заранее благодарен.

wiener

Что вообще нет идей ?!

Longobard

через ioctl разве что…

rgo
wiener
Что вообще нет идей ?!

разбери на части ifconfig и tcpdump — там всё есть.

fly4life
rgo
разбери на части ifconfig и tcpdump — там всё есть.

Это tcpdump-то работает «без использования pcap"?

Daria_T

А знает ли кто-нибудь, как сделать это (перевести карту в promiscuous mode) на С для Винды, при помощи ioctl?

myst

В винде нет ioctl. В остальном — ждём decvar’а :))

decvar

он здесь. и удивляется недавнему запрету читать msdn пользователю Daria_T.

hint:

OID_GEN_PROMISCUOUS_MODE

RFC 2863

decvar

btw: ioctl в винде есть

myst

Ой. decvar следит за нами :)))