Sei sulla pagina 1di 18

Utilizando um debugger - OllyDbg

http://www.hardware.com.br/comunidade/utilizando-debugger/785195/

Usurio Senha FrumGdH Home do Hardware.com.br

Lembrar?

Utilizando um debugger - OllyDbg


Programao, scripts, web e banco de dados

1. Utilizando um debugger - OllyDbg

23-09-2007 por Fergo

Utilizando um debugger - OllyDbg Boa noite pessoal! Ultimamente tenho visto uma certa quantidade de posts relativos a programao em linguagem assembly e ao uso de debuggers (seja para depurao ou para fazer adaptaes). Resolvi criar uma pequena srie de tutoriais (comecei hoje) cobrindo alguns conceitos interessantes sobre a utilizao 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 introduo e o esclarecimento de alguns conceitos. Estou pensando ainda no aplicativo que vou programar para usar como exemplo de anlise, mas provavelmente eu faa apenas aquele programa clssico de "adivinhe o nmero" (escolha um nmero de 1 a 10...). Pretendo utilizar o OllyDbg nos tutoriais, pois o meu debugger predileto e o que estou mais familiarizado (gratuito e pequeno). Sumrio: 1. 2. 3. 4. 5. 6. Introduo e conceitos Um pouco de assembly Interface do Olly Debugger Formas de aproximao Re-assembly Plugins

Mais captulos em breve!

INTRODUO
Seguindo a minha linha de tutoriais voltados a programao, 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 mquina para a linguagem assembly, transcrevendo as instrues enviadas ao processador para os seus mnemnicos em assembly (asm). No deve ser confundido com um descompilador, que procura converter o cdigo nativo em uma linguagem de mais alto nvel como C, C++ ou Basic. Debuggers so programas capazes de analisar, depurar e testar aplicaes. Atualmente a maioria das IDEs de programao contam com um debugger embutido (Visual Studio, por exemplo). A principal utilidade deles para a identificao e tratamento de erro, sendo que possvel rodar o cdigo linha por linha (ou instruo por instruo) e analisar a mudana das variveis e do comportamento do cdigo. Os debuggers de binrios j compilados - como os

1 de 18

29/4/2014 09:25

Utilizando um debugger - OllyDbg

http://www.hardware.com.br/comunidade/utilizando-debugger/785195/

executveis do Windows (EXE) - seguem o mesmo conceito dos depuradores normais, mas devido ao fato de o cdigo j ter sido compilado, ele precisa ter um disassembler embutido no debugger para decodificar as instrues. Atualmente existem dezenas de debuggers e disassemblers por a, dentre os quais os mais famosos so: W32DASM, IDA, WinDbg, SoftICE e Ollydbg. Neste tutorial ser utilizado o OllyDbg, pois um dos melhores e mais poderosos debuggers (incluindo um disassembler) disponveis no mercado. tambm 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 cdigo 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 programao de um aplicativo um pequeno erro passou despercebido, ocasionando mal funcionamento ou gerando uma operao ilegal. Em muitos casos mais fcil voc analisar o binrio j compilado dentro de um debugger do que tentar encontrar o erro no cdigo original. Dentro desse mesmo item podemos citar a correo de bugs de aplicaes j descontinuadas (desde que com a autorizao da empresa dona dos direitos). Engenharia reversa. O processo de engenharia reversa de software no poderia ser feito de forma eficiente sem a utilizao de um debugger/disassembler. Muitas pessoas tendem a confundir cracking com engenharia reversa, sendo que so conceitos diferentes. A engenharia reversa por si s uma atividade completamente legal, pois muito do que vemos hoje s foi possvel devido engenharia reversa. A criao de drivers para Linux de perifricos que antes s funcionavam com o Windows (WinModems) um bom exemplo de como a engenharia reversa traz coisas boas para ns. 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 mdio ou alto nvel e posteriormente analisa o resultado do binrio compilado dentro de um debugger. Com esse conhecimento possvel dominar melhor a linguagem e criar algoritmos mais otimizados e eficientes.

CONCEITOS NECESSRIOS
Para entender o funcionamento de um debugger preciso saber um pouco sobre alguns conceitos ligados a informtica, como o funcionamento da memria, processador, pilhas e endereos. O conhecimento bsico de assembly tambm necessrio, j que essa a linguagem que teremos de analisar. Caso no tenha experincia em assembly, fique tranqilo, pois nos captulos seguintes darei uma viso geral sobre ela, o suficiente para entender o nosso mini-aplicativo de estudo. Abaixo segue uma breve lista de conceitos: Processador/CPU: o crebro de todo computador. ele que decodifica as instrues e executa os cdigos operacionais. composto basicamente por uma unidade lgicoaritmtica (ALU), unidade de ponto flutuante (FPU), registradores, cach, barramento e gerador de clock. Memria RAM: Local de armazenamento temporrio de dados (so apagados ao desligar o computador). Todo aplicativo se utiliza da memria para armazenar seus dados e estes so buscados e gerenciados pelo processador. Endereamento de memria: uma faixa de valores que apontam para uma determinada posio de memria. Toda vez que voc escreve ou l algum dado da memria necessrio indicar o endereo de onde est aquele valor, para que o processador possa busc-lo. Pilha (Stack): uma estrutura de dados. Sua principal caracterstica a forma de

2 de 18

29/4/2014 09:25

Utilizando um debugger - OllyDbg

http://www.hardware.com.br/comunidade/utilizando-debugger/785195/

