Exportar (0) Imprimir
Expandir Tudo

Noções básicas dos shims

Como os shims funcionam

Experiência e compatibilidade de aplicativos nos sistemas operacionais Microsoft® Windows® é um dos pilares fundamentais de seu desenvolvimento, junto com o desempenho, confiabilidade e capacidade de gerenciamento. Para reduzir custos de implantação e acelerar a adoção, a Microsoft investe em profundas soluções técnicas para garantir ampla compatibilidade do software existente, levando a compatibilidade para o processo de engenharia e lançamento.

A Microsoft Windows Application Compatibility Infrastructure (Infraestrutura de shim) é uma solução técnica poderosa. À medida que o sistema operacional Windows evolui de versão para versão (mudando para oferecer suporte a novas tecnologias, incorporar correções de bugs e implementar uma modificação de estratégia), alterações nas implementações de algumas funções podem afetar os aplicativos que dependem delas. Por causa da natureza do software, modificar a função novamente para resolver esse problema de compatibilidade poderia quebrar aplicativos adicionais ou exigir que o Windows permaneça o mesmo, independentemente da melhoria que a implementação alternativa pudesse oferecer. Podemos contornar essa possibilidade colocando ramificações diretamente no código-fonte do Windows, mas fazer isso apresenta um desafio de longo prazo para o suporte e a confiabilidade do sistema operacional Windows. Usando a infraestrutura de shims, no entanto, você pode direcionar uma correção de aplicativo específica de um determinado aplicativo (e normalmente, para determinadas versões do aplicativo), com essas correções hospedadas fora das funções principais do Windows e mantidas separadamente.

A infraestrutura de shims implementa uma forma de ganchos de interface de programação de aplicativo (API). Mais especificamente, ele aproveita a natureza da vinculação para redirecionar chamadas de API do próprio Windows para código alternativo - o próprio shim. A especificação dos formatos Windows PE e COFF inclui vários cabeçalhos e os diretórios de dados nesse cabeçalho fornecem a camada de inversão entre o aplicativo e o arquivo vinculado. Chamadas para arquivos binários externos acontecem por meio da tabela de endereços de importação (IAT). Consequentemente, uma chamada para o Windows se parece como a Figura 1 para o sistema.

643f2bee-8329-4018-9d90-2ffcc7c76a6c

Figura 1   Aplicativo chamando o Windows por meio da IAT.

Especificamente, é possível modificar o endereço da função do Windows resolvido na tabela de importação e, em seguida, substituí-lo com um ponteiro para uma função no código do shim alternativo, conforme mostrado na Figura 2.

Imagem Art

Figura 2   Aplicativo redirecionado para o shim antes de chamar o Windows

Essa inversão acontece para arquivos .dll vinculados estaticamente quando o aplicativo é carregado. Também é possível aplicar shims a arquivos .dll dinamicamente vinculados enganchando a API GetProcAddress.

Implicações de design para a infraestrutura de shims

Você pode achar certas consequências do projeto da infraestrutura de shims relevantes ao determinar sua estratégia de aplicação de shims.

Primeiro, conforme mostrado na Figura 2. Aplicativo redirecionado para o shim antes de chamar o Windows, o código executado dentro de um shim ainda fica fora do Windows. Consequentemente, o Windows mantém o código do shim com as mesmas restrições de segurança do próprio código do aplicativo. De fato, para o Windows, o código do shim parece ser código de aplicativo. Como resultado, não é possível usar shims para ignorar nenhum mecanismo de segurança presente no Windows. Por exemplo, nenhum shim estará disponível para ignorar os prompts de Controle de Conta de Usuário do Windows 7 (UAC) enquanto estiver executando o aplicativo com permissões elevadas. Você pode aplicar um shim para que o aplicativo não exija direitos de administrador ou você pode aplicar um shim ao aplicativo para exigi-lo, mas para receber direitos de administrador com o UAC habilitado, o usuário terá de aprovar a elevação. O mesmo é verdadeiro para código que você mesmo escreve.

Portanto, ao avaliar as implicações de segurança de se usar shims em sua empresa, você não está abrindo nenhuma vulnerabilidade de segurança adicional. De fato, usar shims para evitar ter de afrouxar os descritores de segurança ou fazer diretiva de segurança mais frouxa pode ser frequentemente a escolha mais segura. Por exemplo, sem shims, você poderá reduzir um problema de compatibilidade afrouxando as ACLs em um determinado diretório, mas essa decisão não tem efeito no sistema inteiro. Usando shims, você poderá redirecionar o acesso ao arquivo para uma localidade por usuário para o aplicativo. Como outro exemplo, um aplicativo pode estar verificando explicitamente os direitos de administrador. Sem shims, você poderá ter de conceder ao aplicativo direitos de administrador para ser aprovado nessa verificação. Se a verificação for desnecessária, no entanto, um shim poderia simplesmente mentir se o usuário atual tem direitos de administrador, permitindo que a verificação seja bem-sucedida sem expor área de superfície de segurança adicional.

Segundo, como a infraestrutura de shims, em essência, injeta código adicional no aplicativo antes de chamar o Windows, qualquer redução realizada com um shim poderá ser feita modificando o próprio código do aplicativo. No mínimo, o aplicativo poderia incluir código similar ao que o Windows implementa no shim imediatamente antes de chamar as APIs do Windows.

Finalmente, como os shims são executados como código do modo de usuário dentro de um processo de aplicativo do modo de usuário, não é possível usar um shim para corrigir código do modo kernel. Por exemplo, não é possível usar shims para resolver problemas de compatibilidade com drivers de dispositivos ou com outros códigos do modo kernel. (por exemplo, alguns códigos de antivírus, firewall e antispyware são executados no modo kernel)

Isso foi útil para você?
(1500 caracteres restantes)
Agradecemos os seus comentários

Contribuições da comunidade

ADICIONAR
Mostrar:
© 2014 Microsoft