Как посчитать ответный пакет ARP в минуту? - PullRequest
0 голосов
/ 31 декабря 2018

Я устанавливаю локальную топологию, используя GNS3.Так что я использую HUB, так что сценарий.В сети 5 компьютеров (компьютер A, B, C, D, E), и компьютер A должен считать ARP-пакет ответа в сети.например, компьютер A может обнаружить, что компьютер B отправляет ответный пакет ARP на компьютер C 1 / мин.Давайте предположим, что компьютер А является хостом анализатора.

  1. Компьютер B имеет IP: 192.168.1.2
  2. Компьютер C имеет IP: 192.168.1.3
  3. Компьютер D имеет IP: 192.168.1.4
  4. Компьютер E имеет Ip: 192.168.1.5

И я использую список в словаре фитона, код:

from scapy.all import *
reply=[]
reply.append({"src": " ", "dst" :" ","count": 0}]

def count_reply(paket): 
    for itung in reply:
        if itung['src']==paket['src'] and itung['dst']==paket['dst']:
            itung['count']+=1
            break       
        elif itung['src'] != paket['src'] and itung['dst'] != paket['dst']:
            reply.append(paket)
            paket['count']=1

def klasifikasi(pkt):
    # arp request
    if pkt[ARP].op == 2:
        returnpaket = {'src':pkt[ARP].psrc,'dst':pkt[ARP].pdst}
        return count_reply(returnpaket)

sniff(prn=klasifikasi, filter="arp", store=0)
print(reply)

И я попытался отправить ответ arp floodingс компьютера C на компьютер B. Отправленный ответный пакет ARP состоит из 7 пакетов.я ожидал, что выходной сигнал будет reply=[{'count':0, 'src':" ", 'dst':" "}, {'count':7, 'src':192.168.1.3, 'dst':192.168.1.2}, но фактический выходной сигнал будет

The Actual Output

Я следую коду, используя решение, которое я спросил вчера здесь Как удалить дубликаты в списке? Как я могу их решить?Пожалуйста, помогите мне, это для моей домашней работы.Спасибо.

1 Ответ

0 голосов
/ 31 декабря 2018

Причиной нескольких записей в вашем результате является то, что у вас уже есть элемент в списке ответов ({"src": "", "dst": "", "count": 0}), что вызываетВаш код всегда запускает часть «elif» в вашем цикле (функция count_reply).

Вы должны проверить каждый элемент в вашем списке ответов, прежде чем принимать решение о создании новой записи или обновлении существующей записи.

Например:

def count_reply(paket):
    if len(reply)==0:
        paket['count'] = 1
        reply.append(paket)
        found = True
    else:
        found = False
        for itung in reply:
            if itung['src']==paket['src'] and itung['dst']==paket['dst']:
                itung['count']+=1
                found = True
                break
    if not found:
        reply.append(paket)
        paket['count']=1
...