Cursos de Informática Grátis www.megainforcursos.com

20 de maio de 2012

QUAL A UTILIDADE UM DEBUGGER?


Boa noite 
pessoal!Ultimamente tenho visto uma certa quantidade de posts relativos a programação em linguagem assembly e ao uso de debuggers (seja para depuração ou para fazer adaptações). Resolvi criar uma pequena série de tutoriais (comecei hoje) cobrindo alguns conceitos interessantes sobre a utilização de debuggers e um pouco de engenharia reversa. A medida que eu vou escrevendo eu vou postando aqui, em forma de post mesmo.
Por enquanto escrevi apenas uma introdução e o esclarecimento de alguns conceitos. Estou pensando ainda no aplicativo que vou programar para usar como exemplo de análise, mas provavelmente eu faça apenas aquele programa clássico de "adivinhe o número" (escolha um número de 1 a 10...). Pretendo utilizar o OllyDbg nos tutoriais, pois é o meu debugger predileto e o que estou mais familiarizado (gratuito e pequeno).


Sumário:
  1. Introdução e conceitos
  2. Um pouco de assembly
  3. Interface do Olly Debugger
  4. Formas de aproximação
  5. Re-assembly
  6. Plugins
Mais capítulos em breve!

INTRODUÇÃO

Seguindo a minha linha de tutoriais voltados a programação, vou tratar sobre um assunto que me interessa muito e talvez seja interessante para os programadores em geral: disassembler e debuggers.

Primeiramente seria interessante esclarecer um pouco sobre o que é um debugger e o que é um disassembler, pois apesar de andarem quase sempre juntos, possuem finalidades diferentes. 

Disassembler é algo que consegue transformar linguagem de máquina para a linguagem assembly, transcrevendo as instruções enviadas ao processador para os seus mnemônicos em assembly (asm). Não deve ser confundido com um descompilador, que procura converter o código nativo em uma linguagem de mais alto nível como C, C++ ou Basic.

Debuggers são programas capazes de analisar, depurar e testar aplicações. Atualmente a maioria das IDEs de programação contam com um debugger embutido (Visual Studio, por exemplo). A principal utilidade deles é para a identificação e tratamento de erro, sendo que é possível rodar o código linha por linha (ou instrução por instrução) e analisar a mudança das variáveis e do comportamento do código. Os debuggers de binários já compilados - como os executáveis do Windows (EXE) - seguem o mesmo conceito dos depuradores normais, mas devido ao fato de o código já ter sido compilado, ele precisa ter um disassembler embutido no debugger para decodificar as instruções.

Atualmente existem dezenas de debuggers e disassemblers por aí, dentre os quais os mais famosos são: W32DASM, IDA, WinDbg, SoftICE e Ollydbg. Neste tutorial será utilizado o OllyDbg, pois é um dos melhores e mais poderosos debuggers (incluindo um disassembler) disponíveis no mercado. É também pequeno e gratuito

Site oficial do OllyDbg, com o link para download: http://www.ollydbg.de

QUAL A UTILIDADE UM DEBUGGER?

Muita gente se pergunta do porquê de usar um debugger, sendo que na maioria dos casos você tem a acesso ao código fonte original (caso você tenha programado o aplicativo). Vou citar abaixo algumas das maiores utilidades de um debugger:
  • Tratamento de erro. Certamente uma das principais. Às vezes durante a programação de um aplicativo um pequeno erro passou despercebido, ocasionando mal funcionamento ou gerando uma operação ilegal. Em muitos casos é mais fácil você analisar o binário já compilado dentro de um debugger do que tentar encontrar o erro no código original. Dentro desse mesmo item podemos citar a correção de bugs de aplicações já descontinuadas (desde que com a autorização da empresa dona dos direitos).
  • Engenharia reversa. O processo de engenharia reversa de software não poderia ser feito de forma eficiente sem a utilização de um debugger/disassembler. Muitas pessoas tendem a confundir cracking com engenharia reversa, sendo que são conceitos diferentes. A engenharia reversa por si só é uma atividade completamente legal, pois muito do que vemos hoje só foi possível devido à engenharia reversa. A criação de drivers para Linux de periféricos que antes só funcionavam com o Windows (WinModems) é um bom exemplo de como a engenharia reversa traz coisas boas para nós.
  • Aprendizado. O uso de debuggers e engenharia reversa é uma das melhores formas de se aprender a linguagem assembly. Você programa algo em uma linguagem de médio ou alto nível e posteriormente analisa o resultado do binário compilado dentro de um debugger. Com esse conhecimento é possível dominar melhor a linguagem e criar algoritmos mais otimizados e eficientes.
CONCEITOS NECESSÁRIOS

Para entender o funcionamento de um debugger é preciso saber um pouco sobre alguns conceitos ligados a informática, como o funcionamento da memória, processador, pilhas e endereços. O conhecimento básico de assembly também é necessário, já que essa é a linguagem que teremos de analisar. Caso não tenha experiência em assembly, fique tranqüilo, pois nos capítulos seguintes darei uma visão geral sobre ela, o suficiente para entender o nosso mini-aplicativo de estudo. Abaixo segue uma breve lista de conceitos:
  • Processador/CPU: É o cérebro de todo computador. É ele que decodifica as instruções e executa os códigos operacionais. É composto basicamente por uma unidade lógico-aritmética (ALU), unidade de ponto flutuante (FPU), registradores, cachê, barramento e gerador de clock.
  • Memória RAM: Local de armazenamento temporário de dados (são apagados ao desligar o computador). Todo aplicativo se utiliza da memória para armazenar seus dados e estes são buscados e gerenciados pelo processador.
  • Endereçamento de memória: É uma faixa de valores que apontam para uma determinada posição de memória. Toda vez que você escreve ou lê algum dado da memória é necessário indicar o endereço de onde está aquele valor, para que o processador possa buscá-lo.
  • Pilha (Stack): É uma estrutura de dados. Sua principal característica é a forma de funcionamento, onde você apenas coloca ou retira os valores, sem indicar um endereço (LIFO – Last in, First Out – Último a entrar, primeiro a sair). Ela funciona de forma semelhante a uma pilha de livros em que você vai os empilhando. Quando precisar remover um deles, é necessário tirar todos os livros de cima.
  • Registradores: Pequenas partes de memória presentes dentro dos processadores (não confundir com memória RAM). Extremamente rápidas, sendo que a CPU as utiliza como forma temporária de armazenamento de dados e realização de operações. A quantidade de dados que podem ser armazenados vai depender do tipo de processador. Os processadores de 32 bits conseguem armazenar números de até 32 bits em cada registrador, sem precisar de rotinas de conversão.
Parte 2 em breve. Provavelmente com imagens já.

0 comentários:

Postar um comentário

 
Design by Wordpress Theme | Bloggerized by Free Blogger Templates | coupon codes