mirror of
https://github.com/wichtounet/thor-os.git
synced 2025-09-15 15:37:51 -04:00
Complete DNS query
This commit is contained in:
parent
c258de32ad
commit
c30d95714c
@ -40,6 +40,8 @@ struct header {
|
|||||||
uint16_t additional_rrs;
|
uint16_t additional_rrs;
|
||||||
} __attribute__((packed));
|
} __attribute__((packed));
|
||||||
|
|
||||||
|
static_assert(sizeof(header) == 12, "DNS flags must be 96 bits");
|
||||||
|
|
||||||
void decode(network::interface_descriptor& interface, network::ethernet::packet& packet);
|
void decode(network::interface_descriptor& interface, network::ethernet::packet& packet);
|
||||||
|
|
||||||
std::expected<network::ethernet::packet> prepare_packet_query(network::interface_descriptor& interface, network::ip::address target_ip, uint16_t source_port, uint16_t identification, size_t payload_size);
|
std::expected<network::ethernet::packet> prepare_packet_query(network::interface_descriptor& interface, network::ip::address target_ip, uint16_t source_port, uint16_t identification, size_t payload_size);
|
||||||
|
@ -7,7 +7,6 @@
|
|||||||
|
|
||||||
#include "net/alpha.hpp"
|
#include "net/alpha.hpp"
|
||||||
#include "net/ethernet_layer.hpp"
|
#include "net/ethernet_layer.hpp"
|
||||||
#include "net/icmp_layer.hpp"
|
|
||||||
#include "net/ip_layer.hpp"
|
#include "net/ip_layer.hpp"
|
||||||
#include "net/dns_layer.hpp"
|
#include "net/dns_layer.hpp"
|
||||||
|
|
||||||
@ -24,27 +23,37 @@ void network::alpha(){
|
|||||||
|
|
||||||
std::string domain("www.google.ch");
|
std::string domain("www.google.ch");
|
||||||
|
|
||||||
size_t payload_size = 1 + domain.size() + 2 * 2;
|
auto parts = std::split(domain, '.');
|
||||||
|
|
||||||
|
size_t characters = domain.size() - (parts.size() - 1); // The dots are not included
|
||||||
|
size_t labels = parts.size();
|
||||||
|
|
||||||
|
size_t payload_size = labels + characters + 1 + 2 * 2;
|
||||||
|
|
||||||
// Ask the DNS layer to craft a packet
|
// Ask the DNS layer to craft a packet
|
||||||
auto packet = network::dns::prepare_packet_query(interface, target_ip, 3456, 666, payload_size);
|
auto packet = network::dns::prepare_packet_query(interface, target_ip, 3456, 0x666, payload_size);
|
||||||
|
|
||||||
if(packet){
|
if(packet){
|
||||||
auto* payload = reinterpret_cast<char*>(packet->payload + packet->index);
|
auto* payload = reinterpret_cast<char*>(packet->payload + packet->index);
|
||||||
|
|
||||||
payload[0] = domain.size();
|
size_t i = 0;
|
||||||
|
for(auto& part : parts){
|
||||||
|
payload[i++] = part.size();
|
||||||
|
|
||||||
for(size_t i = 0; i < domain.size(); ++i){
|
for(size_t j = 0; j < part.size(); ++j){
|
||||||
payload[i + 1] = domain[i];
|
payload[i++] = part[j];
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
auto* q_type = reinterpret_cast<uint16_t*>(packet->payload + packet->index + 1 + domain.size());
|
payload[i++] = 0;
|
||||||
*q_type = 1; // A Record
|
|
||||||
|
|
||||||
auto* q_class = q_type + 1;
|
auto* q_type = reinterpret_cast<uint16_t*>(packet->payload + packet->index + i);
|
||||||
*q_class = 1; // IN (internet)
|
*q_type = 0x0100; // A Record
|
||||||
|
|
||||||
|
auto* q_class = reinterpret_cast<uint16_t*>(packet->payload + packet->index + i + 2);
|
||||||
|
*q_class = 0x0100; // IN (internet)
|
||||||
|
|
||||||
// Send the packet back to ICMP
|
// Send the packet back to ICMP
|
||||||
network::icmp::finalize_packet(interface, *packet);
|
network::dns::finalize_packet(interface, *packet);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -51,10 +51,14 @@ void network::dns::decode(network::interface_descriptor& /*interface*/, network:
|
|||||||
auto identification = switch_endian_16(dns_header->identification);
|
auto identification = switch_endian_16(dns_header->identification);
|
||||||
auto questions = switch_endian_16(dns_header->questions);
|
auto questions = switch_endian_16(dns_header->questions);
|
||||||
auto answers = switch_endian_16(dns_header->answers);
|
auto answers = switch_endian_16(dns_header->answers);
|
||||||
|
auto authority_rrs = switch_endian_16(dns_header->authority_rrs);
|
||||||
|
auto additional_rrs = switch_endian_16(dns_header->additional_rrs);
|
||||||
|
|
||||||
logging::logf(logging::log_level::TRACE, "dns: Identification %h \n", size_t(identification));
|
logging::logf(logging::log_level::TRACE, "dns: Identification %h \n", size_t(identification));
|
||||||
logging::logf(logging::log_level::TRACE, "dns: Questions %h \n", size_t(questions));
|
|
||||||
logging::logf(logging::log_level::TRACE, "dns: Answers %h \n", size_t(answers));
|
logging::logf(logging::log_level::TRACE, "dns: Answers %h \n", size_t(answers));
|
||||||
|
logging::logf(logging::log_level::TRACE, "dns: Questions %h \n", size_t(questions));
|
||||||
|
logging::logf(logging::log_level::TRACE, "dns: Authorithy RRs %h \n", size_t(authority_rrs));
|
||||||
|
logging::logf(logging::log_level::TRACE, "dns: Additional RRs %h \n", size_t(additional_rrs));
|
||||||
|
|
||||||
auto flags = dns_header->flags;
|
auto flags = dns_header->flags;
|
||||||
|
|
||||||
@ -90,6 +94,8 @@ std::expected<network::ethernet::packet> network::dns::prepare_packet_query(char
|
|||||||
}
|
}
|
||||||
|
|
||||||
void network::dns::finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p){
|
void network::dns::finalize_packet(network::interface_descriptor& interface, network::ethernet::packet& p){
|
||||||
|
p.index -= sizeof(header);
|
||||||
|
|
||||||
// Give the packet to the UDP layer for finalization
|
// Give the packet to the UDP layer for finalization
|
||||||
network::udp::finalize_packet(interface, p);
|
network::udp::finalize_packet(interface, p);
|
||||||
}
|
}
|
||||||
|
@ -22,7 +22,7 @@ void compute_checksum(network::ethernet::packet& packet, network::udp::header* u
|
|||||||
// Accumulate the ICMP header
|
// Accumulate the ICMP header
|
||||||
auto sum = std::accumulate(
|
auto sum = std::accumulate(
|
||||||
reinterpret_cast<uint16_t*>(udp_header),
|
reinterpret_cast<uint16_t*>(udp_header),
|
||||||
reinterpret_cast<uint16_t*>(udp_header) + udp_header->length * 2,
|
reinterpret_cast<uint16_t*>(udp_header) + udp_header->length / 2,
|
||||||
uint32_t(0));
|
uint32_t(0));
|
||||||
|
|
||||||
// Accumulate the IP addresses
|
// Accumulate the IP addresses
|
||||||
|
Loading…
x
Reference in New Issue
Block a user