Depende do que você está tentando fazer. Em ambos os casos, você está praticamente garantido para precisar escrever seu próprio código, então se você não for um programador, você pode querer começar a aprender como ser um, ou esperar que você tenha um amigo que seja um.
Rolando sua própria infra-estrutura de resolução de DNS
Se você está escrevendo seu próprio programa, basicamente pode ignorar completamente a resolução de DNS do sistema e fazê-lo sozinho.
Você vê que a resolução de DNS é fornecida como um serviço de todo o sistema, mas não há (normalmente) nenhuma restrição que impeça a criação de sua própria arquitetura de resolução de DNS separada. A atividade real da resolução de DNS é "apenas" pacotes IP passando pela rede. Portanto, tudo o que você precisa fazer é usar uma biblioteca existente que entenda o protocolo DNS, mas que permita personalizar as respostas ou usar um arquivo hosts em um diretório personalizado. Essa abordagem tem a vantagem de não serem necessários "hacks", mas a desvantagem é que você tem que criar seu próprio programa - seja uma linguagem de script ou uma linguagem de programação nativa não é relevante ... de qualquer forma, você precisa criar novo software. Você não pode aplicar esse hack a softwares existentes, especialmente códigos não compilados para os quais você não possui o código-fonte.
Um exemplo de uma biblioteca C que apenas faz com que a codificação / decodificação de mensagens DNS seja libdns do NMAP.
Substituindo a resolução de DNS em programas existentes
Se você estiver executando programas para os quais não tem acesso de gravação, e estiver setuid root, então não - você está sem sorte, a menos que queira copiar o binário desse programa para outro local e remover o setuid (embora alguns programas se recusem a executar se não forem setuid root).
Se o programa que você está executando não é root setuid, então deve ser possível. O que você precisa fazer é LD_PRELOAD
uma biblioteca que implementa as funções de resolução de DNS da biblioteca C padrão e faz algum processamento personalizado para fazer as modificações desejadas, antes de passar os hosts não reconhecidos para a implementação da biblioteca C do sistema para resolução "normal".
As funções da biblioteca C que você terá que sobrescrever com LD_PRELOAD
são as seguintes:
-
gethostbyname(3)
(obsoleto, mas muitos programas ainda usam isso) -
getaddrinfo(3)
-
getnameinfo(3)
Note que você pode realmente confundir certos programas se fizer isso, porque fazer modificações arbitrárias nos valores de retorno dessas funções pode violar o padrão POSIX.1-2001. Veja RFC 2553 .
Se você quiser ativar este para todos os programas iniciados , terá que exportar a variável de ambiente LD_PRELOAD
para o seu shell ou sua sessão de login para que tudo comece com LD_PRELOAD
. Infelizmente, isso exclui programas como Xorg
, porque (eu acredito) é setuid root. Além disso, programas como vmware-vmx
(o principal binário do hipervisor do VMware) são setuid root, então você tem o mesmo problema.
Informações de nível inferior
Esse hack é possível porque configurar a variável de ambiente LD_PRELOAD para uma biblioteca compartilhada faz com que o vinculador dinâmico no Linux leia os símbolos da biblioteca pré-carregada antes de lê-los de qualquer outra biblioteca. Portanto, se você tiver um símbolo (que é essencialmente uma assinatura de função) chamado foo
in libc.so.6
(a implementação da biblioteca C), você também terá foo
em libevil.so
(sua biblioteca) e definirá LD_PRELOAD=libevil.so
(você precisa incluir o caminho completo), ele carregará foo
do seu libevil.so
, para que quando o programa que você lançou chamar foo()
no código, ele chamará libevil.so
, que pode então decida (se quiser) usar as funções de vinculador dinâmico para chamar a implementação de libc.so.6
de foo()
- opcionalmente.
Você terá que fazer todo esse hacking em C, provavelmente, devido à natureza de baixo nível do código. Você pode usar bibliotecas de utilitários como GLib para tornar a vida mais fácil, para que você não precise inventar algoritmos para operações básicas como a manipulação de strings e o crescimento automático de matrizes.