使用 UDP 发送多个十六进制数据包

使用 UDP 发送多个十六进制数据包

我正在尝试对连接到 Android 应用程序的 wifi 网络摄像头进行逆向工程。我嗅探了流量,发现当应用程序发送一系列 8 个 UDP 数据包时,交易就会启动,此时摄像机会将视频作为一系列 UDP 数据包流式传输到手机。我想从我的计算机向摄像机发送 8 个启动数据包,看看是否可以让摄像机流式传输到我的计算机。看起来 netcat 可能很有用,但数据并不像我发现的 netcat 示例中那样是很好的 ASCII 字符串。数据实际上是

4a:48:43:4d:44:d0:02
4a:48:43:4d:44:d0:02
4a:48:43:4d:44:d0:02
4a:48:43:4d:44:20:00:00:00:00:00
4a:48:43:4d:44:20:00:00:00:00:00
4a:48:43:4d:44:10:00
4a:48:43:4d:44:d0:01
4a:48:43:4d:44:d0:01

如何在 0.2 秒内将包含此数据的 UDP 数据包发送到特定 IP 地址和端口(最好使用简单的 CL 工具)?

答案1

这项任务不太适合通过命令行实用程序来完成 - 如果可以的话,您最好使用 Perl 或 Python 之类的工具来完成它,因为这些地方的网络 API 更加丰富。

话虽这么说......你当然可以使用 netcat 发送数据包,将十六进制数据传输到类似的东西xxd(RHEL/CentOS/Fedora 上的包的一部分vim-common- YMMV,如果你使用的是不同的 Linux 发行版...... )。

有一个工具叫数据包发送器(我承认我没有实际使用过,但它看起来很有趣)包括命令行功能来完成你想做的事情 - 挑战是我不知道它被打包用于任何 Linux 发行版,所以你会要么必须自己从源代码构建它,要么使用作者的预打包 AppImage 版本(如果您的发行版可以使用它)。

答案2

这可能远远超出了您正在寻找的范围,但您也可以在 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-endscope/)。

相关内容