
Androidアプリケーションに接続されているWi-Fiウェブカメラをリバースエンジニアリングしようとしています。トラフィックをスニッフィングした結果、アプリケーションが一連の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
このデータを含むUDPパケットを0.2秒以内に特定のIPアドレスとポートに送信するにはどうすればよいですか(簡単なCLツールを使用することをお勧めします)。
答え1
これは、コマンドラインユーティリティを介して実行するのには適していません。可能であれば、ネットワーキングAPIが豊富なPerlやPythonのようなものを使用する方が良いでしょう。
つまり、netcatを使用してパケットを送信し、16進データを同様のものとして送信できます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
メッセージが送信される場所とプロトコルを記述するオブジェクトを作成します。
最後に、プログラムはメッセージを1つずつ繰り返して宛先に送信します。
コンパイラ:
$ 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/)。