O Internet Explorer executou uma operação ilegal e será fechado
Por: Yuri Diógenes
1. Introdução
Antes de começar o assunto (tecnicamente falando), gostaria de voltar ao tempo e lembrar quando tínhamos o MS-DOS e o Windows 3.1. Nessa época que ainda nem existia o Internet Explorer você lembra o que acontecia com o seu “ambiente operacional” Windows 3.1 quando a mensagem “seu programa executou uma operação ilegal e será fechado” aparecia? Bem, se você não lembra porque esqueceu ou porque nunca trabalhou com o Windows 3.1 então vou lhe contar. O que acontecia era que saíamos do ambiente gráfico Windows 3.1 e retornávamos para o prompt de comandos do DOS (sistema operacional).
Tal comportamento acontecia porque tanto o ambiente gráfico Windows 3.1 quanto o programa que estava em execução (por exemplo o Word for Windows 2.0) compartilhavam o mesmo espaço de endereçamento, então quando um processo causava uma exceção não prevista no código, todo aquele espaço de endereçamento era afetado. Todo o ambiente operacional Windows 3.1 rodava no modo usuário, enquanto o sistema operacional de fato (DOS) tinha instruções no modo Kernel.
A partir do Windows 95 o sistema operacional já não era mais o DOS então tínhamos um único sistema separado em modo usuário e modo Kernel, onde o que estava em modo usuário não poderia afetar o modo Kernel. Neste modelo já tínhamos o conceito de que processos de 32 bits rodavam em um espaço de endereçamento próprio e com isso um processo não poderia afetar o outro processo. Então quando ocorre uma exceção, apenas aquele processo é afetado.
Toda essa nostalgia é para entender que hoje os problemas desta natureza foram reduzidos drasticamente, porém ainda existem cenários em que exceções existem e que o aplicativo precisa ser fechado. Este artigo tem como intuito mostrar um cenário que vem acontecendo com certa freqüência para usuários do Internet Explorer 6 ou 7. Tenho notado maior freqüência destes chamados entre clientes do Brasil e na maioria usuários de online banking.
2. Cenário
Nestes casos que trabalhei e em outros que acompanhei o comportamento não era muito consistente, porém podemos enumerar alguns dos principais sintomas:
· O usuário está navegando em uma página Web qualquer e o Internet Explorer para de responder. Ao abrir o gerenciador de tarefas o processo aparece como “Not Responding” e o usuário tem que matar o processo;
· O usuário está navegando em uma página Web qualquer e o Internet Explorer gera um crash e fecha automaticamente;
· Ao tentar imprimir uma página web o Internet Explorer gera um crash e fecha automaticamente;
Lembre-se que tais sintomas podem ser causados por diversos componentes, então as seções a seguir irão lhe guiar para uma técnica de resolução de problemas focada em isolar o problema e em seguida seremos mais específicos nos cenários.
3. Como Iniciar a Resolução do Problema?
No caso de estar utilizando o Internet Explorer 7, a melhor forma de isolar o problema é usando a versão do IE7 que vem sem nenhum “plug in/add on” de terceiros instalado. Para acessar essa versão basta ir em Iniciar / Programas / Acessórios / Ferramentas de Sistemas e lá você terá o Internet Explorer sem aditivos.
Para Internet Explorer 6 ou inferior é necessário usar as seguintes opções para obter o mesmo resultado:
1. Clique em Ferramentas / Opções da Internet / Programas e clique no botão Gerenciar Complementos;
2. Selecione os complementos (add on) de terceiros e clique na opção desativar;
3. Clique em OK;
4. Agora clique na guia Avançadas e desabilite a opção “Ativar extensões de navegador de terceiros”;
5. Clique em OK.
Com estes passos tanto para IE7 quanto para IE6 estamos eliminando a possibilidade de haver componentes de terceiros que estejam influenciando na correta operação do Internet Explorer.
4. E depois?
Se o problema resolver após isso então temos um grande indício de que um componente de terceiro estava causando o problema, agora qual? Bem, para identificar qual componente está causando o problema podem ser usados os seguintes métodos:
· Coleta de um dump no momento do “crash”;
· Habilitar manualmente cada “add on” no gerenciador de complementos do IE e verificar qual deles causa o travamento;
OBS: Para mais informações de como coletar dumps de um processo, leia o artigo do colega Roberto Farah, Como (Rapidamente) Usar O Debugdiag.
5. Resultado
Neste casos em que trabalhei o dump revelou qual componente estava na pilha de execução durante o problema. Neste caso o componente de terceiro era o arquivo gbieh.dll, e na ocasião também pude observar o mesmo comportamento usando o utilitário Process Explorer da Sysinternals (que agora é da Microsoft). Ao navegar no site deste banco e tentar fazer acesso ao recurso de “online banking” a seguinte pilha de instruções é observada no processo iexplorer.exe:
Não é uma regra geral dizer que o Internet Explorer vai causar um crash sempre que esta DLL está sendo carregada, porém existem violações de acesso que acontecem nesta DLL que podem causar tal comportamento no IE, e como não temos o código da DLL não dá para saber que cenários seriam estes. O exemplo da pilha de execução acima foi durante uma navegação no site do banco onde o problema não se manifestou. Abaixo temos o exemplo de uma pilha de instruções onde o problema ocorreu:
ChildEBP RetAddr
0012d99c 7c9551ad ntdll!DbgBreakPoint
0012d9b4 7c969c2f ntdll!RtlApplicationVerifierStop+0x160
0012da30 7c96ac57 ntdll!RtlpDphReportCorruptedBlock+0x22d
0012da54 7c96ae5a ntdll!RtlpDphNormalHeapFree+0x2e
0012daa4 7c96defb ntdll!RtlpDebugPageHeapFree+0x79
0012db18 7c94a5d0 ntdll!RtlDebugFreeHeap+0x2c
0012dc00 7c9268ad ntdll!RtlFreeHeapSlowly+0x37
0012dcd0 77c0c2de ntdll!RtlFreeHeap+0xf9
0012dd18 02482619 msvcrt!free+0xc3
0012dd4c 0248306e gbiehabn!Gbieh+0xa265
0012df58 02482713 gbiehabn!Gbieh+0xacba
0012df8c 024721d9 gbiehabn!Gbieh+0xa35f
0012e198 02471b6a gbiehabn+0x121d9
0012e1a8 77ec2499 gbiehabn+0x11b6a
0012e1dc 77eb31b2 shlwapi!EnumInvokeCallback+0x3e
...
0012eb50 77d28a10 user32!DispatchMessageWorker+0x306
0012eb60 75f76d95 user32!DispatchMessageW+0xf
0012eb78 75f7e692 browseui!TimedDispatchMessage+0x33
0012edd8 75f7e805 browseui!BrowserThreadProc+0x32e
0012ee6c 75f7eacd browseui!BrowserProtectedThreadProc+0x50
0012fef0 777c7216 browseui!SHOpenFolderWindow+0x22c
0012ff10 00402372 shdocvw!IEWinMain+0x129
0012ff60 00402444 iexplore!WinMainT+0x2de
0012ffc0 7c816d4f iexplore!_ModuleEntry+0x99
0012fff0 00000000 kernel32!BaseProcessStart+0x23
Neste caso acima a DLL causou uma corrupção do heap e causou um crash no processo iexplorer.exe. Para mais informações sobre corrupção de Heap e como fazer o “troubleshooting”, veja o artigo How to use Pageheap.exe in Windows XP and Windows 2000.
Procurando no Windows Live Search foi possível encontrar mais informações sobre este arquivo, alguns sites o categorizam como um malware porém o fato é que ele é instalado ao navegar no site de um banco no Brasil.
Quando se navega no site deste banco, é pedido para instalar um controle para acesso a recursos do site. Durante a instalação do controle a tela abaixo é mostrada:
Após isso uma outra tela é aberta pedindo para instalar o controle, neste momento alguns arquivos são descarregados para a pasta “C:\windows\downloaded program files”, estes arquivos são usados durante o processo de acesso ao site. Vejamos o resultado do comando DIR GB* nesta pasta:
C:\WINDOWS\Downloaded Program Files>dir gb*
O volume na unidade C não tem nome.
O número de série do volume é 705D-B7A4
Pasta de C:\WINDOWS\Downloaded Program Files
09/11/2006 15:33 226.344 gbieh.dll
03/10/2006 09:49 86.056 gbpdist.dll
26/09/2006 09:54 252 gbpdist.inf
3 arquivo(s) 312.652 bytes
0 pasta(s) 14.519.418.880 bytes disponíveis
Trabalhei em muitos chamados originados com os sintomas descritos na sessão 2 deste artigo e a solução de contorno para os casos envolvendo esta DLL era retirá-la do sistema.
6. Tentei remover a DLL e não consigo, e agora?
Na grande maioria dos cenários com esta DLL o problema de não conseguir removê-la ocorre porque existem “handles” de outros processos para esta DLL. Felizmente, com o uso desta mesma ferramenta (Process Explorer) é possível verificar quais os processos que estão acessando esta DLL, vejamos como:
1. Na tela principal do Process Explorer, clique no menu “Find” e depois na opção “Find Handle”;
2. Na janela que aparece, digite o nome da DLL e clique em “Search”;
3. É possível que o resultado seja semelhante ao mostrado abaixo:
Note que na parte inferior da tela aparece o nome e a descrição do módulo. Veja na janela de “Search” que vários processos estão usando esta DLL. Para excluí-la é necessário primeiramente “matar” o processo que tem o “handle” aberto com a DLL. Note que o processo explorer.exe está usando esta DLL, então é necessário terminá-lo e com isso o “shell” do Windows será terminado, por isso você pode tanto ativar o Task Manager e chamar o prompt de comandos ou antes de terminá-lo deixe uma janela com o prompt de comandos aberta, para que após o shell ser encerrado você possa navegar via linha de comando para a pasta e excluir o arquivo.
Em alguns cenários mais raros, mesmo após matar os processos ainda recebemos uma mensagem dizendo que não é possível excluir este arquivo. Para estes cenários é necessário entrar no modo de segurança e então excluir o arquivo.
7. Conclusão
O principal objetivo deste artigo é mostrar uma solução de contorno quando temos complementos (add ons) no Internet Explorer que podem causar um “crash” do programa durante a navegação em um web site. Usei esta DLL como exemplo devido a volume de chamados que em que trabalhei onde foi identificado que a causa era este arquivo. É sempre bom salientar que a solução de contorno demonstrada aqui é apenas algo que isola o problema e permite que você continue trabalhando. Quando isso acontece é importante contactar o fabricante do complemento (add on) e verificar se há uma atualização do arquivo ou se há alguma solução definitiva para o problema.