我正在尝试对连接到 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/)。