quarta-feira, 26 de outubro de 2011

De volta às DLLs

Programas” são conjuntos de instruções (em linguagem de máquina) que permitem ao usuário interagir com o computador. O sistema operacional também é um programa, embora funcione como uma espécie de “software-mãe”, dando suporte a todos os demais aplicativos. Nos primórdios da computação, um programa era constituído apenas pelo executável e continha todas as instruções necessárias ao seu funcionamento, mas o advento das interfaces gráficas e o aumento de tamanho dos softwares fizeram com que a simples divisão dos aplicativos em múltiplos executáveis deixasse de ser eficaz (até porque os respectivos códigos não podem ser compartilhados). A sigla “DLL” (de Dynamic Link Library) remete a uma solução desenvolvida pela Microsoft – e incorporada ao ambiente Windows – onde a maioria das funções utilizadas pelos aplicativos não é codificada no corpo de cada programa, mas sim armazenada em “bibliotecas” pré-compiladas e compartilhada pelos executáveis. Isso resulta em arquivos menores e mais fáceis de atualizar – para gerar o executável, o programador informa ao compilador a localização dessas bibliotecas, e este combina o código das funções com o código do programa propriamente dito.
Numa analogia rudimentar e não muito exata, as DLLs estão para o para o software como os drivers estão para o hardware: enquanto estes últimos fazem uma “ponte” entre os dispositivos e o SO, as DLLs fazem o mesmo em relação ao sistema e os aplicativos. Toda DLL tem sua função específica: enquanto algumas tratam da entrada e saída de arquivos no disco (salvar, abrir etc.), outras cuidam do desenho das janelas na tela ou do tráfego de internet, e assim por diante.
A famosa API do Windows (Application Programming Interface) é, em grande parte, baseada neste tipo de arquivo - e nela que estão predefinidas as informações de como devem ser desenhadas as barras de rolagem, os botões e caixas de diálogos, por exemplo, dando menos trabalho aos programadores e promovendo a padronização das interfaces dos aplicativos. De certa forma, o próprio Windows é uma vasta coleção DLLs, já que sua função precípua (como a de qualquer SO) é garantir que as demais aplicações funcionem sem que tenham de “se preocupar com os detalhes de suas tarefas rotineiras”. O kernel32.dll, por exemplo, é encarregado de salvar arquivos e gerenciar o uso da memória RAM, enquanto o user32.dll gerencia a área de transferência do sistema e cuida dos menus exibidos na tela, do papel de parede e do ponteiro do mouse.
As DLLs podem ter diversas versões, e softwares compilados para operar com uma delas nem sempre funcionam corretamente com outra mais nova, mais antiga, ou mesmo de idioma diferente. Embora os desenvolvedores incluam em seus programas de instalação todas as DLLs necessárias ao aplicativo – e elas possuam informações sobre suas versões, visando prevenir que as mais antigas sobrescrevam as mais recentes –, sempre existe a possibilidade de programas que rodavam sem problemas passarem a apresentar comportamento errático ou mesmo deixarem de funcionar.
O XP conta com uma ferramenta para verificação de integridades dos arquivos do sistema; para convocá-la, clique em Iniciar > Executar, digite “sigverif.exe” (sem as aspas), pressione o botão “OK” e, na tela seguinte, clique no botão “Iniciar” e aguarde até que o “Verificador de Assinatura de Arquivo” apresente seu relatório. Para tentar solucionar problemas com DLLs corrompidas ou ausentes, visite o site http://www.dll-files.com/.
Do ponto de vista da segurança, o problema ocorre quando os programadores não tomam medidas para conferir se as bibliotecas carregadas são as originais (a Microsoft disponibiliza uma ferramenta paliativa que permite ajustar este comportamento, tanto no sistema quanto para cada aplicação; saiba mais em http://support.microsoft.com/kb/2264107). Uma brecha antiga – que já vem sendo discutida há mais de uma década, mas que continua sendo amplamente explorada – permite que DLLs “legítimas” sejam substituídas por versões maliciosas. Para tanto, basta fazer com que o arquivo modificado seja inserido na mesma pasta do original – ou, melhor ainda, que o substitua. Digamos que um programa de áudio precise de determinada DLL, e que alguém acrescente a ela um código malicioso e a distribua através do KaZaA ou de outro programinha de compartilhamento de arquivos (P2P). Quando a DLL em questão for requisitada, o Windows pode ser “enganado” e levado executar a versão contaminada.
Resguardadas as devidas proporções, isso vale também para as famosas vulnerabilidades dos arquivos ActiveX do IE – que, de certa forma, também são DLLs –, mas vamos deixar esse assunto para outra hora.
Um ótimo dia a todos e até a próxima.