funcionamento, onde voc apenas coloca ou retira os valores, sem indicar um endereo (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, necessrio tirar todos os livros de cima. Registradores: Pequenas partes de memria presentes dentro dos processadores (no confundir com memria RAM). Extremamente rpidas, sendo que a CPU as utiliza como forma temporria de armazenamento de dados e realizao de operaes. A quantidade de dados que podem ser armazenados vai depender do tipo de processador. Os processadores de 32 bits conseguem armazenar nmeros de at 32 bits em cada registrador, sem precisar de rotinas de converso. Parte 2 em breve. Provavelmente com imagens j. Abraos, Fergo
23-09-2007 por Fergo

Continuao...

UM POUCO DE ASSEMBLY
Para fazer o debug de binrios compilados necessrio ter um conhecimento (ao menos bsico) da linguagem assembly, j que para ela que a linguagem de mquina traduzida. Assembly (ou asm, com abreviada) uma linguagem de baixo nvel que basicamente interpreta os cdigos operacionais (opcodes, veja abaixo) e os transcreve para seus mnemnicos. literalmente uma traduo da linguagem de mquina. O uso da linguagem assembly pode ser bem variado, podendo fazer de tudo um pouco, mas amplamente utilizada na programao bsica de Kernels e em algoritmos que precisam ser altamente otimizados, onde asm a linguagem ideal, j que puramente linguagem de mquina traduzida. No pretendo agora explicar todo o funcionamento, estrutura e comandos da linguagem. Vou dar apenas um apanhado geral sobre alguns termos e uma breve descrio sobre os comandos mais bsicos e corriqueiros que se encontra. Precisamos primeiramente definir o que so mnemnicos e o que so os opcodes. Opcodes (traduzido em operational code, ou cdigo de operao) a instruo que enviada e interpretada pelo processador. Cada opcode, ao ser interpretado pelo processador, vai realizar uma operao. Mnemnicos so as palavras ou combinao de letras utilizadas para representar um opcode, tornando a linguagem de mquina mais legvel. Veja abaixo um exemplo de um mnemnico do comando MOV:
Cdigo:

MOV EAX,1

Esse comando em assembly apenas move o valor 1 para o registrador EAX (veremos isso logo adiante na explicao dos comandos). Na hora de transformar isso em linguagem de mquina (por um asssembler), esse comando traduzido para um conjunto de nmeros que possa ser interpretado pelo processador:
Cdigo:

B801000000

A teoria por trs de traduo de mnemnicos em opcode (e vice-versa) um tanto complexa, principalmente para a plataforma Intel na arquitetura IA32. um processo que deve ser realizado bit a bit e fugiria um pouco do contexto deste tutorial.

3 de 18

29/4/2014 09:25

Utilizando um debugger - OllyDbg

http://www.hardware.com.br/comunidade/utilizando-debugger/785195/

A principal dificuldade na linguagem assembly certamente a sua estrutura, que foge do padro de linguagens de mais alto nvel como C ou Pascal. Nada de Ifs com mltiplas comparaes, Switches, For ou While. Tudo feito com comparaes simples e saltos, perdendo a sua linearidade (semelhante aos GoTo do BASIC). Felizmente hoje temos debuggers muito inteligentes que conseguem estruturar e identificar rotinas e repeties, facilitando muito o trabalho de interpretao. Mesmo com essas melhorias, ainda acho importante ter um papel e uma caneta ao lado, onde voc pode fazer anotaes e ir estruturando/convertendo o cdigo na medida em que voc os interpreta. Para o assembly, a localizao dos valores e variveis sempre baseada nos endereos que elas ocupam na memria. O nome que voc define para uma varivel durante a programao substitudo pelo endereo de memria que ela ocupa. Cada instruo tambm possui um endereo, que utilizado para controlar o fluxo e a estrutura do cdigo. Sempre que voc faz um salto, necessrio indicar o endereo que o cdigo deve ser direcionado, semelhante ao que ocorria nas numeraes de linhas dos BASICs mais antigos. Veja um exemplo abaixo de como ficaria um cdigo em C e o seu resultado compilado para assembly, utilizando apenas registradores comuns:
Cdigo:

void main() { int a = 4; int b = 6; int c; if((a == 4) && (b == 6)) { c = 5; } }

O cdigo acima quando compilado pode se transformar em algo semelhante a isso (boa parte do cdigo acima intil, estou utilizando somente para exemplificar):
Cdigo:

00000000 00000005 0000000A 0000000D 0000000F 00000012 00000014 00000019

MOV EAX,4h MOV EBX,6h CMP EAX,4h JNE 00000019h CMP EBX,6h JNE 00000019h MOV ECX,5h RETN

;move o valor 4 para EAX ;move o valor 6 para EBX ;compara EAX com 4, se for verdadeiro: ZF = 1 ;se ZF != 1, pule para endereo 00000019h ;compara EBX com 6, se for verdadeiro: ZF = 1 ;se ZF != 1, pule para endereo 00000019h ;move o valor 5 para ECX ;finaliza execuo e retorna

Pra entender o cdigo acima necessrio entender sobre aquilo que compe a linguagem assembly. Ela basicamente composta por registradores, endereos e instrues (mnemnicos). Os registradores foram explicados no captulo anterior, mas vamos agora saber quem so eles. Os processadores da arquitetura Intel de 32 bits possuem basicamente nove registradores de 32 bits comuns: EAX, EBX, ECX, EDX, ESP, EBP, ESI, EDI e EIP. Teoricamente cada um desses registradores possui uma determinada funo padro, mas devido a sua escassez, muitas vezes eles so utilizados como registradores para qualquer propsito. Voc pode criar um cdigo usando livremente os oito primeiros registradores que no haver muitos problemas (desde que saiba o que est fazendo/modificando). O ltimo registrador, EIP, quase sempre mantido intacto, pois ele o responsvel por contar as instrues e informar o endereo da prxima instruo. Alterar o seu valor pode desviar completamente o fluxo do aplicativo e provavelmente vai gerar uma falha de segmentao ou uma operao ilegal.

4 de 18

29/4/2014 09:25

Utilizando um debugger - OllyDbg

http://www.hardware.com.br/comunidade/utilizando-debugger/785195/

Esses registradores apresentados so todos de 32 bits. No entanto tambm possvel utilizar apenas 8 ou 16 bits, como mostra a tabela abaixo utilizando o EAX como exemplo (a teoria vale para os outros registradores tambm):

Para o caso da poro de 8 bits, o registrador terminado em L so os 8 bits menos significantes de AX e o terminado em H so os 8 bits mais significantes de AX. Para a poro de 16 bits, so utilizados os 16 bits menos significantes da poro de 32 bits.

Alm dos registradores, tambm existem as Flags, que so bits utilizados como resultado de operaes (verdadeiro ou falso, por exemplo). Elas so usadas principalmente para anlise condicional em instrues como CMP e TEST. Dentre as diversas flags, as mais corriqueiras so: ZF (Zero Flag), CF (Carry Flag) e SF (Signal Flag). A ZF setada sempre que uma operao resulta em zero (uma comparao entre dois nmeros atravs do comando CMP subtrai seus operandos sem alterar valores e seta a ZF caso o resultado da subtrao seja zero, indicando valores iguais). A flag CF setada quando o resultado de uma operao estoura o valor mximo comportado pelo registrador/local sem considerar o sinal (overflow). Por ltimo, tempos a SF, que ativada sempre que o bit mais significativo de um operando for 1, indicando um valor negativo (pesquise sobre complemento de dois). Os endereos na linguagem assembly so a base para o fluxo do aplicativo e para o armazenamento de dados. As variveis que voc usa durante a programao so substitudas por endereos que apontam para uma rea da memria paginada com acesso a leitura e a escrita. Os destinos dos saltos (Jumps) tambm dependem dos endereos das instrues, pois atravs deles que voc informa o destino do salto. O cdigo abaixo demonstra apenas uma linha de assembly onde possvel ver o endereo da instruo (00401000) e o endereo para um byte de memria (00403000) para o qual o nmero nove est sendo movido:
Cdigo:

00401000 MOV BYTE PTR DS:[00403000], 09h

Por ltimo temos as instrues, que nada mais so do que os opcodes traduzidos em um mnemnico, como demonstrado e exemplificado alguns pargrafos acima. Abaixo eu vou por uma pequena lista mostrando algumas das instrues mais utilizadas, pois seria invivel colocar todas elas (so aproximadamente 130 instrues bases para a arquitetura Intel). MOV destino, origem Move o valor do campo origem para o destino. Essa instruo possui diversas variaes, por isso ela pode aparecer de diversas formas diferentes (pode-se trabalhar com constantes, memria, pilha, etc). Alguns exemplos: MOV EAX, 10h MOV AX, WORD PTR DS:[00403000] MOV BYTE PTR DS:[00403002], 1Ch CMP arg1, arg2 Realiza uma comparao entre os dois operandos. A comparao feita simplesmente subtraindo os dois operandos e caso o resultado for zero (valores iguais), ele seta a ZF para 1. Vale lembrar que essa operao no altera os valores dos operandos, apenas as flags. CMP EAX, 04h

5 de 18

29/4/2014 09:25

Utilizando um debugger - OllyDbg

http://www.hardware.com.br/comunidade/utilizando-debugger/785195/

JMP endereo Faz um salto incondicional e obrigatrio para o endereo indicado. JMP 00401008h JZ endereo / JE endereo Faz um salto condicional. Caso o valor da zero flag seja 1, ele realiza o salto. Normalmente utilizado junto com um CMP para realizar um desvio caso a comparao seja verdadeira. JE 0040101Ah JNZ endereo / JNE endereo Semelhante ao item acima, mas realiza o salto somente quando a zero flag no foi setada (ZF = 0). JNZ 0040102Ch ADD destino, arg1 Adiciona o valor de arg1 ao destino. Tambm possui diversas variaes, pelas mesmas razes do comando MOV. Se o resultado estourar o limite do destino, a CF setada. ADD EBX, 04h ADD EBX, DWORD PTR DS:[00403032] SUB destino, arg1 Realiza uma subtrao dos operandos. As variaes e caractersticas so as mesmas do comando ADD. SUB ECX, 2Ah PUSH valor Coloca o valor no topo da pilha (Stack). O comando PUSH amplamente utilizado nas chamadas de funes (CALL), pois atravs da pilha que a funo busca seus argumentos. PUSH 08h POP destino Remove o valor do topo da pilha e o armazena no destino. POP EAX CALL local Faz chamada a uma funo. possvel passar o local de diversas formas para o comando CALL, desde uma constante, registrador ou at mesmo uma funo externa dentro de uma DLL. O comando CALL usa a pilha para indicar o endereo para o qual a funo deve retornar depois de finalizada a sua execuo. CALL User32!GetDlgItemTextA CALL 0040115Fh Essas so as instrues mais comuns dentro de um binrio compilado. Claro que existe mais de uma centena delas, mas eu procurei colocar aqui apenas aquelas que sero utilizadas no aplicativo de aprendizado. Para uma lista completa com uma explicao mais profunda dos opcodes, recomendo ver a lista apresentada neste endereo: http://www.numaboa.com.br/informatic...ncias/opcodes/ O prximo captulo cobrir a parte da apresentao da interface do OllyDbg para depois podermos realmente colocar a mo na massa e analisar um binrio. Comentrios/crticas/sugestes so bem vindas, claro (no me importo que as partes no

6 de 18

29/4/2014 09:25

Utilizando um debugger - OllyDbg

http://www.hardware.com.br/comunidade/utilizando-debugger/785195/

fiquem em sequncia). Abraos! Fergo


