修改目的
起點 arpwatch.c main()
處理一些參數 then fork,先執行
pcap_compile() => 編譯 filter
pcap_setfilter() => 設定 filter
if (pcap_compile(pd, &code,
"arp or rarp", 1, netmask) < 0) {
syslog(LOG_ERR, "pcap_compile: %s", pcap_geterr(pd));
exit(1);
}
if (pcap_setfilter(pd, &code) < 0) {
syslog(LOG_ERR, "pcap_setfilter: %s", pcap_geterr(pd));
exit(1);
}
呼叫 pcap_loop() =>
封包抓取程式
case DLT_EN10MB:
status = pcap_loop(pd, 0, process_ether, NULL);
break;
process_ether() => 處理 libpcap 傳回資料,call util.c dosyslog() 及 db.c ent_add()
/* Watch for ethernet broadcast */
if (MEMCMP(sea, zero, 6) == 0 || MEMCMP(sea, allones, 6) == 0 ||
MEMCMP(sha, zero, 6) == 0 || MEMCMP(sha, allones, 6) == 0) {
dosyslog(LOG_INFO, "ethernet broadcast", sia, sea, sha);
return;
}
/* Got a live one */
t = h->ts.tv_sec;
can_checkpoint = 0;
if (!ent_add(sia, sea, t, NULL))
syslog(LOG_ERR, "ent_add(%s, %s, %ld) failed",
intoa(sia), e2str(sea), t);
can_checkpoint = 1;
}
dosyslog() 只是一個包裝 syslog 的介面函式,不改。
db.c ent_add()
關閉 ap->elist 交換的動作,使原始資料一直保持為 elist[0]
report.c report()
關閉執行 sendmail 的部分
util.c readdata()
=> 讀取資料庫
arpfile 格式:卡號 IP [timestamp] [hostname]
file_loop() => 似乎只是檢查 database 正確度