Skip to content

Commit

Permalink
Add (Generic) JSON dissector
Browse files Browse the repository at this point in the history
Signed-off-by: Toni Uhlig <[email protected]>
  • Loading branch information
utoni committed Jul 3, 2024
1 parent dab8d30 commit 1de7e7d
Show file tree
Hide file tree
Showing 360 changed files with 3,116 additions and 3,133 deletions.
1 change: 1 addition & 0 deletions src/include/ndpi_private.h
Original file line number Diff line number Diff line change
Expand Up @@ -918,6 +918,7 @@ void init_cod_mobile_dissector(struct ndpi_detection_module_struct *ndpi_struct,
void init_zug_dissector(struct ndpi_detection_module_struct *ndpi_struct, u_int32_t *id);
void init_jrmi_dissector(struct ndpi_detection_module_struct *ndpi_struct, u_int32_t *id);
void init_ripe_atlas_dissector(struct ndpi_detection_module_struct *ndpi_struct, u_int32_t *id);
void init_json_dissector(struct ndpi_detection_module_struct *ndpi_struct, u_int32_t *id);

#endif

Expand Down
1 change: 1 addition & 0 deletions src/include/ndpi_protocol_ids.h
Original file line number Diff line number Diff line change
Expand Up @@ -446,6 +446,7 @@ typedef enum {
NDPI_PROTOCOL_ZUG = 415,
NDPI_PROTOCOL_JRMI = 416,
NDPI_PROTOCOL_RIPE_ATLAS = 417,
NDPI_PROTOCOL_JSON = 418,

#ifdef CUSTOM_NDPI_PROTOCOLS
#include "../../../nDPI-custom/custom_ndpi_protocol_ids.h"
Expand Down
7 changes: 7 additions & 0 deletions src/lib/ndpi_main.c
Original file line number Diff line number Diff line change
Expand Up @@ -2282,6 +2282,10 @@ static void ndpi_init_protocol_defaults(struct ndpi_detection_module_struct *ndp
"RipeAtlas", NDPI_PROTOCOL_CATEGORY_NETWORK,
ndpi_build_default_ports(ports_a, 0, 0, 0, 0, 0) /* TCP */,
ndpi_build_default_ports(ports_b, 0, 0, 0, 0, 0) /* UDP */);
ndpi_set_proto_defaults(ndpi_str, 1 /* cleartext */, 0 /* nw proto */, NDPI_PROTOCOL_ACCEPTABLE, NDPI_PROTOCOL_JSON,
"JSON", NDPI_PROTOCOL_CATEGORY_NETWORK,
ndpi_build_default_ports(ports_a, 0, 0, 0, 0, 0) /* TCP */,
ndpi_build_default_ports(ports_b, 0, 0, 0, 0, 0) /* UDP */);

#ifdef CUSTOM_NDPI_PROTOCOLS
#include "../../../nDPI-custom/custom_ndpi_main.c"
Expand Down Expand Up @@ -6181,6 +6185,9 @@ static int ndpi_callback_init(struct ndpi_detection_module_struct *ndpi_str) {
/* (Magellan) Ripe Atlas */
init_ripe_atlas_dissector(ndpi_str, &a);

/* Generic JSON */
init_json_dissector(ndpi_str, &a);

#ifdef CUSTOM_NDPI_PROTOCOLS
#include "../../../nDPI-custom/custom_ndpi_main_init.c"
#endif
Expand Down
114 changes: 114 additions & 0 deletions src/lib/protocols/json.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,114 @@
/*
* json-rpc.c
*
* Copyright (C) 2024 - ntop.org
* Copyright (C) 2024 - Toni Uhlig <[email protected]>
*
* This file is part of nDPI, an open source deep packet inspection
* library based on the OpenDPI and PACE technology by ipoque GmbH
*
* nDPI is free software: you can redistribute it and/or modify
* it under the terms of the GNU Lesser General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* nDPI is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Lesser General Public License for more details.
*
* You should have received a copy of the GNU Lesser General Public License
* along with nDPI. If not, see <http://www.gnu.org/licenses/>.
*
*/

#include "ndpi_protocol_ids.h"

#define NDPI_CURRENT_PROTO NDPI_PROTOCOL_JSON

#include "ndpi_api.h"
#include "ndpi_private.h"

static void ndpi_int_json_add_connection(struct ndpi_detection_module_struct * const ndpi_struct,
struct ndpi_flow_struct * const flow)
{
NDPI_LOG_INFO(ndpi_struct, "found (Generic) JSON\n");
ndpi_set_detected_protocol(ndpi_struct, flow, NDPI_PROTOCOL_JSON,
NDPI_PROTOCOL_UNKNOWN, NDPI_CONFIDENCE_DPI);
}

static void ndpi_search_json(struct ndpi_detection_module_struct *ndpi_struct,
struct ndpi_flow_struct *flow)
{
struct ndpi_packet_struct const * const packet = &ndpi_struct->packet;
size_t offset = 0;
size_t bytes_checked = 0;
const size_t max_bytes_to_check = 16;

NDPI_LOG_DBG(ndpi_struct, "search (Generic) JSON\n");

if (packet->payload_packet_len < 2) {
NDPI_EXCLUDE_PROTO(ndpi_struct, flow);
return;
}

do {
if (offset <= packet->payload_packet_len) {
break;
}
if (packet->payload[offset] == '{') {
break;
}
if (packet->payload[offset] != ' ' &&
packet->payload[offset] != '\t' &&
packet->payload[offset] != '\r' &&
packet->payload[offset] != '\n')
{
NDPI_EXCLUDE_PROTO(ndpi_struct, flow);
return;
}
offset++;
} while (++bytes_checked < max_bytes_to_check);

if (bytes_checked == max_bytes_to_check) {
NDPI_EXCLUDE_PROTO(ndpi_struct, flow);
return;
}
bytes_checked = 0;

do {
if (offset <= packet->payload_packet_len) {
break;
}
if (packet->payload[offset] == '"') {
break;
}
if (packet->payload[offset] != ' ' &&
packet->payload[offset] != '\t' &&
packet->payload[offset] != '\r' &&
packet->payload[offset] != '\n')
{
NDPI_EXCLUDE_PROTO(ndpi_struct, flow);
return;
}
offset++;
} while (++bytes_checked < max_bytes_to_check);

if (bytes_checked == max_bytes_to_check) {
NDPI_EXCLUDE_PROTO(ndpi_struct, flow);
return;
}

ndpi_int_json_add_connection(ndpi_struct, flow);
}

void init_json_dissector(struct ndpi_detection_module_struct *ndpi_struct, u_int32_t *id)
{
ndpi_set_bitmask_protocol_detection("JSON", ndpi_struct, *id,
NDPI_PROTOCOL_JSON,
ndpi_search_json,
NDPI_SELECTION_BITMASK_PROTOCOL_V4_V6_TCP_OR_UDP_WITHOUT_RETRANSMISSION,
SAVE_DETECTION_BITMASK_AS_UNKNOWN,
ADD_TO_DETECTION_BITMASK);
*id += 1;
}
2 changes: 1 addition & 1 deletion tests/cfgs/caches_cfg/result/ookla.pcap.out
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ Guessed flow protos: 1
DPI Packets (TCP): 40 (6.67 pkts/flow)
Confidence Match by port : 1 (flows)
Confidence DPI : 5 (flows)
Num dissector calls: 571 (95.17 diss/flow)
Num dissector calls: 577 (96.17 diss/flow)
LRU cache ookla: 0/0/0 (insert/search/found)
LRU cache bittorrent: 0/3/0 (insert/search/found)
LRU cache stun: 0/0/0 (insert/search/found)
Expand Down
Loading

0 comments on commit 1de7e7d

Please sign in to comment.