23-09-2007 por philix

cara!! Para que vc faz um tutorial to bom?! Vou ter que parar meu servio para ler agora!
23-09-2007 por Etinin

Nota 10 como praticamente todos seus tutos anteriores, Fergo!


25-09-2007 por Fergo

Valeu pelo suporte pessoal! A vai mais um pedao

INTERFACE DO OLLY DEBUGGER


Aps uma boa parte terica, chegou a hora de por em prtica aquilo que acabamos de estudar. Neste captulo vou apresentar um pouco da interface do OllyDbg, que apesar de intuitiva, merece esclarecimentos. Para o nosso estudo, eu criei um simples aplicativo que iremos depurar mais a frente. Ele necessrio neste j neste captulo (no para depurao, mas para a apresentao dos itens do Olly). Voc pode baixar o arquivo executvel juntamente com o seu cdigo fonte (programado em assembly na sintaxe MASM32 utilizando o WinAsm Studio como IDE) no link abaixo: http://www.fergonez.net/files/adivinhe.rar O OllyDbg pode ser baixado gratuitamente atravs do site http://www.ollydbg.de. bem pequeno e no necessita instalao, basta extrair o contedo para uma pasta qualquer. Aps extrado, abra o Olly, v em File->Open e abra o nosso arquivo de estudo (adivinhe.exe). Rapidamente o Olly vai interpretar o arquivo e mostrar o disassembly na janela principal. Vamos deixar essa parte mais frente, j que o objetivo deste captulo apenas mostrar a interface, sem depurar o aplicativo por enquanto. A tela deve ser semelhante a essa:

