Tabela de conteúdos
Tutorial: Como aplicar patches em drivers
Versão: 1.01 – 15 de Março de 2009
By: darkAudax
Tradução: Rubem A. Figueredo – LPI000204850 – rafig38@gmail.com
Introdução
As pessoas novas em conhecimento de segurança de redes woreless, muitas vezes não entendem a necessidade de correção de drivers ou nem mesmo sabem como fazê-lo. Quanto aos drivers ieee80211 ou mac80211, às vezes, precisam ser corrigidos.
Este tutorial tenta fornecer algumas informações e alguns conhecimentos básicos para o leitor.
Em muitos lugares usarei o termo “patch” ou “correção”, é a mesma coisa.
Importante: A existência deste tutorial diz respeito ao fornecimento de suporte básico em Linux baseado nos canais IRC ou Fórum. Não poste perguntas básicas sobre Linux ou perguntas genéricas sobre correções no fórum, eles serão ignoradas, já que estas informações estão aqui neste tutorial.
Nos destinamos a ajudar as pessoas a serem auto-suficientes.
Em primeiro lugar, o que é um patch? Todos os programas executáveis são gerados a partir do código fonte. Este código fonte fornece todas as instruções para se conseguir a funcionalidade desejada que o programador gostaria. No entanto, há momentos em que queremos que os programas façam algo ligeiramente diferente, para efeitos da avaliação de segurança wireless. Um exemplo disso é a injeção de pacotes. Logo, o código-fonte é alterado para realizar as novas funções. A fim de compartilhar este código, um “patch” é feito com as diferenças entre o código-fonte original e o código fonte modificado.
Este “patch” pode ser aplicado por qualquer pessoa ao seu código-fonte original, criado para obter a nova funcionalidade. Isto torna o código modulável e de fácil manutenção.
Patches são fáceis de aplicar, uma vez que você entenda alguns conceitos simples:
Os patches são geralmente de uma versão específica do código fonte. Isso significa que o antigo patch pode não funcionar com versões mais recentes do código-fonte. Às vezes, eles rodam bem, às vezes não. Sendo assim, um patch pode ou não funcionar em versões mais antigas do código-fonte. Use um patch escrito especificamente para a versão do código-fonte que você tem.
Os patches são geralmente construídos a partir de códigos fontes limpos sem correção. Assim, um patch pode fazer uma mudança que faz com que outros patches possam falhar.
Patches não são parte do código fonte liberado, portanto não fique surpreso se eles não funcionam. Sempre mantenha um backup do seu código fonte original!
Dúvidas que são comuns:
Quais patches eu preciso?
Onde posso fazer download do patch que preciso?
O wiki Aircrack-ng normalmente indica quais patches são necessários para um driver em particular. E as páginas correspondentes contêm instruções de instalação dos drivers e instruções de uso dos patches. Acesse a página de drivers para ver os links para diversas páginas que contém informações detalhadas.
Você pode obter um patch de diversas maneiras. A página da wiki normalmente fornece um link para download. Os patches estão incluídos no pacote fonte do Aircrack-ng no diretório “patches”. Às vezes, os patches ainda estão em desenvolvimento e você pode encontrar links para eles no fórum.
Aplicando um patch
Esta seção fornece informações genericas sobre a plicação de um patch. Sempre que possível, siga as instruções detalhadas fornecidas na página de wiki para o seu driver. É altamente recomendável fazer backup de seu fonte onriginal antes de aplicar patches, pois se algo de errado ocorrer você poderá voltar a situação anterior através do seu backup feito.
Esta seção inteira é executada através de uma sessão do console.Ou seja, tudo será feito em linha de comando.
O primeiro passo é baixar o patch. A página wiki normalmente fornece as instruções para isso.
Você poderá usar o comando “wget” como em:
# wget -c -T 30 “URL para o patch”
# wget -c -T 30 http://patches.aircrack-ng.org/rtl8187_2.6.24v3.patch
Onde:
- -c para o caso do dwonload ser interrompido, ele continuar mais tarde;
- -T 30 para esperar até 30seg se por acaso o download demore para iniciar.
Mova o patch para o diretório apropriado usando o comando “mv”.
A questão é: Qual é o “diretório apropriado”? Não há nenhuma resposta correta à questão. Depende do que você está corrigindo e como o patch foi criado.
Normalmente dando uma olhada nos diretórios referenciados no patch teremos uma boa indicação de qual diretório deverá está o patch.
Aqui estão alguns locais típicamente aplicados:
- Mesmo diretório do arquivo (s) a ser corrigido
- Um diretório acima do arquivo (s) a ser corrigido
- /usr/src/linux ou similar, quando precisá corrigir um módulos do kernel
Uma vez o patch no diretório correto, vá até este diretório que contém o patch usando o comando “cd”.
Agora é só executar o comando “patch”, conforme o modelo gnérico abaixo:
# patch -Np0 -i <nome do patch file>
Onde:
- N quer dizer: não aplicar o patch, se já tiver sido instalado
- p0, quer dizer o número de diretórios a ser extraido a partir dos nomes de arquivos dentro do patch. Às vezes, precisaremos experimentar -p1, -p2, -p3 e etc, para extrair um variado número de diretórios.
Se você quiser poderá testar a aplicação do patch conforme abaixo:
# patch -Np0 –dry-run –verbose -i <name of the patch file>
OSERVAÇÃO: Há traço duplo na frente de “verbose” dry-run “.
É sempre uma boa prática fazer um teste antes de aplicar o patch verdadeiramente. Desta forma evitaremos problemas.
Uma vez que o patch está instalado, precisaremos recompilar o programa. Isso geralmente é feito conforme abaixo:
# make # make install
Se você estiver recompilando um módulo do kernel, veja o seguinte link,
[links#compiling_kernels|wiki entry]], para obter instruções sobre compilação de kernel e os respectivos módulos individuais.
Para desfazer (reverso) um patch aplicado:
# patch -Rp0 -i <nome do patch file>
Onde:
- R significa inverter o patch, se já tiver sido instalado.
- p0, quer dizer o número de diretórios a ser extraido a partir dos nomes de arquivos dentro do patch. Às vezes, precisaremos experimentar com -p1, -p2, -p3 e etc, para extrair um variado número de diretórios.
Dicas de solução de problemas
ERRO: Não é possível encontrar o arquivo de patch na linha de entrada
Se você receber uma mensagem de erro semelhante à seguinte:
can't find file to patch at input line 4
Perhaps you used the wrong -p or –strip option?
The text leading up to this was:
————————–
|diff -Naur rtl8187_linux_26.1010.0622.2006_orig/beta-8187/ieee80211_crypt.h
rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/ieee80211_crypt.h
|— rtl8187_linux_26.1010.0622.2006_orig/beta-8187/ieee80211_crypt.h 2006-06-05 22:58:02.000000000 -0400
|+++ rtl8187_linux_26.1010.0622.2006_rawtx/beta-8187/ieee80211_crypt.h 2008-08-12 13:11:32.000000000 -0400
————————–
File to patch:
Há algumas soluções possíveis, dependendo da causa raiz do problema:
Verifique se o arquivo que você está tentando aplicar o patch realmente existe no seu sistema. Exemplificando, verifique se “ieee80211_crypt.h” realmente existe. Se se não, então instale o código fonte que contém o arquivo. Logo, muitas vezes vezes você precisará do kernel headers e /ou doo kernel source instalado. A versão do kernel headers/source deverá coincidir com a versão do kernel que você está usando. O comando “uname-r” irá mostrar qual versão do kernel você está executando. O Fedora requer o kernel-devel e o RPM instalado.
Se você tiver o patch localizado no diretório errado. Re-leia a seção de Introdução no início deste tutorial sobre onde colocar o patch. Às vezes, poderemos encontrar dicas de onde colocar o patch, olhando para o patch em si. Os caminhos de diretório especificado no sistema deve dar-lhe uma indicação de onde deve ser colocado.
Executar com o valor ”-pX“. Isso permite que você extraia os diretórios dos arquivos referenciados no patch. Tente -p0, -p1, -p2 e etc.
A versão do patch pode está errado para a sua versão do kernel. Verifique para garantir que o patch que você está usando é conhecidamente o que você precisa para funcionar adequadamente no kernel que você está usando.
Hunk # X falhou em XXX
Se você recebeu uma mensagem de erro semelhante à seguinte:
patching file drivers/net/wireless/iwlwifi/iwl-sta.c
Hunk #1 FAILED at 968.
1 out of 1 hunk FAILED – saving rejects to file
drivers/net/wireless/iwlwifi/iwl-sta.c.rej
patching file drivers/net/wireless/iwlwifi/iwl-tx.c
Hunk #1 FAILED at 783.
Hunk #2 FAILED at 805.
Hunk #3 FAILED at 819.
3 out of 3 hunks FAILED – saving rejects to file drivers/net/wireless/iwlwifi/iwl-tx.c.rej
Isso significa que o patch não coincide com o código fonte do programa em seu sistema em um ou mais lugares. Como resultado, o processo de patch falhou.
Há algumas soluções possíveis, dependendo da causa raiz do problema:
Em alguns casos raros, algumas falhas ainda podem ser ignoradas. Você pode tentar compilar o programa e ver se funciona. Não é uma probabilidade muuito boa, mas vale a pena tentar.
A versão do patch pode está errado para a sua versão do kernel. Verifique para garantir que o patch que você está usando é conhecidamente o que você precisa para funcionar adequadamente no kernel que você está sando.Provavelmente, você precisa de uma versão mais antiga ou nova do patch.
Se todos os blocos falharam: O patch pode está com erro. Tente adicionar a opção “-l” à linha de comando do patch.
Tente aplicar o patch com a opção “fuzz”: adicione ”-F3“ à linha de comando do patch. (O número especifica o máximo fuzz permitido, “3” é um valor que funciona bem.)
Se depois de tudo isso ainda falhar, você pode tentar atualizar manualmente o código-fonte, revendo o patch e aplicar as alterações à mão.