[PowerShell Script] PowerDbg - Usando PowerShell para controlar o WinDbg

Por Roberto Alexis Farah

 

Algum tempo atrás meu amigo Vandy Rodrigues, do time de Messaging, me falou entusiasmado sobre PowerShell e porque eu deveria aprender PowerShell.

Devo admitir que minha reação inicial foi: Por que preciso aprender ainda outra linguagem de script?

Mas após uma única demonstração me apaixonei pela linguagem.

Depois de ler alguns livros decidi criar meu primeiro código PowerShell. Pensei sobre o assunto e tive algumas idéias. A idéia que optei por implementar foi fazer um script que interagisse com o WinDbg de modo a substituir a linguagem de programação do WinDbg.

Portanto, nesse artigo apresento a biblioteca PowerDbg!

A idéia inicial era interagir com a dll DBGENG.DLL do WinDbg. Descartei essa possibilidade por várias razões, entre elas a limitada documentação.

Em seguida considerei o uso de MDBGENG.DLL que é um wrapper para DBGENG.DLL. Essa é a abordagem que adoraria usar; infelizmente essa dll ainda é para uso interno somente.

No futuro, quando a MDBENG.DLL se tornar pública vou utilizá-la.

Assim sendo, optei por uma terceira abordagem, uma vez que tenho que usar as mesmas ferramentas que meus leitores e clientes: WSH – Windows Script Host.

PowerDbg é composta de um conjunto de rotinas que basicamente fazem isso:

- Enviam comandos para o WinDbg.

- Extraem a saída de comandos enviados para o WinDbg.

VISÃO GERAL

As rotinas PowerDbg usam 3 arquivos de logs:

POWERDBG.LOG              ß Gerado no diretório do WinDbg.

POWERDBG-OUTPUT.LOG ß Gerado no diretório onde as rotinas/scripts são chamados.

POWERDBG-PARSED.LOG ß Gerado no diretório onde as rotinas/scripts são chamados.

POWERDBG.LOG é a saída dos comandos enviados ao WinDbg. As rotinas extratoras (parsers) extraem informação desse arquivo.

POWERDBG-OUTPUT.LOG é a saída sintetizada dos comandos. Ou seja, apenas os dados relevantes. As rotinas de Parser usam esse arquivo.

POWERDBG-PARSED.LOG é gerado pelas rotinas de Parser que lêem o conteúdo de POWERDBG-OUTPUT.LOG e geram um arquivo CSV, que é o POWERDBG-PARSED.LOG.

O arquivo CSV pode ser mapeado para um hash table e há uma rotina específica que cuída de converter um arquivo CSV para um hash table.

Os comandos são enviados para o WinDbg usando a função SendPowerDbgCommand() . Essa rotina envia comandos para a primeira instancia do WinDbg que possui o título PowerDbg.

Se o WinDbg não foi instanciado, pode-se fazer isso usando Start-PowerDbgWinDbg() . Essa rotina automaticamente muda o título do WinDbg para PowerDbg.

Parse-PowerDbgCOMMANDNAME () – Essas rotinas fazem a extração de dados de um comando específico. Há várias dessas rotinas e outras estão sendo criadas.

Eis algumas rotinas de parser:

Parse-PowerDbgLMI()

Parse-PowerDbgDUMPMODULE()

Parse-PowerDbgDUMPMD()

Parse-PowerDbgDT()

Para enviar comandos temos:

Send-PowerDbgDML()   - Envia comandos usando DML, ou seja, hyperlinks.

Send-PowerDbgCommand() - Usa WMI para se comunicar com o WinDbg. Cada comando juntamente com sua saída é salvo em um arquivo de log que é constantemente sobreescrito.

Para converter arquivos CSV para um hash table:

Convert-PowerDbgCSVtoHashTable() – Converte um arquivo CSV para um hash table.

Para iniciar o depurador, caso não haja uma instância rodando:

Start-PowerDbgWinDbg()

Com PowerDbg conseguimos fazer um script PowerShell enviar comandos para o WinDbg e identificar a saída desse comandos, como aparecem na janela do WinDbg.

Se você quiser criar suas próprias rotinas de Parser, basta usar as existentes como template.

Para exemplos de uso e código fonte, veja aqui:

Debugging Toolbox