7 de 18

29/4/2014 09:25

Utilizando um debugger - OllyDbg

http://www.hardware.com.br/comunidade/utilizando-debugger/785195/

A interface do aplicativo composta por poucos botes. O segredo do Olly o boto direito do mouse. A maioria das funes existentes no aplicativo pode ser acessada atravs do boto direito do mouse, sendo que os itens exibido no menu de popup variam de acordo com o local onde foi dado o clique (dependendo da coluna e da regio). Eu numerei as principais regies da tela de 1 a 4. Regio 1 Esta a tela principal do programa, onde apresentado o disassembly do aplicativo. Ela dividida em quatro colunas:

Coluna 1 Address. Ela nos mostra o endereo virtual das instrues (para saber mais sobre esse endereamento, veja meu artigo sobre o funcionamento dos executveis). Voc pode reparar que os endereos no so em intervalos iguais para cada instruo. Isso ocorre devido ao fato de que o tamanho das instrues ser varivel, como podemos observar na segunda coluna. Coluna 2 Hex Dump. Aqui temos o cdigo da instruo no seu formato hexadecimal (a cada 2 caracteres, temos 1 byte). So esses valores que ficam armazenados dentro do arquivo executvel e que so passados para o processador. Como mencionado no pargrafo anterior, as instrues variam de tamanho, sendo que o endereo da prxima instruo dado pelo endereo da instruo atual mais a soma dos bytes da instruo. Veja o exemplo do nosso aplicativo de exemplo. Ele comea no endereo 00401000 (padro do Windows) e a sua primeira instruo composta por 2 bytes (6A 00). O endereo da prxima instruo (na linha de baixo) vai ser o endereo atual somado com o tamanho da instruo (00401000+2) = 00401002. Coluna 3 Disassembly. Essa coluna nada mais do que a interpretao e a traduo

8 de 18

29/4/2014 09:25

Utilizando um debugger - OllyDbg

http://www.hardware.com.br/comunidade/utilizando-debugger/785195/

para assembly das instrues presentes na segunda coluna. A anlise do aplicativo feita quase que inteiramente nela. Coluna 4 Comments. Essa coluna no influencia no aplicativo, ela utilizada apenas para comentrios e informaes. O Olly a utiliza para identificar as chamadas de funo juntamente com os seus argumentos (voc pode ver que ele identifica as chamadas da API do Windows em vermelho e lhe mostra os argumentos, facilitando e muito a interpretao). Regio 2 Essa rea mostra todos os registradores e flags que ns vimos anteriormente (juntamente com diversos outros valores). A cada instruo essa tela atualizada, mostrando o estado atual de cada um dos itens. Caso algum desses itens tenha sido modificado de uma instruo para outra, o Olly as colore com outra cor (nesse caso o vermelho). As flags so mostradas logo abaixo dos registradores, abreviadas com a letra C (Carry Flag), Z (Zero Flag) e S (Signal Flag) Regio 3 Essa regio nos mostra a memria fsica (RAM) destinada ao aplicativo. possvel observar o valor de cada byte de memria dentro do espao reservado ao aplicativo. composta por trs colunas: Coluna 1 Address. Mostra os endereos virtuais de memria. Coluna 2 Hex Dump. Este espao contm o valor de cada byte da memria. Por padro o Olly coloca 8 bytes por linha e por essa razo a coluna de endereos cresce de 8 em 8 bytes. Coluna 3 ASCII. Essa coluna pode ser utilizada para exibir de formas diferentes os valores contidos na memria. Por padro o Olly opta por exibir a representao ASCII desses valores. O modo de representao pode ser alterado utilizando o boto direito do mouse.

Regio 4 Mostra o estado atual da pilha (stack). Como visto anteriormente, a pilha amplamente utilizada durante as chamadas de funo. O VisualBasic uma linguagem que faz um uso muito grande da pilha, principalmente pela quantidade de funes que so utilizadas pelo aplicativo. Tambm dividida em 3 colunas : Coluna 1 Address. Cumpre o mesmo papel das outras colunas de endereo. Nota-se que o endereo cresce de quatro em quatro bytes, pois cada posio da pilha ocupada por um tipo DWORD (4 bytes) Coluna 2 Value. Valor armazenado naquele endereo da pilha Coluna 3 Comment. Utilizado para comentrios e mostrar informaes relevantes sobre aquele endereo. O Olly identifica diversos itens da pilha (como endereos de retorno) e adiciona essas informaes na coluna de comentrios. Alm das regies ns temos a barra de ferramentas:

