Отправка нескольких пакетов шестнадцатеричных данных по протоколу UDP

Использование замены процесса иpaste:

$ paste <(cut -f2 numbers) <(cut -f1 numbers)
2        1
20       10
200      100
2000     1000
20000    10000
300000   100000
3000000  1000000
0
03.10.2020, 04:45
2 ответа

Эта задача не очень хорошо подходит для выполнения с помощью утилит командной строки. -Вам лучше выполнять ее в чем-то вроде Perl или Python, если вы можете, где сетевые API намного богаче.

При этом... вы, безусловно, можете использовать netcat для отправки ваших пакетов, передавая шестнадцатеричные данные во что-то вродеxxd(части пакета vim-commonв RHEL/CentOS/Fedora -YMMV, если вы используя другой дистрибутив Linux... ).

Существует инструмент под названием PacketSender (, которым, признаюсь, я на самом деле не пользовался, но он выглядит интересным, )который включает в себя функциональность командной строки -для того, чтобы делать то, что вы хотите -что я не знаю, чтобы он был упакован для каких-либо дистрибутивов Linux, поэтому вам придется либо собрать его из исходного кода самостоятельно, либо использовать предварительно -упакованный выпуск AppImage автора, если ваш дистрибутив может его использовать.

1
18.03.2021, 23:00

Это может быть далеко за пределами того, что вы искали, но вы также можете сделать это на C. Вот пример программы, которая отправляет байты в вашем примере:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <arpa/inet.h>

/* You'd need to change the following values to match your environment */
#define DESTINATION_ADDRESS "127.0.0.1"
#define DESTINATION_PORT    8080
#define MAX_MESSAGE_LENGTH 11

struct message {
    int length;
    char bytes[MAX_MESSAGE_LENGTH];
};

int main(void)
{
    const int sockfd = socket(AF_INET, SOCK_DGRAM, 0);
    if (sockfd < 0) {
        perror("socket");
        exit(EXIT_FAILURE);
    }

    const struct message messageList[] = {
        {.length =  7,.bytes = { 0x4a, 0x48, 0x43, 0x4d, 0x44, 0xd0, 0x02} },
        {.length =  7,.bytes = { 0x4a, 0x48, 0x43, 0x4d, 0x44, 0xd0, 0x02} },
        {.length =  7,.bytes = { 0x4a, 0x48, 0x43, 0x4d, 0x44, 0xd0, 0x02} },
        {.length = 11,.bytes = { 0x4a, 0x48, 0x43, 0x4d, 0x44, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00} },
        {.length = 11,.bytes = { 0x4a, 0x48, 0x43, 0x4d, 0x44, 0x20, 0x00, 0x00, 0x00, 0x00, 0x00} },
        {.length =  7,.bytes = { 0x4a, 0x48, 0x43, 0x4d, 0x44, 0x10, 0x00} },
        {.length =  7,.bytes = { 0x4a, 0x48, 0x43, 0x4d, 0x44, 0xd0, 0x01} },
        {.length =  7,.bytes = { 0x4a, 0x48, 0x43, 0x4d, 0x44, 0xd0, 0x01} },
        { },
    };

    const struct sockaddr_in servaddr = {
       .sin_family      = AF_INET,
       .sin_port        = htons(DESTINATION_PORT),
       .sin_addr.s_addr = inet_addr(DESTINATION_ADDRESS),
    };

    for (int i = 0; messageList[i].length != 0; ++i) {
        if (sendto(sockfd,
                   messageList[i].bytes,
                   messageList[i].length,
                   0,
                   (const struct sockaddr*) &servaddr,
                   sizeof(servaddr)) < 0) {
            perror("sendto");
        }
    }

    close(sockfd);
    return EXIT_SUCCESS;
}

Программа создает массив сообщений с именем messageList. Каждая запись в массиве включает (1 )длину сообщения и (2 )массив байтов в сообщении. Сообщение длины 0 завершает список.

Затем программа создает объект с именем servaddr, описывающий, куда отправить сообщение и протокол.

