libtins Sniffer не определено - PullRequest
0 голосов
/ 25 марта 2020
#include <iostream>
#include <tins/tins.h>

using namespace Tins;
using namespace std;

bool callback(const PDU& pdu) {
    // Find the IP layer
    const IP& ip = pdu.rfind_pdu<IP>();
    // Find the TCP layer
    const TCP& tcp = pdu.rfind_pdu<TCP>();
    cout << ip.src_addr() << ":" << tcp.sport() << " -> "
         << ip.dst_addr() << ":" << tcp.dport() << endl;
    return true;
}

int main() {
    Sniffer("eth0").sniff_loop(callback);
}

У меня есть код по умолчанию libtins, но по какой-то причине Sniffer не определено. Я включил все библиотеки в мой компоновщик.

Также при сборке он выдает следующую ошибку:

-- Build started: Project: Packet Sniffing, Configuration: Debug x64 ------
1>Packet Sniffing.cpp
1>C:\Users\usr\Documents\Code\C++ Projects\static\libtins\include\tins\macros.h(37,10): fatal error C1083: Cannot open include file: 'tins/config.h': No such file or directory
1>Done building project "Packet Sniffing.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Я проверил, и нет файла с именем config.h, однако есть один называется config.h.in. Когда я удалил .in, он дал мне еще одну ошибку:

1>------ Build started: Project: Packet Sniffing, Configuration: Debug x64 ------
1>Packet Sniffing.cpp
1>C:\Users\usr\Documents\Code\C++ Projects\static\libtins\include\tins\config.h(5,1): fatal error C1021: invalid preprocessor command 'cmakedefine'
1>Done building project "Packet Sniffing.vcxproj" -- FAILED.
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========

Единственная инструкция, которую я не понял на их веб-сайте , - это когда они говорят

Вам также нужно добавить это макроопределение в ваш проект:

TINS_STATI C

Я точно не знаю, что это значит, поэтому это также может быть проблемой.

Заранее спасибо!

1 Ответ

0 голосов
/ 04 апреля 2020

Вот инструкции по использованию libtins на Windows. Вы можете использовать предварительно скомпилированную библиотеку или скомпилировать libtins самостоятельно. Если вы не уверены, я бы порекомендовал использовать предварительно скомпилированную версию libtins, потому что это меньше работает.

Все эти инструкции основаны на ссылка .