Abaixo uma descrio de cada boto, da esquerda para a direita. Open - Abre o executvel para depurao Restart Recarrega o aplicativo atual Close Fecha a aplicao carregada

9 de 18

29/4/2014 09:25

Utilizando um debugger - OllyDbg

http://www.hardware.com.br/comunidade/utilizando-debugger/785195/

Play Inicia a execuo e depurao do aplicativo. Caso nenhum breakpoint tenha sido posicionado (veremos adiante), o programa ser executado normalmente. Pause Pausa o aplicativo em andamento Step Into Caso um breakpoint tenha sido colocado em uma chamada de funo, esse boto lhe permite fazer a depurao do contedo dessa funo. Step Over O contrrio do item anterior. Ele simplesmente no entra dentro da chamada (mas ainda assim a executa), continuando a depurao na prxima instruo. Trace Into Utilizado apenas quando est se faz backtracing. Ele registra as aes e endereos em um log, registrando tambm o contedo das funes chamadas. Trace Over Semelhante ao item acima, mas no faz o registro do contedo das chamadas. Execute Till Return Executa as instrues at encontrar o primeiro comando de retorno (RETN). Go to Address Permite ao usurio especificar um endereo do cdigo para visualizar. Aps os comandos bsicos de depurao, temos os botes das janelas: L Show Log Window: exibe um log, no qual o Olly registra algumas aes como carregamento de plugins, etc. E Show Modules Window: exibe todos os mdulos e funes externas utilizados pelo programa (DLLs). Com o menu direito possvel acessar uma gama de opes dentro dessa janela (o mesmo vale para todas as outras janelas que forem mencionadas). Essa janela de mdulos muito importante para configurar breakpoints nas APIs do Windows, facilitando a aproximao em determinada regio do cdigo. M Show Memory Window: mostra o estado da memria que est sendo utilizado pelo aplicativo, incluindo as sees do executvel e tabelas de importao/exportao. Para um detalhamento byte a byte da memria, deve se utilizar a regio de memria fsica mostrada na janela principal do aplicativo. T Show Threads: exibe o estado de cada thread contida no aplicativo. Em aplicaes multi-threading possvel, atravs dessa janela, ter um controle sobre cada uma das threads. W Show Windows: mostra a estrutura e configurao das janelas carregadas pelo aplicativo (definida pelo WinProc). Os dados s so mostrados com o programa em execuo e precisa ser atualizada manualmente pelo usurio (atravs do boto direito do mouse). H Show Handles: exibe uma informao detalhada sobre os handles (referncia a um objeto) que esto sendo utilizados pelo aplicativo. Quando o aplicativo abre um arquivo, retornado um handle, que utilizado para fazer a leitura e escrita, por exemplo. C Show CPU: janela padro do aplicativo, que aberta automaticamente na hora de carregar o alvo. O seu contedo j foi explicado nos itens anteriores (onde as regies foram numeradas de 1 a 4). / - Show Patches: as modificaes feitas no executvel ficam registradas nessa janela, facilitando a modificao ou o retorno instruo original. K Show Call Stack: mostra uma pilha de todas as chamadas de funo at ento feitas pelo aplicativo. B Show Breakpoints Window: exibe todos os breakpoints setados no programa alvo. R Show references: exibe todas as referncias encontradas durante uma busca (seja ela uma constante, instruo, string). Veremos mais sobre elas adiante. ... Run Trace: nessa janela mostrado o resultado da operao de tracing (mencionada quando falamos de Trace Into/Over). Tracing um processo um pouco complicado, por isso a sua explicao detalhada ser apresentada mais a frente ( possvel encontrar uma boa explicao na prpria ajuda do Olly). S Show Source: quando o aplicativo alvo compilado com as informaes de debug, normalmente o cdigo assembly resultante tambm armazenado. Nesse caso essa janela exibe esse cdigo e mostra em tempo real o local no cdigo fonte original que est sendo executado no momento. Muito til para comparar o cdigo assembly escrito e o compilado. Por ltimo temos os botes de configurao e ajuda.

10 de 18

29/4/2014 09:25

Utilizando um debugger - OllyDbg

http://www.hardware.com.br/comunidade/utilizando-debugger/785195/

Debugging Options Exibe a janela de configurao do Olly. A princpio no necessrio alterar nada para fazer a depurao, a no ser que voc tenha noo de onde est mexendo. Appearence Permite configurar o esquema de cores. Recomendo alterar essas configuraes para algo que lhe agrade, fazendo um syntax highlighting do cdigo, facilitando a leitura. Help Mostra a janela de ajuda do Olly. A ajuda est em Ingls. Estas foram as opes contidas na barra de ferramentas. O Olly tambm conta com um menu tradicional, que contm basicamente as mesmas funes da barra de ferramentas. Um dos itens do menu que vale a pena mencionar o de plugins. O Olly suporta a criao de plugins, sendo alguns deles muito teis. Por padro ele vm apenas com dois plugins, um de bookmarks e outro de comandos, que adiciona uma caixa de texto no rodap do programa onde voc pode entrar com aes e comandos de forma semelhante ao SoftICE. No rodap do Olly fica uma pequena barra de status, que alm de mostrar o estado atual do alvo (finalizado, pausado ou em execuo), serve como um informativo. No prximo captulo pretendo colocar alguns conceitos importantes de depurao. Abraos, Fergo
26-09-2007 por luishoc

Fergo parabns por criar um tutorial to exepcional como esse. Tpico bem explicativo. Falou! []'s luishoc
26-09-2007 por rhfpt

voce tem algum site para que possamos baixar esse tutorial?
26-09-2007 por philix Citao:

voce tem algum site para que possamos baixar esse tutorial? O site dele que est na assinatura dele.
26-09-2007 por Fergo

