Na primeira parte desse artigo (UIPI – User Interface Privilege Isolation Part 1) vimos que o isolamento de privilégios de interface de usuário (UIPI) é um recurso de segurança que impede que a maioria das mensagens sejam recebidas de um remetente que possui nível de integridade inferior.
Vimos também que aplicação Broken Ping Pong, disponível em: http://msdn.microsoft.com/en-us/gg465097, não funciona quando o nível de integridade dos processos é diferente. O problema pode ser corrigido através do uso da API ChangeWindowMessageFilter que permite filtrar as mensagens que são exceção à regra e que consequentemente podem ser transmitidas entre processos com diferentes níveis de integridade.
Após a correção a aplicação irá funcionar independentemente se as duas instâncias possuírem o mesmo nível de integridade. Entretanto, não é sempre que temos acesso ao código da aplicação para realizar as alterações. Nesses casos, podemos contar com dois SHIMs para contornar a incompatibilidade, sendo:
Shim |
Descrição |
UIPIEnableStandardMsgs |
Permite que a troca de mensagens comuns entre os processos |
UIPIEnableCustomMsgs |
Permite a troca de mensagens específicas entre os processos |
Vamos imaginar que não temos acesso ao código-fonte da aplicacao Broken Ping Pong. Antes de utilizar o SHIM, devemos identificar qual é a mensagem que é trocada entre os processos.
Uma maneira fácil de identificar a troca de mensagens entre processos é utilizar a ferramente SPY++ (SPYXX.EXE) que faz parte do Visual Studio. Para maiores detalhes da ferramenta acesse: http://msdn.microsoft.com/en-us/library/dd460725.aspx.
Execute a aplicação BrokenManagedPingPong.exe e depois o SPYXX.EXE. Siga as instruções da imagem a seguir para selecionar a tela da aplicação PingPong:
Clique com o botão direito no item selecionado que corresponde a tela do PingPong e clique no item Message do menu de contexto, conforme:
Na tela que será exibida, clique no item Logging Options do menu Message, conforme:
Na aba Messages, marque apenas o checkbox Registered para filtrarmos as mensagens que serão exibidas, conforme:
Observe que a mensagem que é trocada é BALL, conforme:
Uma vez que sabemos qual é a mensagem trocada pela aplicação, podemos utilizar o SHIM UIPIEnableCustomMsgs para permitir que a aplicação que estiver sendo executada elevada aceite a mensagem da aplicação executada com o nível de privilégio médio.
Siga os seguintes passos para criar o SHIM:
- Execute a ferramenta Compatibility Administrator que faz parte das ferramentas Microsoft Application Compatibility Toolkit 5.6
- Clique no ícone Fix ou pressione CTRL+P, conforme:
3. Informe a localização da aplicação:
4. Clique no botão Next, e na tela seguinte no botão Next novamente. Na tela a seguir, selecione o SHIM UIPIEnableCustomMsgs (não esqueça de selecionar o checkbox) e clique no botão Parameters (na imagem ficou um parcialmente sobreposto). Na tela de parametros, digite no primeiro campo o texto BALL que corresponde a mensagem que é trocada pela aplicação. No campo module name, digite * e clique no botão Add. Clique no botão OK, Next e Finish.
5. Salve o SHIM. Será exibida uma tela solicitando o nome do SHIM. Nomeie, por exemplo, para UIPIEnableCustomMsgsPingPong e salve por exemplo em C:\temp\UIPIEnableCustomMsgsPingPong.sdb.
6. Para instalar o SHIM, execute o prompt de comando elevado (run as administrator) e digite o seguinte comando:
sdbinst.exe c:\temp\UIPIEnableCustomMsgsPingPong.sdb
7. Execute duas instâncias da aplicação, sendo uma com o nível de privilégio default e a outra elevada.
Observe que a troca de mensagem irá ocorrer com sucesso independentemente do nível de privilégio das aplicações. 🙂
Muito bom Demétrio! Excelente artigo!
Valeu PT! Existem também os artigos:
http://bit.ly/1fEpblX – Controles de Integridade
http://bit.ly/1eVBclU – UIPI – User Interface Privilege Isolation