Использование предварительно скомпилированных библиотек в Windows

  • Загрузка предварительно скомпилированных библиотек. Выберите нужную целевую платформу здесь (отладка / выпуск, 32/64 бит). Справа нажмите «Артефакты», затем загрузите zip-архив. Распакуйте почтовый индекс. Внутри вы найдете папку include и lib.

  • Загрузите npcap SDK с здесь . Распакуйте архив zip. Внутри вы найдете папку Include и Lib. Обратите внимание, что папка lib имеет 64-битный вариант в качестве подпапки (Lib/x64).

  • В Visual Studio откройте настройки своего проекта. Вверху убедитесь, что конфигурация / платформа соответствуют требуемой целевой платформе (отладка / выпуск, 32/64 бит).

    • Под C/C++> General> Additional include directories , добавьте каталоги включения libtins и npcap. Например, он должен выглядеть примерно так: <some-path>\libtins-vs2015-x64-release\libtins\include;<some-path>\npcap-sdk-1.05\Include;%(AdditionalIncludeDirectories).

      Объяснение: Без этого Visual Studio не сможет найти заголовки libtins и npcap. Вы получите такие ошибки, как:

      • E1696 cannot open source file "tins/tins.h"
      • E0020 identifier "PDU" is undefined
      • E1696 cannot open source file "pcap.h"
      • E0020 identifier "pcap_t" is undefined
    • Под C/C++> Preprocessor> Preprocessor definitions, добавить TINS_STATIC.

      Объяснение: Это эквивалентно добавлению #define TINS_STATIC в ваш код перед включением любых заголовков libtins. Это заставит libtins опускать любые операторы dllexport / dllimport в своих заголовках, что будет необходимо, если вы будете использовать libtins как разделяемую / dynamici c библиотеку, а не как библиотеку stati c (для более подробной информации). info см. link , link и в исходном коде libtins include/tins/macros.h о том, как TINS_STATIC используется). Без этого вы получите такие ошибки, как:

      • C4251 'Tins::DNS::records_data_': class 'std::vector<uint8_t,std::allocator<uint8_t>>' needs to have dll-interface to be used by clients of class 'Tins::DNS'
      • LNK2001 unresolved external symbol "__declspec(dllimport) public: __cdecl Tins::Sniffer::Sniffer(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)"
    • Under Linker> General> Additional library directories, добавьте каталоги lib библиотек libtins и npcap. Выберите правильный каталог lib для npcacp (32/64 бит) в зависимости от вашей целевой платформы. Результат должен выглядеть примерно так: <some-path>\libtins-vs2015-x64-release\libtins\lib;<some-path>\npcap-sdk-1.05\Lib\x64;%(AdditionalLibraryDirectories).

      Объяснение: Без этого Visual Studio не сможет найти библиотеки libtins и npcap. Вы получите такие ошибки, как:

      • LNK1181 cannot open input file 'tins.lib'
      • LNK1181 cannot open input file 'Packet.lib'
    • Under Linker> Input> Additional dependencies, добавить tins.lib, библиотеки npcap Packet.lib, wpcap.lib и библиотеки Windows Iphlpapi.lib, Ws2_32.lib. Результат должен выглядеть примерно так: tins.lib;Packet.lib;wpcap.lib;Iphlpapi.lib;Ws2_32.lib;%(AdditionalDependencies).

      Объяснение: Это позволит Visual Studio связываться с двоичными файлами libtins и npcap, а также с необходимыми сетевыми библиотеками Windows. Без этого вы получите такие ошибки, как:

      • LNK2001 unresolved external symbol "public: __cdecl Tins::Sniffer::Sniffer(class std::basic_string<char,struct std::char_traits<char>,class std::allocator<char> > const &)"
      • LNK2001 unresolved external symbol pcap_lookupnet
      • LNK2001 unresolved external symbol GetAdaptersAddresses
      • LNK2001 unresolved external symbol __imp_inet_pton
    • В своем исходном коде убедитесь, что вы добавили #include <algorithm> перед тем, как включать любые заголовки libtins.

      Объяснение: Без этого я получил C2039 'min': is not a member of 'std'.

  • Теперь ваш код должен скомпилироваться. Однако обратите внимание, что eth0 - это имя интерфейса Linux -specifi c. По всей вероятности, он не даст никакого вывода на Windows. Обратитесь к этой ссылке , чтобы узнать, как определить имя сетевого интерфейса на Windows. Поэтому вместо eth0 ваше имя должно быть более длинным в виде {XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXX}.

Компиляция libtins из источника на Windows

В качестве предварительного условия, Вы должны знать, как использовать командную строку.

  • Установить cmake ( link )
  • Загрузить исходный код libtins ( link ) , распакуйте архив.
  • Загрузите SDK npcap, как и раньше. Я не пытался также скомпилировать npcap из исходного кода.
  • В папке с исходным кодом libtins откройте командную строку. Выполните следующие команды, адаптируйте PCAP_ROOT_DIR к тому месту, где вы скачали npcap SDK. Также адаптируйтесь к желаемой конфигурации (отладка / выпуск).
mkdir build
cd build
& 'C:\Program Files\CMake\bin\cmake.exe' ../ -DPCAP_ROOT_DIR=<some-path>\npcap-sdk-1.05\ -DLIBTINS_ENABLE_WPA2=0 -DLIBTINS_BUILD_SHARED=off -DCMAKE_BUILD_TYPE=Release
& 'C:\Program Files\CMake\bin\cmake.exe' --build . --config Release
  • В исходной папке libtins в .\build\lib\Release у вас теперь должен быть tins.lib.
  • Следуйте инструкциям для Visual Studio, приведенным выше, но адаптируйте пути для libtins к вашей скомпилированной версии:
    • Для «Дополнительные каталоги библиотеки» используйте, например, <some-path>\libtins-master\build\lib\Release.
    • Для «Дополнительные каталоги включения», используйте, например, <some-path>\libtins-master\include.

Обратите внимание, что это не включит все функции libtins. Для этого вам нужно будет установить дополнительные зависимости (openssl, boost). Первая команда cmake должна сообщить вам, какие функции были включены.

...