[Windbg Script] Obtendo Base Address e Image Name a partir de uma chamada de método

Por Roberto Alexis Farah

Após criar esse script, tenho usado ele em quase todo incidente que requer decompilação e acredito que você também usará ele.

Esse script fornece o endereço base e nome do módulo, assim você pode usar o comando !SaveModule da extensão SOS.

Ok… talvez você esteja se perguntando o que há de tão legal nisso.

Explico: usando !SaveModule ou !SaveModules da SOS, você pode salvar módulos e decompilá-los usando .NET Reflector. Entretanto, se você usa !SaveModule, você precisa do Base Address e Image Name do módulo antes de usar esse comando.

Isso significa que você precisa escavar o arquivo de dump para obter essa informação.

O objetivo desse script é:

1- Poupar seu tempo para obter o Base Address e Image Name.

2- Permitir que você use o nome de algum método obtido via !clrstack, por exemplo, para obter a informação do módulo. Portanto, se por alguma razão você quer o módulo ou todos os módulos de uma chamada de método, você precisa apenas rodar o script SAVE_MODULE.TXT, como nesse exemplo:

0x0012eebc 0x03df0669 [DEFAULT] [hasThis] Void SomeComponent.fACAtenInterl.DtGRes_DoubleClick(Object,Class System.EventArgs)

$$a<myscripts\save_module.txt SomeComponent.fACAtenInterl.DtGRes_DoubleClick

E você obterá o Base Address e Image Name de todos os módulos que usam esse método. Então você usa !SaveModule para salvá-lo em arquivo.

Eu optei por usar o nome do método como argumento, mas poderia ter usado o endereço EIP (0x03df0669 no exemplo acima). Essa abordagem seria mais rápida, porém, menos flexível na minha opinião porque algumas vezes você poderia querer obter informação do módulo usando uma chamada de método que não está na pilha.

Como você pode ver eu uso o comando .shell. Usando esse comando não posso usar espaços para identar o script. Em outras palavras, não posso usar quebra de linhas. Isso significa que o script terá algumas linhas muito longas quando você salvá-lo como texto.

Nota: Use o Word ao invés do Notepad para salvar o documento como texto. Usando o Notepad uma linha em branco é criada para cada linha de código fonte.

Outra coisa para se manter em mente: você precisa rodar o script usando $$a< e não $$>a< porque a última forma é usada quando as linhas são separadas por espaços, como ocorre na maioria dos meus scripts.

Eis imagens e o código fonte:

Debugging Toolbox.