annotate tfo/find-is-hdr.c @ 14:98c0881c2af0

tfo/find-is-hdr: move here from freecalypso-reveng This little program was developed in freecalypso-reveng Hg repository in 2023-03, when we didn't have a separate repository for network-side reverse eng, but now that we do have separate repositories for FreeCalypso (mobile side) vs network side reverse eng, move TFO RE work to the proper place.
author Mychaela Falconia <falcon@freecalypso.org>
date Fri, 24 May 2024 21:18:22 +0000
parents
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
14
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
1 /*
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
2 * This program reads a binary file containing a G.711 PCM stream capture
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
3 * and looks for an IS_Header pattern as defined in ETSI TS 101 504
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
4 * (GSM 08.62) section A.1.2. The objective is to analyze PCM streams
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
5 * originating from extant commercial GSM network operators and see if
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
6 * they implement in-band TFO.
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
7 */
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
8
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
9 #include <sys/types.h>
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
10 #include <sys/file.h>
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
11 #include <sys/stat.h>
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
12 #include <sys/mman.h>
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
13 #include <stdio.h>
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
14 #include <stdlib.h>
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
15 #include <unistd.h>
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
16
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
17 static char *pcmfile;
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
18 static size_t pcm_file_size;
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
19 static u_char *filemap;
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
20
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
21 static const u_char hdr_pattern[20] = {0, 1, 0, 1, 0, 1, 1, 0, 1, 0,
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
22 0, 1, 1, 0, 1, 0, 1, 0, 0, 1};
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
23
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
24 static void
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
25 mmap_pcm_file()
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
26 {
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
27 int fd;
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
28 struct stat st;
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
29
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
30 fd = open(pcmfile, O_RDONLY);
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
31 if (fd < 0) {
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
32 perror(pcmfile);
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
33 exit(1);
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
34 }
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
35 fstat(fd, &st);
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
36 if (!S_ISREG(st.st_mode)) {
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
37 fprintf(stderr, "error: %s is not a regular file\n", pcmfile);
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
38 exit(1);
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
39 }
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
40 pcm_file_size = st.st_size;
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
41 if (pcm_file_size < 320) {
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
42 fprintf(stderr, "error: %s is too short\n", pcmfile);
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
43 exit(1);
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
44 }
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
45 filemap = mmap(NULL, pcm_file_size, PROT_READ, MAP_PRIVATE, fd, 0L);
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
46 if (filemap == MAP_FAILED) {
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
47 perror("mmap");
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
48 exit(1);
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
49 }
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
50 close(fd);
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
51 }
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
52
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
53 static void
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
54 try_offset(offset)
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
55 size_t offset;
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
56 {
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
57 unsigned n;
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
58
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
59 for (n = 0; n < 20; n++) {
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
60 if ((filemap[offset + n * 16] & 1) != hdr_pattern[n])
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
61 return;
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
62 }
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
63 printf("Found IS_Header at offset %lu (0x%lx)\n", (u_long) offset,
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
64 (u_long) offset);
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
65 }
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
66
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
67 main(argc, argv)
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
68 char **argv;
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
69 {
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
70 size_t offset, endoff;
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
71
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
72 if (argc != 2) {
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
73 fprintf(stderr, "usage: %s pcm-capture-file\n", argv[0]);
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
74 exit(1);
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
75 }
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
76 pcmfile = argv[1];
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
77 mmap_pcm_file();
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
78 endoff = pcm_file_size - 320;
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
79 for (offset = 0; offset <= endoff; offset++)
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
80 try_offset(offset);
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
81 exit(0);
98c0881c2af0 tfo/find-is-hdr: move here from freecalypso-reveng
Mychaela Falconia <falcon@freecalypso.org>
parents:
diff changeset
82 }