Valeu pelas respostas pessoal, fico grato. Por enquanto estou colocando o tutorial apenas aqui no GdH, talvez quando eu terminar eu lano um PDF dele. Mas como o philix mencionou, voc encontra meus outros tutoriais no meu site (www.fergonez.net). Abraos! Fergo
27-09-2007 por rhfpt

ops... nao havia percebido.. vlw. Muito bom esse tutorial. Parabns
27-09-2007 por Fergo

Valeu rhfpt. Amanh tenho prova na faculdade ento no sei se consigo escrever uma continuao do guia hoje, mas tentarei. Abraos, Fergo
27-09-2007 por intruso

Muito bom o tpico, parabns. :-)


28-09-2007 por Fergo

Valeu galera!

11 de 18

29/4/2014 09:25

Utilizando um debugger - OllyDbg

http://www.hardware.com.br/comunidade/utilizando-debugger/785195/

Quarta parte saindo do forninho. Desta vez fala de como encontrar aquilo que voc quer no meio de tanta instruo.

FORMAS DE APROXIMAO
Uma das maiores dificuldades em debugging de baixo nvel (em assembly) identificar o local onde se encontra aquele trecho de cdigo de deseja analisar. Existem diversas manhas para convergir ao local correto, sendo que vou citar duas das mais utilizadas. A primeira delas consiste em buscar em buscar por strings. Na maioria dos casos todo o texto presente em um aplicativo fica armazenado em uma string table (tabela de strings), cada uma com seu nmero identificador. Normalmente quem decide o que vai para a tabela de strings ou o que referenciado diretamente no cdigo o compilador, por isso esse mtodo nem sempre totalmente funcional, mas costuma ter bons resultados. Certo, mas que strings devemos procurar? Ns queremos encontrar o local onde feita a comparao do nmero digitado com o nmero correto. Se o nmero no for aquele que voc digitou, ele vai exibir uma mensagem, que contm um ttulo e um texto. Isso bastante interessante, pois a provvel lgica do programa verificar pelo nmero digitado e caso ele seja incorreto, nos mostrar a MessageBox. Se ns encontrarmos o local onde o texto utilizado pela MsgBox, sabemos que estamos pertos e um pouco adiante de onde foi feita a verificao. H uma maneira bem direta de descobrir o local onde est a chamada para a MsgBox, mas vou focar mais no sistema de busca por string. Vamos l. Entre com um valor qualquer (maior que 0 e menor que 21) e mande verificar. Provavelmente voc recebeu uma mensagem semelhante a essa:

Repare que ela composta por um ttulo e um texto. Que tal verificar se possvel buscar esses textos dentro do OllyDbg. Para tal, na janela principal, sobre o disassembly do cdigo, clique com o boto direito e v em Search For -> All referenced text strings. Isso far com que o Olly mostre uma janela contendo todas as strings que so referenciadas por algum comando dentro do cdigo. Note que no contedo da janela apareceram trs itens:

Podemos observar que temos trs referncias ao texto mensagem, ocorrendo em diferentes endereos. Curiosamente a string Mensagem. o ttulo da mensagem de texto que recebemos ao entrar com um valor errado. Isso significa que encontramos 3 possveis locais onde a caixa de texto exibida. Uma maneira fcil de descobrir qual das trs a verdadeira (mais pra frente veremos que na realidade nenhuma delas falsa, so apenas mensagens de texto diferentes) setando um breakpoint sempre a mensagem de texto for referenciada. Para tal, clique com o boto direito em qualquer uma das linhas e selecione Set Breakpoint on every command. Sempre que a mensagem for utilizada, o Olly vai pausar a execuo e lhe mostrar onde a execuo foi congelada. Com o breakpoint configurado, apenas digite novamente o nmero no aplicativo de teste (sem fechar ou reiniciar o Olly). Assim que voc clicar no boto, ao invs de exibir a mensagem de nmero incorreto, o Olly vai pausar a execuo e lhe mostrar o local onde a referncia de texto foi utilizada. Voc deve ter parado aqui (linha marcada em cinza):

12 de 18

29/4/2014 09:25

Utilizando um debugger - OllyDbg

http://www.hardware.com.br/comunidade/utilizando-debugger/785195/

Foi bem como queramos. Paramos bem no local onde o endereo da mensagem colocado na pilha para ser utilizada pela funo MessageBoxA:

Por curiosidade, note que temos 3 chamadas para a funo MessageBox. Pelo texto de cada uma possvel identificar que a primeira referente ao texto de quando voc acerta o nmero, a segunda (que ns estamos) de quando voc erra e a ltima para quando voc entra com um valor fora do intervalo especificado. Isso explica tambm o fato de termos trs referncias a string Mensagem., pois ela utilizada pelas trs chamadas. Como mencionado anteriormente, esse mtodo nos faz convergir para um local alm de onde foi feita a comparao (pois a mensagem de texto exibida somente depois que o valor verificado). Para encontrar a comparao a partir do local atual podem-se utilizar diversos mtodos. Alguns preferem simplesmente ir analisado o cdigo acima da MsgBox na mo ou fazer um backtrace, que consiste em analisar o cdigo asm inversamente. Como esse aplicativo bem pequeno, fica fcil achar o local na marra, mas vou dar uma viso sobre o backtracing. O Olly felizmente possui vrias funes que ajudam na interpretao do cdigo, sendo que vamos utilizar as referncias de salto para essa situao. Para chegar at a mensagem de texto, muito provavelmente foi feito um salto, j que a provvel lgica seria: 1. 2. 3. 4. 5. Adquire os dados digitados pelo usurio Compara com o valor real igual? Caso no seja igual, pule para ... Caso seja igual continue/pule para outro local

Sabendo onde foi realizado o salto nos deixa mais prximo ainda do local da comparao. Como o pulo foi realizado para mostrar a mensagem de texto, destino mais provvel para o salto quando os dados da mensagem de texto comeam a ser empilhados. Selecione a linha logo acima da atual, onde tem o comando PUSH 0 (primeiro valor colocado na pilha). Note que o Olly identifica esse local como sendo o alvo de um salto (veja na parte de baixo da regio do disassembly):

