Gerar ctypes._fields_ dinamicamente.

1. Gerar ctypes._fields_ dinamicamente.

ctw6av
ctw6av

(usa Nenhuma)

Enviado em 24/06/2018 - 14:01h

Boa tarde galera!

Estou criando um servidor DNS levando em consideração as especificações da RFC 1035 https://www.ietf.org/rfc/rfc1035.txt usando o módulo ctypes para melhorar a legibilidade do código e deixar mais organizado.

O meu problema é o seguinte. Tenho uma classe para o header do pacote.


class DnsPacket(BigEndianStructure):
""" Class representative to DNS header.
This class handle a bytes buffer in ctypes field mode """

def __new__(cls, buffer):
return cls.from_buffer_copy(buffer)

_fields_ = [('identification', c_uint, 16),
('query_type', c_uint, 1),
('optional_code', c_uint, 4),
('authoritative_answer', c_uint, 1),
('truncation', c_uint, 1),
('recursion_desired', c_uint, 1),
('recursion_available', c_uint, 1),
('reserved_for_future', c_uint, 3),
('response_code', c_uint, 4),
('question_count', c_uint, 16),
('answer_count', c_uint, 16),
('nameserver_count', c_uint, 16),
('aditional_count', c_uint, 16)]

Acontece que após o campo "aditional_count" que é o fim do cabeçalho vem a section que contém a pergunta, de acordo com a RFC, nesse formato.

1 1 1 1 1 1
0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| |
/ QNAME /
/ /
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QTYPE |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+
| QCLASS |
+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+--+

Esse campo QNAME é representado como uma sequncia de labels e cada label consiste de um octeto com o tamanho da label seguido pela label. Aí que entra o problema.

Ex: 6google3com

Eu gostaria de gerar um campo dinamicamente de acordo com esse octeto para poder instanciar a label logo em seguida. Ex:
class QuestionSection(BigEndianStructure):
_fields_ = [('size', c_uint),
('name', label), # Aqui criariamos uma string baseado no tamanho da label acima.

Tenho uma função que pega o nome de domínio do buffer só que está bagunçada e gerar dinamicamente melhora a estrutura e o uso da mesma para um futuro uso.


def get_domain_name(self, data):
array_data = bytearray(data[sizeof(self):])
expected_lenght = array_data.pop(0)
nameserver = ''
while expected_lenght is not 0:
for _ in range(expected_lenght):
nameserver += chr(array_data.pop(0))
expected_lenght = array_data.pop(0)
if expected_lenght is not 0:
nameserver += '.'
return nameserver


Desde já agradeço à todos que me ajudarem e me derem idéias para resolver esse problema.



  






Patrocínio

Site hospedado pelo provedor RedeHost.
Linux banner
Linux banner
Linux banner

Destaques

Artigos

Dicas

Tópicos

Top 10 do mês

Scripts