我的 arpwatch 修改筆記

修改目的

  1. 暫時取消 sendmail 的功能
  2. 能保持 database,只針對違法使用者警告
  3. 只過濾特定網域封包
  4. 把顯示介面弄好看些

起點 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 正確度