WIP: parse dns packet
This commit is contained in:
parent
0166c01eba
commit
9525c64917
4 changed files with 44 additions and 12 deletions
10
bin/main.ml
10
bin/main.ml
|
@ -1,12 +1,8 @@
|
||||||
open Dnstoy
|
open Dnstoy
|
||||||
|
|
||||||
let () =
|
let () =
|
||||||
let response = Network.send_request "8.8.8.8" "www.example.com" in
|
let response = Network.send_request "8.8.8.8" "www.mylloon.fr" in
|
||||||
print_endline (Utils.get_bytecode response);
|
print_endline (Utils.get_bytecode response);
|
||||||
let reader, dns_header = Response.parse_header { data = response; pointer = 0 } in
|
let dns_packet = Response.parse_dns_packet response in
|
||||||
let reader', dns_question = Response.parse_question reader in
|
print_endline (Debug.dns_packet dns_packet)
|
||||||
let dns_record = Response.parse_record reader' in
|
|
||||||
Debug.print_dns_header dns_header;
|
|
||||||
Debug.print_dns_question dns_question;
|
|
||||||
Debug.print_dns_record dns_record
|
|
||||||
;;
|
;;
|
||||||
|
|
12
lib/debug.ml
12
lib/debug.ml
|
@ -27,3 +27,15 @@ let dns_record (record : Types.dns_record) =
|
||||||
record.ttl
|
record.ttl
|
||||||
(Utils.get_bytecode ~json:true record.data)
|
(Utils.get_bytecode ~json:true record.data)
|
||||||
;;
|
;;
|
||||||
|
|
||||||
|
let dns_packet (record : Types.dns_packet) =
|
||||||
|
let list fn l = String.concat ", " (List.map (fun el -> fn el) l) in
|
||||||
|
Printf.sprintf
|
||||||
|
"{ \"header\": %s, \"questions\": [%s], \"answers\": [%s], \"authorities\": [%s], \
|
||||||
|
\"additionals\": [%s] }"
|
||||||
|
(dns_header record.header)
|
||||||
|
(list dns_question record.questions)
|
||||||
|
(list dns_record record.answers)
|
||||||
|
(list dns_record record.authorities)
|
||||||
|
(list dns_record record.additionals)
|
||||||
|
;;
|
||||||
|
|
|
@ -47,10 +47,26 @@ and decode_compressed_name reader length =
|
||||||
let parse_record reader =
|
let parse_record reader =
|
||||||
let name, offset_name = decode_name reader in
|
let name, offset_name = decode_name reader in
|
||||||
let data = bytes_forward reader.data (offset_name + reader.pointer) in
|
let data = bytes_forward reader.data (offset_name + reader.pointer) in
|
||||||
{ name
|
let data_len = unpack_short_be data 8 in
|
||||||
; type_ = unpack_short_be data 0
|
let record_len = 10 in
|
||||||
; class_ = unpack_short_be data 2
|
( { reader with pointer = reader.pointer + offset_name + record_len + data_len }
|
||||||
; ttl = unpack_int_be data 4
|
, { name
|
||||||
; data = Bytes.sub data 10 (unpack_short_be data 8)
|
; type_ = unpack_short_be data 0
|
||||||
|
; class_ = unpack_short_be data 2
|
||||||
|
; ttl = unpack_int_be data 4
|
||||||
|
; data = Bytes.sub data record_len data_len
|
||||||
|
} )
|
||||||
|
;;
|
||||||
|
|
||||||
|
let parse_dns_packet data =
|
||||||
|
let reader, dns_header = parse_header { data; pointer = 0 } in
|
||||||
|
(* Quid du pointeur du reader, pas récupéré à chaque itération... *)
|
||||||
|
{ header = dns_header
|
||||||
|
; questions = List.init dns_header.num_questions (fun _ -> snd (parse_question reader))
|
||||||
|
; answers = List.init dns_header.num_answers (fun _ -> snd (parse_record reader))
|
||||||
|
; authorities =
|
||||||
|
List.init dns_header.num_authorities (fun _ -> snd (parse_record reader))
|
||||||
|
; additionals =
|
||||||
|
List.init dns_header.num_additionals (fun _ -> snd (parse_record reader))
|
||||||
}
|
}
|
||||||
;;
|
;;
|
||||||
|
|
|
@ -25,3 +25,11 @@ type dns_record =
|
||||||
; ttl : int
|
; ttl : int
|
||||||
; data : bytes
|
; data : bytes
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type dns_packet =
|
||||||
|
{ header : dns_header
|
||||||
|
; questions : dns_question list
|
||||||
|
; answers : dns_record list
|
||||||
|
; authorities : dns_record list
|
||||||
|
; additionals : dns_record list
|
||||||
|
}
|
||||||
|
|
Reference in a new issue