Наконец, программа перебирает сообщения одно за другим и отправляет их адресату.

Для компиляции программы:

$ gcc client.c

Это создаст программу с именем a.out.

Вы можете настроить tcpdumpдля просмотра сообщений:

$ sudo tcpdump -i lo -Xn '(udp port 8080)'
dropped privs to tcpdump
tcpdump: verbose output suppressed, use -v or -vv for full protocol decode
listening on lo, link-type EN10MB (Ethernet), capture size 262144 bytes

Затем запуститеa.out:

$./a.out

И я получаю следующий результат отtcpdump:

20:18:19.429320 IP 127.0.0.1.58915 > 127.0.0.1.8080: UDP, length 7
    0x0000:  4500 0023 bf9f 4000 4011 7d28 7f00 0001  E..#..@.@.}(....
    0x0010:  7f00 0001 e623 1f90 000f fe22 4a48 434d .....#....."JHCM
    0x0020:  44d0 02                                  D..
20:18:19.429629 IP 127.0.0.1.58915 > 127.0.0.1.8080: UDP, length 7
    0x0000:  4500 0023 bfa0 4000 4011 7d27 7f00 0001  E..#..@.@.}'....
    0x0010:  7f00 0001 e623 1f90 000f fe22 4a48 434d .....#....."JHCM
    0x0020:  44d0 02                                  D..
20:18:19.429842 IP 127.0.0.1.58915 > 127.0.0.1.8080: UDP, length 7
    0x0000:  4500 0023 bfa1 4000 4011 7d26 7f00 0001  E..#..@.@.}&....
    0x0010:  7f00 0001 e623 1f90 000f fe22 4a48 434d .....#....."JHCM
    0x0020:  44d0 02                                  D..
20:18:19.429906 IP 127.0.0.1.58915 > 127.0.0.1.8080: UDP, length 11
    0x0000:  4500 0027 bfa2 4000 4011 7d21 7f00 0001  E..'..@.@.}!....
    0x0010:  7f00 0001 e623 1f90 0013 fe26 4a48 434d .....#.....&JHCM
    0x0020:  4420 0000 0000 00                        D......
20:18:19.429979 IP 127.0.0.1.58915 > 127.0.0.1.8080: UDP, length 11
    0x0000:  4500 0027 bfa3 4000 4011 7d20 7f00 0001  E..'..@.@.}.....
    0x0010:  7f00 0001 e623 1f90 0013 fe26 4a48 434d .....#.....&JHCM
    0x0020:  4420 0000 0000 00                        D......
20:18:19.430086 IP 127.0.0.1.58915 > 127.0.0.1.8080: UDP, length 7
    0x0000:  4500 0023 bfa4 4000 4011 7d23 7f00 0001  E..#..@.@.}#....
    0x0010:  7f00 0001 e623 1f90 000f fe22 4a48 434d .....#....."JHCM
    0x0020:  4410 00                                  D..
20:18:19.430539 IP 127.0.0.1.58915 > 127.0.0.1.8080: UDP, length 7
    0x0000:  4500 0023 bfa5 4000 4011 7d22 7f00 0001  E..#..@.@.}"....
    0x0010:  7f00 0001 e623 1f90 000f fe22 4a48 434d .....#....."JHCM
    0x0020:  44d0 01                                  D..
20:18:19.430652 IP 127.0.0.1.58915 > 127.0.0.1.8080: UDP, length 7
    0x0000:  4500 0023 bfa6 4000 4011 7d21 7f00 0001  E..#..@.@.}!....
    0x0010:  7f00 0001 e623 1f90 000f fe22 4a48 434d .....#....."JHCM
    0x0020:  44d0 01                                  D..

Обратите внимание, что каждое сообщение начинается с JHCMD--, что может быть интересно для вашего расследования (, например,https://shkspr.mobi/blog/2020/06/review-wifi-endoscope/).

0
18.03.2021, 23:00

Теги

Похожие вопросы