13 de 18

29/4/2014 09:25

Utilizando um debugger - OllyDbg

http://www.hardware.com.br/comunidade/utilizando-debugger/785195/

Basicamente ele est te dizendo que para chegar ao local atual, foi feito um salto no endereo 00401061. Podemos ir at esse local e verificar se esse salto realmente existe. Clique com o boto direito sobre essa linha (no endereo 00401079) e v em GoTo -> JNZ from 00401061. Isso nos levar diretamente para o local do salto:

Fomos levados at o endereo 00401061 onde realmente existe um salto (JNZ SHORT adivinhe.00401079) e provavelmente estamos bem prximo do local da comparao. Realmente estamos. Analise as linhas que antecedem o salto. Temos uma chamada a funo GetDlgItemInt (busca um inteiro contido dentro de um item da janela, que nesse caso uma caixa de texto) e o armazena em EAX (isso padro, todo retorno de funo em EAX). Em sequida temos: 1. 2. 3. 4. 5. 6. Compare EAX com 1 Se for menor, pule para 0040108F Compare EAX com 14 (os nmeros so em hex, logo 14h = 20 decimal) Se for maior, pule para 0040108F Compare EAX com 4 Se forem diferentes (JNZ/JNE), pule para 00401079

Creio que voc j tenha sacado o que est ocorrendo. Ele est primeiramente verificando se o nmero digitado est dentro do intervalo (20 >= X >= 1). Se eles esto no intervalo, nenhum salto foi realizado, logo ele continua a execuo. Logo aps o valor digitado comparado com o nmero 4, e se eles forem diferentes, o programa pula para aquela mensagem de texto que estvamos anteriormente. Que tal experimentar colocar o nmero 4 na caixa de texto do programinha de estudo e ver o resultado? Bingo, encontramos o local da comparao e por conseqncia, o nmero com o qual ele compara o valor digitado. Esse cdigo asm seria gerado basicamente por uma estrutura semelhante a esta, em um pseudocdigo:
Cdigo:

Declara varivel inteira X; X = Nmero contido na caixa de texto; Se X < 1 ou X > 20 Ento Exibe mensagem de texto Nmero Invlido Fim Se Se X = 4 Ento Exibe mensagem de texto Parabns Caso Contrrio Exibe mensagem de texto Voc Errou Fim Se

Essa uma das maneiras para localizar trechos de cdigo em um debugger. usado por muita gente, sendo que esse exemplo que apresentei um clssico. Outra forma, muito mais direta, mas que exige um conhecimento da API do Windows buscar pelas chamadas das funes das APIs do Windows. Supondo que o usurio tenha certa experincia em programao (seja em asm ou em C), ele provavelmente conhece algumas funes do Windows, j que elas so necessrias para qualquer aplicativo visual. Como a lgica desse programa se baseia em buscar e comparar um dado digitado em uma caixa de texto, um usurio que j conhea um pouco da API sabe que necessrio usar uma funo do Windows para realizar esse processo. As duas funes mais famosas que pegam dados de controles so: GetDlgItemText e GetDlgItemInt. O Olly possui uma janela que mostra todas as funes utilizadas pelo programa, ento podemos

14 de 18

29/4/2014 09:25

Utilizando um debugger - OllyDbg

http://www.hardware.com.br/comunidade/utilizando-debugger/785195/

verificar se existe uma dessas duas funes no aplicativo alvo. Para isso, clique no boto E (ou use o atalho ALT+E) para abrir a janela de mdulos. Vai ter uma breve lista, contendo na primeira linha o prprio programa e nas outras as DLLs dependentes. Clique sobre a linha que contm o nosso aplicativo (adivinhe) e v em View Names. Isso exibir uma lista com todas as funes utilizadas pelo aplicativo.

Eis a lista de funes utilizadas:

Note que a funo GetDlgItemInt foi utilizada, como buscvamos. Para descobrir o local onde ela usada pode-se utilizar o mesmo mtodo de antes, clicando com o boto direito e selecionando Set breakpoint on every referecence. Da basta continuar a execuo do programa, digitar um nmero e clicar no boto. Quando o alvo for chamar a funo, o Olly congela e exibe o local onde ser feita a chamada, que logo acima de onde feita a verificao, como vimos anteriormente. Eu particularmente prefiro este mtodo sobre o das referncias, por algumas razes: Ele normalmente nos leva para uma regio bem mais prxima da verificao e antes dela. Utilizando as referncias, voc pode ser levado para um local muito alm, necessitando de muito backtracing. Algumas referncias de texto no aparecem na lista da string table, o que torna esse mtodo mais prtico. No depende de mensagem de texto ou MessageBox, que nem sempre esto presentes em todos os aplicativos. Em breve a continuao! Abraos, Fergo
03-10-2007 por emtudo

cara nao posso deixar de te agradecer por este tutorial, eu queria ate viajar para aprender isso, mas nunca sobrou "$" esta de parabens!
05-10-2007 por junior Fire

Primeiramente quero dar parabns pelo tutorial.

15 de 18

29/4/2014 09:25

Utilizando um debugger - OllyDbg

http://www.hardware.com.br/comunidade/utilizando-debugger/785195/

Estou acompanhando ele ds do inicio e quero sabe se voc ira com ele at o fim.
T+
05-10-2007 por Fergo

Valeu pessoal! Pretendo ir postando sim (at no sei se vai ter um final, posso ir sempre postando dicas sobre o Olly e tudo mais). Tive 2 semanas corridas de prova na faculdade e no sobrou tempo para muita coisa. Fergo
05-10-2007 por emtudo Citao:

