Сниффер пакетов Python и сокеты для новичков

Итак, у меня есть несколько вопросов о сокетах и ​​программировании снифферов... Я только начал программировать, и у меня есть проект, в котором я хотел бы использовать информацию, отправляемую по моей сети.

Я попытался просмотреть несколько видеороликов на YouTube, в которых немного рассказывается об этом процессе, и попытался найти лучший материал для дальнейшего изучения, но я не смог найти источник, который имел бы для меня смысл.

Код, который я включил, взят из видео на YouTube и, казалось, имел смысл, когда они его объяснили, но я предполагаю, что он мог использовать Linux или что-то еще, потому что Windows не поддерживала AF_PACKET. После некоторых исследований я обнаружил, что люди используют AF_INET, но я получил ошибку:

OSError: [WinError 10043] Запрошенный протокол не настроен в системе или для него не существует реализации

Есть ли место или способ, которым кто-то мог бы немного объяснить мне сокеты? Я не планирую использовать Windows для окончательной версии этого проекта, и я также планирую изменить его для Bluetooth в будущем, поэтому я хотел бы узнать причины, лежащие в основе вещей, если я смогу найти способ сделать это.

`импортировать структуру импорта сокета, импортировать текстовую обертку

def main():
    conn = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.ntohs(3))
        while True:
        raw_data, addr = conn.recvfrom(65535)
        dest_mac, src_mac, eth_proto, data = ethernet_frame(raw_data)
        print('\nEthernet Frame:')
        print('Destination: {}, Source: {}, Protocol: {}'.format(dest_mac, src_mac, eth_proto, data[:14]))


#unpack ethernet frame
def ethernet_frame(data):
     dest_mac, src_mac, proto = struct.unpack('! 6s 6s H', data[:14])
     return get_mac_addr(dest_mac), get_mac_addr(src_mac), socket.htons(proto), data[14:]

#Get Mac Address
def get_mac_addr(bytes_addr):
    bytes_str = map('{:02x}'.format, bytes_addr)
    return ':'.join(bytes_str).upper()

main()

`


person ThatCampbellKid    schedule 04.02.2016    source источник
comment
Вы запускали это как администратор?   -  person kichik    schedule 05.02.2016
comment
Хорошо, я что-то видел об этом... И я думаю, что пробовал версию этого. То, что я пробовал, запускало его на питоне после того, как я включил запуск от имени администратора в совместимости в свойствах ... Но я ничего не пробовал с помощью команды @kichik   -  person ThatCampbellKid    schedule 05.02.2016


Ответы (1)


ОС, в которых вы используете сокет для перехвата пакетов:

  1. линукс
  2. Ирикс

Windows нет в этом списке (как и ничего с «BSD» в названии, OS X, Solaris, HP-UX, AIX и т. д.). И Linux, и Irix используют сокеты для прослушивания, но это только их выбор (и они не выбрали один и тот же тип сокета, они просто выбрали сокеты).

Если вы хотите написать сниффер, вам, вероятно, лучше всего порекомендовать использовать обертку вокруг libpcap/WinPcap и позволить им разобраться с болезненными деталями того, как сниффинг пакетов выполняется в конкретной операционной системе. Оболочки для Python включают pylibpcap и pcapy; Я не знаю, работает ли какой-либо из них в Windows с WinPcap.

(Обратите внимание, что вы не гарантируете получение заголовков Ethernet в перехваченных пакетах; вы должны вызвать pcap_datalink() или любой другой эквивалент оболочки и проверить его возвращаемое значение — если это не DLT_EN10MB или эквивалент оболочки, вы не получите Ethernet. заголовки.)

AF_INET необработанные сокеты на любой платформе не дадут вам заголовков Ethernet. Я не знаю, что вы получите с аргументом протокола, равным 3. 3 — это номер интернет-протокола для GGP, согласно RFC 823 Приложение A, и этот протокол является древним и, насколько мне известно, не используется; вы, вероятно, получите сокет, на который вы можете отправлять пакеты GGP и из которого вы можете получать пакеты GGP, для чего это стоит (что не так много). (Кроме того, аргументы вызова socket() в C находятся в порядке байтов хоста, и Python, вероятно, работает так же, поэтому вы, вероятно, не хотите, чтобы этот socket.ntohs() был там, не то чтобы это имело значение.)

person Community    schedule 07.02.2016
comment
Потрясающий! Это гораздо более прямая информация, чем я смог найти где-либо еще. Я видел кое-что о WinPcap и некоторых других опциях, но не нашел реального объяснения причин их использования. Это определенно должно помочь, для этого конкретного проекта я не думаю, что мне понадобятся заголовки, я просто хочу преобразовать все захваты в шестнадцатеричный код, но он мне обязательно понадобится в следующей версии. Итак, действия канала передачи данных тестируют заголовки? @guyharris - person ThatCampbellKid; 07.02.2016
comment
pcap_datalink() возвращает значение, указывающее, какие заголовки находятся в начале пакета; вот подробный список возможных значений. Если вы просто конвертируете в шестнадцатеричный формат, делайте это побайтно, не обрабатывая разные байты по-разному — не предполагайте, например, что пакет начинается, например, с двух 6-байтовых MAC-адресов. - person ; 07.02.2016
comment
Хорошо, последний вопрос... Обещаю! Лол, есть ли хороший ресурс, чтобы получить немного больше базовой информации о сетевом интерфейсе? У меня есть колоссальные недели опыта работы с Google в области программирования и работы с сетями... @guyharris - person ThatCampbellKid; 07.02.2016
comment
Какого рода информацию вы ищете? Существует много типов информации, поэтому существуют разные ресурсы для разной информации. - person ; 08.02.2016
comment
Да, это было довольно широко. Если у вас есть какие-либо идеи по основам сокетов и связи устройств, это было бы здорово! Мне кажется, что о них труднее всего найти информацию. @guyharris - person ThatCampbellKid; 08.02.2016
comment
Я не знаю, что такое хороший учебник; попробуйте поискать в Интернете и посмотреть, что появится. - person ; 10.02.2016