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.