1. Introdução
Esta publicação tem como objetivo estudar algumas técnicas de engenharia reversa. Todos os materiais são apresentados apenas para fins informativos e não se destinam a ser utilizados para qualquer ganho pessoal.
Assunto da pesquisa
Como exemplo, estudaremos o código da documentação do Atomineer Pro (daqui em diante APD). Este é um plug-in para o Visual Studio projetado para gerar automaticamente comentários nos códigos-fonte. Primeiro, instale este plugin e verifique seu funcionamento. A versão gratuita possui um período de teste e várias restrições de uso durante esse período. Portanto, ao adicionar comentários ao arquivo, o usuário recebe uma mensagem informando que durante o dia você pode processar apenas 10 arquivos
Quando você tenta processar o projeto inteiro, o utilitário exibe uma caixa de diálogo avisando que este comando não está disponível.
Vamos começar
Primeiro, procure no diretório da extensão instalada e localize apenas uma biblioteca dinâmica. Nós precisamos disso. A primeira coisa que faremos é enviá-lo para o descompilador dotPeek do JetBrains.
Como você pode ver na tela, a biblioteca passou por um ofuscador, as variáveis e métodos foram renomeados e têm nomes como a, b, c, d ... é disso que precisamos. Estávamos procurando exatamente isso. Vamos ver o que pode ser feito.
Parte 1
A primeira coisa que vem à mente é encontrar a linha, mas como a funcionalidade de pesquisa não está no dotPeek, vamos por um caminho diferente.
Descompilamos a biblioteca com o
ildasm.exe padrão dos Microsoft SDKs. A saída receberá apenas um arquivo de texto. Nele, procuramos o texto da mensagem “
Modo de teste. Por favor, note que o seu ... "
Encontrou um método
Família .method escondeu bool estático e () cil gerenciado
Que pertence à classe CmdDocThisScope. Agora, de volta ao dotPeek.
Então, o que temos. Encontramos um método que exibe uma mensagem de avaliação do APD e, dependendo da condição, retorna verdadeiro ou falso. Encontramos todos os lugares a partir dos quais esse método é chamado
Apenas dois pontos de chamada foram encontrados e esses são os métodos CmdDocThisFile :: ce CmdDocThisScope :: c.
Pelo nome das classes e pelo código do construtor, é óbvio que as classes são responsáveis pelos itens de menu, e a virtualidade do método “c” indica que este é o manipulador de eventos para selecionar o item de menu correspondente pelo usuário (Essas informações serão úteis para nós). É fácil adivinhar que, se o método retornar true, o comando será executado, mesmo que ele mostre uma caixa de diálogo com um aviso.
No início do método CmdDocThisScope :: e, a variável f é incrementada. Abra a janela "IL View" e encontre o código de comando:
A Wikipedia possui um artigo que
descreve essas instruções .
Em seguida, encontre esse método no arquivo da biblioteca APD. Faremos isso usando a ferramenta IDA. Na janela com as funções, encontraremos nosso método e veremos o código já familiar.
Tendo selecionado a instrução ldsfld, encontramos sua representação binária na janela Hex View
A descrição da equipe confirma que encontramos o lugar certo.
Uma análise mais aprofundada do código desse método e as etapas subsequentes estão além do escopo deste artigo.
Parte 2
Agora, como pesquisadores já experientes, encontramos uma chamada para o diálogo com a mensagem "
O comando 'Documentar tudo no projeto' está disponível apenas na versão completa ... ". Este método é CmdDocThisProject :: c
A classe CmdDocThisProject é responsável pelo comando "Process Project", o método "c" é virtual. E contém apenas uma coisa - é uma chamada para o diálogo com uma mensagem. Sem condições, sem verificações. A pesquisa do código-fonte nos leva ao método CmdDocThisProject :: i, que tem o que esperamos em CmdDocThisProject :: c. Agora, na IDA, podemos encontrar facilmente os métodos necessários e aprender as instruções do CIL
Conclusão
Resta dizer que o artigo deliberadamente deixou manchas brancas para seu estudo independente.