Postado Originalmente por Fergo Valeu pessoal! Pretendo ir postando sim (at no sei se vai ter um final, posso ir sempre postando dicas sobre o Olly e tudo mais). Tive 2 semanas corridas de prova na faculdade e no sobrou tempo para muita coisa. Fergo

Se for falta de agradecer e dizer que o tutorial esta muito bom, vai ter um fim sim, pq vamos sempre agradecer por este excelente trabalho

Mais uma vez o trabalho esta excelente, estamos aguardando com paciencia vc ter um tempo para postar mais, mas nao tenha presa, aguardandos assim vc pode postar com paciencia e o trabalho vai ficar excelente como ja esta ficando...
20-10-2007 por Fergo

Valeu pelo apoio pessoal. Finalmente arranjei um tempo livre e dei continuidade do estudo

RE-ASSEMBLY
O Olly alm de ser um timo debugger, um timo assembler. Com ele tambm possvel editar o cdigo em tempo real e observar as mudanas de comportamento. Todas as mudanas que voc realiza no cdigo ficam salvas j janela de Show Patches (/). Vamos agora ver como podemos modificar o cdigo e re-salvar o nosso executvel (muito til para correo de bugs). Reabra o nosso arquivo no Olly, caso ele esteja fechado. Nos captulos anteriores discutimos um pouco sobre o funcionamento do nosso aplicativo de teste, ento vamos agora fazer uma pequena modificao no mesmo para que ele sempre exiba a mensagem de Voc acertou. Ns tnhamos uma seqncia de comparaes seguidas pelos seus respectivos saltos. A primeira verificava se o nmero era menor que 1, a segunda se ele era maior que 20 e a terceira se ele era em si o nmero escondido (4). Existem diversas formas de fazer com que o nmero seja sempre o correto. Vou listar algumas: Alterar o cdigo forando que o valor 4 seja movido para EAX antes da comparao. Anular o ltimo salto (aps o CMP EAX, 4), fazendo com que o fluxo do aplicativo siga direto para a mensagem correta. Desviando e forando um salto para a mensagem correta logo na primeira comparao realizada. Existem outras formas ainda, mas vamos ficar com essas trs, pois so as mais bvias. Eu vou utilizar o ltimo mtodo neste tutorial para exemplificar o processo.

16 de 18

29/4/2014 09:25

Utilizando um debugger - OllyDbg

http://www.hardware.com.br/comunidade/utilizando-debugger/785195/

O que basicamente ns vamos fazer forar um salto logo aps a funo GetDlgItemInt diretamente para a regio que chama a nossa mensagem de texto Voc acertou..., como mostra a imagem abaixo:

Para modificar o disassembly, basta clicar sobre a linha que deseja alterar e apertar a tecla Espao. Isso far com que uma janela se abra com um local onde voc possa indicar a instruo que deseja colocar no local. O nosso objetivo aqui substituir o CMP EAX, 1 por um salto no-condicional at o local onde os argumentos da nossa mensagem de texto comeam a ser selecionados (no PUSH 0, localizado no endereo 00401063). Clique sobre a linha que contm o CMP EAX, 1 (no endereo 00401054) e pressione Espao. A seguinte janela se abrir:

Na caixa de texto onde voc entra com a instruo em assembly que deseja substituir. Caso a instruo que ns inserirmos seja menor (em bytes) que a instruo anterior, o Olly substitui esses bytes restantes pela instruo NOP, que no realiza nenhuma operao, evitando assim que fiquem resqucios e lixos do comando anterior (caso a caixa de seleo Fill with NOPs esteja selecionada, claro). Altere o CMP EAX, 1 por JMP 00401063, como mostra a figura:

Em seguida, basta clicar em Assemble para confirmar a modificao. Voc deve ter notado que o Olly coloriu com vermelho aquilo que foi modificado. Note tambm que ele inseriu um comando NOP aps o salto, indicando que o nosso opcode do salto era 1 byte menor que o comando anterior.

Voc pode rodar o nosso aplicativo dentro do Olly e observar a modificao. Agora, com

17 de 18

29/4/2014 09:25

Utilizando um debugger - OllyDbg

http://www.hardware.com.br/comunidade/utilizando-debugger/785195/

qualquer valor que voc entre (mesmo aqueles fora do intervalo), o programa vai exibir a mensagem que desejvamos. Como mencionado anteriormente, todas as modificaes ficam armazenadas na janela de patches, que pode ser acessada clicando no boto \ ou atravs o atalho CTRL+P. Para alternar entre a instruo modificada e a original, basta selecionar a modificao desejada na janela de patches e apertar Espao (ou atravs do boto direito -> Restore original code). Para salvar o novo executvel bem simples. Na janela de dissassembly, clique com o boto direito e v para Copy to Executable -> All modifications. Uma pequena janela se abrir perguntando se voc deseja copiar o cdigo modificado. Selecione Copy All. Uma nova janela, contendo todo o cdigo modificado, ser exibida. Clique com o boto direito sobre ela e selecione Save File. Basta escolher o local e voc ter um novo executvel, contendo a modificao realizada. Espero dar continuidade em breve. Abraos e bom final de semana, Fergo
20-10-2007 por emtudo Citao:

Postado Originalmente por Fergo Valeu pelo apoio pessoal. Finalmente arranjei um tempo livre e dei continuidade do estudo

RE-ASSEMBLY
Valeu, esta cada vez melhor, nao posso deixar de sempre agradecer
22-10-2007 por Fergo

Valeu emtudo! J foi liberada a verso 2.0 pr-alpha do Ollydbg, pode ser conferida no link: http://www.ollydbg.de/ Ainda no boa para ser utilizada em debugging, pois quase todas as funcionalidades ainda esto desativadas, mas j da para perceber uma certa melhoria na anlise do cdigo. Fergo

Guia do Hardware Melhores Tpicos

18 de 18

29/4/2014 09:25

Potrebbero piacerti anche