Utilizando Um Debugger

  • Upload
    joelton

  • View
    234

  • Download
    0

Embed Size (px)

Citation preview

  • 8/6/2019 Utilizando Um Debugger

    1/25

    Utilizando um debugger - OllyDbg

    Ultimamente tenho visto certa quantidade de posts relativos aprogramao em linguagem assembly e ao uso de debuggers (sejapara depurao ou para fazer adaptaes). Resolvi criar umapequena srie de tutoriais (comecei hoje) cobrindo alguns conceitosinteressantes sobre a utilizao de debuggers e um pouco deengenharia reversa. medida que eu vou escrevendo eu voupostando aqui, em forma de post mesmo.

    Por enquanto escrevi apenas uma introduo e oesclarecimento de alguns conceitos. Estou pensando ainda noaplicativo 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...). Pretendoutilizar o OllyDbg nos tutoriais, pois o meu debugger predileto e oque estou mais familiarizado (gratuito e pequeno).

    Sumrio:

    1. Introduo e conceitos2. Um pouco de assembly3. Interface do OllyDebugger4. Formas de aproximao5. Re-assembly6. Plugins

    Mais captulos em breve!

    INTR ODUOSeguindo a minha linha de tutoriais voltados a programao,

    vou tratar sobre um assunto que me interessa muito e talvez sejainteressante para os programadores em geral: disassembler edebuggers.

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

    Disassembler algo que consegue transformar linguagem demquina para a linguagem assembly, transcrevendo as instruesenviadas ao processador para os seus mnemnicos em assembly(asm). No deve ser confundido com um descompilador, que procuraconverter o cdigo nativo em uma linguagem de mais alto nvel comoC, C++ ou Basic.

    Debuggers so programas capazes de analisar, depurar etestar aplicaes. Atualmente a maioria das IDEs de programaocontam com um debugger embutido (Visual Studio, por exemplo). Aprincipal utilidade deles para a identificao e tratamento de erro,

  • 8/6/2019 Utilizando Um Debugger

    2/25

    sendo que possvel rodar o cdigo linha por linha (ou instruo porinstruo) e analisar a mudana das variveis e do comportamentodo cdigo. Os debuggers de binrios j compilados - como osexecutveis do Windows (EXE) - seguem o mesmo conceito dosdepuradores normais, mas devido ao fato de o cdigo j ter sidocompilado, ele precisa ter um disassembler embutido no debuggerpara decodificar as instrues.

    Atualmente existem dezenas de debuggers e disassemblerspor 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 umdisassembler) disponveis no mercado. tambm pequeno e gratuito .

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

    Q UAL A UTI LI DADE UM DEBUGGER?

    Muita gente se pergunta do porqu de usar um debugger,sendo que na maioria dos casos voc tem a acesso ao cdigo fonteoriginal (caso voc tenha programado o aplicativo). Vou citar abaixoalgumas das maiores utilidades de um debugger:

    y Tratamento de erro. Certamente uma das principais. s vezesdurante a programao de um aplicativo um pequeno erropassou despercebido, ocasionando mal funcionamento ougerando uma operao ilegal. Em muitos casos mais fcilvoc analisar o binrio j compilado dentro de um debugger doque tentar encontrar o erro no cdigo original. Dentro dessemesmo item podemos citar a correo de bugs de aplicaes jdescontinuadas (desde que com a autorizao da empresa donados direitos).

    y Engenharia reversa. O processo de engenharia reversa desoftware no poderia ser feito de forma eficiente sem autilizao de um debugger/disassembler. Muitas pessoastendem a confundir cracking com engenharia reversa, sendoque so conceitos diferentes. A engenharia reversa por si s uma atividade completamente legal, pois muito do que vemoshoje s foi possvel devido engenharia reversa. A criao dedrivers para Linux de perifricos que antes s funcionavam como Windows (WinModems) um bom exemplo de como aengenharia reversa traz coisas boas para ns.

    y Aprendizado. O uso de debuggers e engenharia reversa umadas melhores formas de se aprender a linguagem assembly.Voc programa algo em uma linguagem de mdio ou alto nvele posteriormente analisa o resultado do binrio compilado

  • 8/6/2019 Utilizando Um Debugger

    3/25

    dentro de um debugger. Com esse conhecimento possveldominar melhor a linguagem e criar algoritmos mais otimizadose eficientes.

    CON CEIT OS N ECESSRI OS

    Para entender o funcionamento de um debugger precisosaber um pouco sobre alguns conceitos ligados a informtica, como ofuncionamento da memria, processador, pilhas e endereos. Oconhecimento bsico de assembly tambm necessrio, j que essa a linguagem que teremos de analisar. Caso no tenha experinciaem assembly, fique tranqilo, pois nos captulos seguintes darei umaviso geral sobre ela, o suficiente para entender o nosso mini-aplicativo de estudo. Abaixo segue uma breve lista de conceitos:

    y P rocessador/ CP U: o crebro de todo computador. ele quedecodifica as instrues e executa os cdigos operacionais. composto basicamente por uma unidade lgico-aritmtica(ALU), unidade de ponto flutuante (FPU), registradores, cach,barramento e gerador de clock.

    y Memria R AM: Local de armazenamento temporrio de dados(so apagados ao desligar o computador). Todo aplicativo seutiliza da memria para armazenar seus dados e estes sobuscados e gerenciados pelo processador.

    y Endereamento de memria: uma faixa de valores queapontam para uma determinada posio de memria. Toda vez

    que voc escreve ou l algum dado da memria necessrioindicar o endereo de onde est aquele valor, para que oprocessador possa busc-lo.

    y P ilha (Stack): uma estrutura de dados. Sua principalcaracterstica a forma de funcionamento, onde voc apenascoloca ou retira os valores, sem indicar um endereo (L IFO Last in, First Out ltimo a entrar, primeiro a sair). Elafunciona de forma semelhante a uma pilha de livros em quevoc vai os empilhando. Quando precisar remover um deles, necessrio tirar todos os livros de cima.

    y R egistradores: Pequenas partes de memria presentes dentrodos processadores (no confundir com memria RAM).Extremamente rpidas, sendo que a CPU as utiliza como formatemporria de armazenamento de dados e realizao deoperaes. A quantidade de dados que podem ser armazenadosvai depender do tipo de processador. Os processadores de 32bits conseguem armazenar nmeros de at 32 bits em cadaregistrador, sem precisar de rotinas de converso.

  • 8/6/2019 Utilizando Um Debugger

    4/25

    UM P OUCO DE ASSEMBLYPara 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 debaixo 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 dalinguagem assembly pode ser bem variado, podendo fazer de tudoum pouco, mas amplamente utilizada na programao bsica deKernels e em algoritmos que precisam ser altamente otimizados,onde asm a linguagem ideal, j que puramente linguagem demquina traduzida.

    No pretendo agora explicar todo o funcionamento, estruturae comandos da linguagem. Vou dar apenas um apanhado geral sobrealguns termos e uma breve descrio sobre os comandos maisbsicos e corriqueiros que se encontra. Precisamos primeiramentedefinir o que so mnemnicos e o que so os opcodes.

    Opcodes (traduzido em operationalcode, ou cdigo deoperao) a instruo que enviada e interpretada peloprocessador. Cada opcode, ao ser interpretado pelo processador, vairealizar uma operao. Mnemnicos so as palavras ou combinaode letras utilizadas para representar um opcode, tornando alinguagem de mquina mais legvel. Veja abaixo um exemplo de ummnemnico do comando MOV:

    Cdigo:MOV EAX,1

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

    Cdigo:B801000000

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

  • 8/6/2019 Utilizando Um Debugger

    5/25

    A principal dificuldade na linguagem assembly certamente asua estrutura, que foge do padro de linguagens de mais alto nvelcomo 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 Go To do BASIC).Felizmente hoje temos debuggers muito inteligentes que conseguemestruturar e identificar rotinas e repeties, facilitando muito otrabalho de interpretao. Mesmo com essas melhorias, ainda achoimportante ter um papel e uma caneta ao lado, onde voc pode fazeranotaes e ir estruturando/convertendo o cdigo na medida em quevoc os interpreta.

    Para o assembly, a localizao dos valores e variveis sempre baseada nos endereos que elas ocupam na memria. Onome que voc define para uma varivel durante a programao substitudo pelo endereo de memria que ela ocupa. Cada instruotambm possui um endereo, que utilizado para controlar o fluxo ea estrutura do cdigo. Sempre que voc faz um salto, necessrioindicar o endereo que o cdigo deve ser direcionado, semelhante aoque ocorria nas numeraes de linhas dos BAS ICs mais antigos. Vejaum exemplo abaixo de como ficaria um cdigo em C e o seuresultado compilado para assembly, utilizando apenas registradorescomuns:

    Cdigo:voidmain() {int a = 4;int b = 6;int c;

    if ((a == 4) && (b == 6)) {c = 5;

    }}

    O cdigo acima quando compilado pode se transformar emalgo semelhante a isso (boa parte do cdigo acima intil, estouutilizando somente para exemplificar):

    Cdigo:

    00000000 MOVEAX,4h ;move o valor 4 para EAX 00000005 MOVEBX,6h ;move o valor 6 para EBX 0000000ACMPEAX,4h ;compara EAX com 4, se for verdadeiro: ZF = 1 0000000D JNE00000019h ;se ZF != 1, pule para endereo 00000019h 0000000F CMPEBX,6h ;compara EBX com 6, se for verdadeiro: ZF = 1 00000012 JNE00000019h ;se ZF != 1, pule para endereo 00000019h 00000014 MOVECX,5h ;move o valor 5 para ECX 00000019 RETN ;finaliza execuo e retorna

  • 8/6/2019 Utilizando Um Debugger

    6/25

    Pra entender o c

    digo acima ne cess rio entender sobreaquilo que com e a linguage m assembly. Ela ba sicamentecom osta por regi stradore s endere os e instru es (mnem nicos) .

    Os registradore s foram explicados no captulo anterior, mas vamos agora saber que m s

    o eles. Os processadores da arquitetura

    ntel de 32 bits possuem basicamente nove regi stradore s de 32 bits comuns: EAX, EBX, ECX, EDX, ESP, EBP, ES , ED e E P. eoricamente cada u m desses registradore s possui uma deter minada fun o padro, mas devido a sua e scassez, muitas vezes eles soutilizados como registradore s para qualquer prop sito. Voc podecriar um cdigo usando livremente o s oito primeiros registradore s que no haver muitos problemas (desde que saiba o que e stfazendo /m odificando). O ltimo registrador, E P, qua se sempremantido inta cto, pois ele o re sponsvel por contar a s instru

    es e

    informar o endere o da prxima instruo. Alterar o seu valor podedesviar completamente o fluxo do apli cativo e provavel mente vaigerar u ma falha de segmenta o ou u ma opera o ilegal.

    Esses registradore s apresentado s so todo s de 32 bits. Noentanto ta mbm poss vel utilizar apena s 8 ou 16 bits, como mostraa tabela abaixo utilizando o EAX como exe mplo (a teoria vale para o s outros registradore s tambm):

    Para o caso da por o de 8 bits, o regi strador ter minado em Lso os 8 bits menos significante s de AX e o terminado e m H so os 8 bits mais significante s de AX. Para a poro de 16 bits, so utilizados os 16 bits menos significante s da por o de 32 bits.

    Alm dos registradore s, ta mbm existem as Flags, que sobits utilizados como resultado de opera es (verdadeiro ou fal so, por

    exemplo). Elas so usadas principalmente para anli se condicionalem instru es como CMP e ES . Dentre a s diversas flags, a s mais

    corriqueira s so: ZF (Zero Flag), CF (CarryFlag) e SF (SignalFlag). AZF setada sempre que u ma opera o re sulta e m zero (umacompara o entre doi s nmeros atrav s do comando CMP subtraiseus operando s sem alterar valore s e seta a Z F caso o re sultado dasubtra o seja zero, indi cando valore s iguais) . A flag CF setadaquando o re sultado de u ma opera o e stoura o valor mximocomportado pelo regi strador / local sem considerar o sinal (overflow).

  • 8/6/2019 Utilizando Um Debugger

    7/25

    Por ltimo, tempos a SF, que ativada sempre que o bit maissignificativo de um operando for 1, indicando um valor negativo(pesquise sobre complemento de dois).

    Os endereos na linguagem assembly so a base para o fluxodo aplicativo e para o armazenamento de dados. As variveis quevoc usa durante a programao so substitudas por endereos queapontam para uma rea da memria paginada com acesso a leitura ea escrita. Os destinos dos saltos (Jumps) tambm dependem dosendereos das instrues, pois atravs deles que voc informa odestino do salto.

    O cdigo abaixo demonstra apenas uma linha de assemblyonde possvel ver o endereo da instruo (00401000) e o endereopara um byte de memria (00403000) para o qual o nmero noveest sendo movido:

    Cdigo:00401000 MOVBYTE PTR DS:[00403000], 09h

    Por ltimo temos as instrues, que nada mais so do que osopcodes traduzidos em um mnemnico, como demonstrado eexemplificado alguns pargrafos acima.

    Abaixo eu vou por uma pequena lista mostrando algumas dasinstrues mais utilizadas, pois seria invivel colocar todas elas (soaproximadamente 130 instrues bases para a arquitetura Intel).

    y MOVdestino, origem

    Move o valor do campo origem para o destino. Essa instruopossui diversas variaes, por isso ela pode aparecer de diversasformas diferentes (pode-se trabalhar com constantes, memria,pilha, etc). Alguns exemplos:

    MOVEAX, 10h

    MOVAX, WORD PTR DS:[00403000]

    MOVBYTE PTR DS:[00403002], 1Ch

    y CMP arg1, arg2

    Realiza uma comparao entre os dois operandos. Acomparao feita simplesmente subtraindo os dois operandos ecaso o resultado for zero (valores iguais), ele seta a ZF para 1. Valelembrar que essa operao no altera os valores dos operandos,apenas as flags.

  • 8/6/2019 Utilizando Um Debugger

    8/25

    CMPEAX, 04h

    y J MP endereo

    Faz um salto incondicional e obrigatrio para o endereoindicado.

    JMP00401008h

    y JZ endereo / J E endereo

    Faz um salto condicional. Caso o valor da zero flag seja 1, elerealiza o salto. Normalmente utilizado junto com um CMP pararealizar um desvio caso a comparao seja verdadeira.

    JE0040101Ah

    y J NZ endereo / J NE endereoSemelhante ao item acima, mas realiza o salto somente

    quando a zero flag no foi setada (ZF = 0).

    JNZ0040102Ch

    y ADD destino, arg1

    Adiciona o valor de arg1 ao destino. Tambm possui diversasvariaes, pelas mesmas razes do comando MOV. Se o resultado

    estourar o limite do destino, a CF setada.ADDEBX, 04h

    ADDEBX, DWORD PTR DS:[00403032]

    y SUB destino, arg1

    Realiza uma subtrao dos operandos. As variaes ecaractersticas so as mesmas do comando ADD.

    SUBECX, 2Ah

    y P USH valor

    Coloca o valor no topo da pilha (Stack). O comando PUS H amplamente utilizado nas chamadas de funes (CALL), pois atravs da pilha que a funo busca seus argumentos.

    PUSH 08h

  • 8/6/2019 Utilizando Um Debugger

    9/25

    y P OP destino

    Remove o valor do topo da pilha e o armazena no destino.

    POP EAX

    y CALLlocal

    Faz chamada a uma funo. possvel passar o local dediversas formas para o comando CALL, desde uma cons tante,registrador ou at mesmo uma funo externa dentro de uma DLL. Ocomando CALL usa a pilha para indicar o endereo para o qual afuno deve retornar depois de finalizada a sua execuo.

    CALLUser32!GetDlgItem TextA

    CALL0040115Fh

    Essas so as instrues mais comuns dentro de um binriocompilado. Claro que existe mais de uma centena delas, mas euprocurei colocar aqui apenas aquelas que sero utilizadas noaplicativo de aprendizado. Para uma lista completa com umaexplicao mais profunda dos opcodes, recomendo ver a listaapresentada 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 mona massa e analisar um binrio.

    INT ERF ACE DO OLLY DEBUGGER

    Aps uma boa parte terica, chegou a hora de por em prticaaquilo que acabamos de estudar. Neste captulo vou apresentar umpouco da interface do OllyDbg, que apesar de intuitiva, mereceesclarecimentos.

    Para o nosso estudo, eu criei um simples aplicativo que iremosdepurar mais a frente. Ele necessrio neste j neste captulo (nopara depurao, mas para a apresentao dos itens do Olly). Vocpode baixar o arquivo executvel juntamente com o seu cdigo fonte(programado em assembly na sintaxe MASM32 utilizando o WinAsmStudio como IDE) no link abaixo:

    http://www.fergonez.net/files/adivinhe.rar

  • 8/6/2019 Utilizando Um Debugger

    10/25

    O OllyDbg pode ser baixado gratuita mente atrav s do sitehttp :// www.ollydbg.de. bem pequeno e no ne cess ita instalao,basta extrair o contedo para u ma pa sta qualquer.

    Aps extrado, abra o Olly, v em File->Open e abra o no ssoarquivo de e studo (adivinhe.exe ). Rapidamente o Olly vai interpretaro arquivo e mostrar o di sassembly na janela prin cipal. Vamos deixaressa parte mais frente, j que o objetivo de ste captulo apena s mostrar a interfa ce, sem depurar o apli cativo por enquanto. A teladeve ser semelhante a e ssa:

    A interface do aplicativo composta por pou cos botes. Osegredo do Olly o boto direito do mouse. A maioria da s funes existente s no aplicativo pode ser a cessada atrav s do boto direito domouse, sendo que o s itens exibido no menu de popup varia m deacordo com o local onde foi dado o clique (dependendo da coluna eda regio ).

    Eu numerei a s principais regies da tela de 1 a 4.Regio 1

    Esta a tela prin cipal do progra ma, onde apre sentado odisassembly do aplicativo. Ela dividida e m quatro colunas:

    y C ol un 1 Address . Ela nos mostra o endere o virtual da s instrues (para saber mais sobre e sse endere amento, veja

  • 8/6/2019 Utilizando Um Debugger

    11/25

    meu artigo sobre o funcionamento dos executveis). Voc podereparar que os endereos no so em intervalos iguais paracada instruo. Isso ocorre devido ao fato de que o tamanhodas instrues ser varivel, como podemos observar nasegunda coluna.

    y Coluna 2 HexDump. Aqui temos o cdigo da instruo no seuformato hexadecimal (a cada 2 caracteres, temos 1 byte). Soesses valores que ficam armazenados dentro do arquivoexecutvel e que so passados para o processador. Comomencionado no pargrafo anterior, as instrues variam detamanho, sendo que o endereo da prxima instruo dadopelo endereo da instruo atual mais a soma dos byt es dainstruo. Veja o exemplo do nosso aplicativo de exemplo. Elecomea no endereo 00401000 (padro do Windows) e a suaprimeira instruo composta por 2 bytes (6A 00). O endereoda prxima instruo (na linha de baixo) vai ser o endereoatual somado com o tamanho da instruo (00401000+2) =00401002.

    y Coluna 3 Disassembly. Essa coluna nada mais do que ainterpretao e a traduo para assembly das instruespresentes na segunda coluna. A anlise do aplicativo feitaquase que inteiramente nela.

    y Coluna 4 Comments. Essa coluna no influencia noaplicativo, ela utilizada apenas para comentrios einformaes. O Olly a utiliza para identificar as chamadas defuno juntamente com os seus argumentos (voc pode verque ele identifica as chamadas da AP I do Windows emvermelho e lhe mostra os argumentos, facilitando e muito ainterpretao).

    R egio 2

    Essa rea mostra todos os registradores e flags que ns vimosanteriormente (juntamente com diversos outros valores). A cadainstruo essa tela atualizada, mostrando o estado atual de cadaum dos itens. Caso algum desses itens tenha sido modificado de umainstruo para outra, o Olly as colore com outra cor (nesse caso overmelho). As flags so mostradas logo abaixo dos registradores,abreviadas com a letra C (CarryFlag), Z (Zero Flag) e S (SignalFlag).

    R egio 3

    Essa regio nos mostra a memria fsica (RAM) destinada aoaplicativo. possvel observar o valor de cada byte de memria

  • 8/6/2019 Utilizando Um Debugger

    12/25

    dentro do e spao reservado ao apli cativo. composta por tr s colunas:

    y C ol un 1 Address . Mostra o s endere os virtuais de memria.

    y C ol un 2 HexDump. Este e spao cont m o valor de cadabyte da memria. Por padro o Olly coloca 8 bytes por linha epor essa razo a coluna de endere os cresce de 8 em 8 bytes.

    y C ol un 3 ASCII. Essa coluna pode ser utilizada para exibir deformas diferente s os valores contidos na memria. Por padro oOlly opta por exibir a repre senta o ASCII desses valores. Omodo de repre senta o pode ser alterado utilizando o botodireito do mouse.

    Regio 4

    Mostra o e stado atual da pilha (stac

    ). Como vistoanterior mente, a pilha a mplamente utilizada durante a s chamadas de funo. O VisualBasic uma linguage m que faz u m uso muitogrande da pilha, prin cipalmente pela quantidade de fun es que soutilizadas pelo aplicativo. ambm dividida e m 3 colunas :

    y C ol un 1 Address . Cumpre o mesmo papel da s outra s colunas de endere o. Nota-se que o endere o cresce de quatroem quatro byte s, pois cada po sio da pilha o cupada por u m tipo DWORD(4 bytes)

    y C ol un 2 Value. Valor ar mazenado naquele endere o dapilha

    y C ol un 3 Comment. Utilizado para comentrio s e mostrarinformaes relevante s sobre aquele endere o. O Olly identificadiversos itens da pilha (como endere os de retorno ) e adicionaessas informaes na coluna de comentrio s.

    Alm das regies ns temos a barra de ferra menta s:

    Abaixo uma de scrio de cada boto, da e squerda para a direita.y Ope n - Abre o executvel para depura o; y Restart Recarrega o apli cativo atual ; y C lose Fecha a apli cao carregada ; y P la y Inicia a exe cuo e depura o do aplicativo. Caso

    nenhu m breakpoint tenha sido posicionado (veremos adiante ),o progra ma ser exe cutado nor malmente ;

    y P a use Pausa o aplicativo e m anda mento ;

  • 8/6/2019 Utilizando Um Debugger

    13/25

    y Ste I nto Caso um breakpoint tenha sido colocado em umachamada de funo, esse boto lhe permite fazer a depuraodo contedo dessa funo;

    y Ste Over O contrrio do item anterior. Ele simplesmenteno entra dentro da chamada (mas ainda assim a executa),continuando a depurao na prxima instruo;

    y Trace I nto Utilizado apenas quando est se faz backtracing.Ele registra as aes e endereos em um log, registrandotambm o contedo das funes chamadas;

    y Trace Over Semelhante ao item acima, mas no faz oregistro do contedo das chamadas;

    y Execute TillR eturn Executa as instrues at encontrar oprimeiro comando de retorno (RE TN);

    y GotoAddress Permite ao usurio especificar um endereo docdigo para visualizar;

    Aps os comandos bsicos de depurao, temos os botes das janelas:

    y L Show Log Window : exibe um log, no qual o Olly registraalgumas aes como carregamento de plugins, etc.

    y E Show ModulesWindow : exibe todos os mdulos efunes externas utilizados pelo programa (DLLs). Com o menudireito possvel acessar uma gama de opes dentro dessa

    janela (o mesmo vale para todas as outras janelas que foremmencionadas). Essa janela de mdulos muito importante para

    configurar breakpoints nas AP Is do Windows, facilitando aaproximao em determinada regio do cdigo.y M Show MemoryWindow : mostra o estado da memria que

    est sendo utilizado pelo aplicativo, incluindo as sees doexecutvel e tabelas de importao/exportao. Para umdetalhamento byte a byte da memria, deve se utilizar a regiode memria fsica mostrada na janela principal do aplicativo.

    y T Show Threads : exibe o estado de cada thread contida noaplicativo. Em aplicaes multi-threading possvel, atravsdessa janela, ter um controle sobre cada uma das threads.

    y W Show Windows : mostra a estrutura e configurao das janelas carregadas pelo aplicativo (definida pelo WinProc). Osdados s so mostrados com o programa em execuo eprecisa ser atualizada manualmente pelo usurio (atravs doboto direito do mouse).

    y H Show Handles : exibe uma informao detalhada sobre oshandles (referncia a um objeto) que esto sendo utilizadospelo aplicativo. Quando o aplicativo abre um arquivo, retornado um handle, que utilizado para fazer a leitura eescrita, por exemplo.

  • 8/6/2019 Utilizando Um Debugger

    14/25

    y C Show CP U: janela padro do aplicativo, que abertaautomaticamente na hora de carregar o alvo. O seu contedo jfoi explicado nos itens anteriores (onde as regies foramnumeradas de 1 a 4).

    y / - Show P atches : as modificaes feitas no executvel ficamregistradas nessa janela, facilitando a modificao ou o retorno instruo original.

    y K Show CallStack : mostra uma pilha de todas as chamadasde funo at ento feitas pelo aplicativo.

    y B Show Break ! oints Window : exibe todos os breakpointssetados no programa alvo.

    y R Show references : exibe todas as referncias encontradasdurante uma busca (seja ela uma constante, instruo, string).Veremos mais sobre elas adiante.

    y ... R un Trace : nessa janela mostrado o resultado daoperao de tracing (mencionada quando falamos de TraceInto/Over). Tracing um processo um pouco complicado, porisso a sua explicao detalhada ser apresentada mais a frente( possvel encontrar uma boa explicao na prpria ajuda doOlly).

    y S Show Source : quando o aplicativo alvo compilado comas informaes de debug, normalmente o cdigo assemblyresultante tambm armazenado. Nesse caso essa janela exibeesse cdigo e mostra em tempo real o local no cdigo fonteoriginal que est sendo executado no momento. Muito til paracomparar o cdigo assembly escrito e o compilado.

    Por ltimo temos os botes de configurao e ajuda.

    y DebuggingO " tions Exibe a janela de configurao do Olly. Aprincpio no necessrio alterar nada para fazer a depurao,a no ser que voc tenha noo de onde est mexendo.

    y A# # earence Permite configurar o esquema de cores.Recomendo alterar essas configuraes para algo que lheagrade, fazendo um syntaxhighlighting do cdigo, facilitandoa leitura.

    y Hel $ Mostra a janela de ajuda do Olly. A ajuda est emIngls.

    Estas foram as opes contidas na barra de ferramentas. OOlly tambm conta com um menu tradicional, que contmbasicamente as mesmas funes da barra de ferramentas. Um dositens do menu que vale a pena mencionar o de plugins. O Ollysuporta a criao de plugins, sendo alguns deles muito teis. Porpadro ele vm apenas com dois plugins, um de bookmarks e outrode comandos, que adiciona uma caixa de texto no rodap do

  • 8/6/2019 Utilizando Um Debugger

    15/25

    programa onde voc pode entrar com aes e comandos de formasemelhante ao Soft ICE.

    No rodap do Olly fica uma pequena barra de status, que almde 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.

    FOR MAS DE AP R OXI MAO

    Uma das maiores dificuldades em debugging de baixo nvel(em assembly) identificar o local onde se encontra aquele trecho decdigo de deseja analisar. Existem diversas manhas para convergirao local correto, sendo que vou citar duas das mais utilizadas.

    A primeira delas consiste em buscar em buscar por strings. Namaioria dos casos todo o texto presente em um aplicativo ficaarmazenado em uma stringtable (tabela de strings), cada um a comseu nmero identificador. Normalmente quem decide o que vai para atabela de strings ou o que referenciado diretamente no cdigo ocompilador, por isso esse mtodo nem sempre totalmentefuncional, mas costuma ter bons resultados.

    Certo, mas que strings devemos procurar? Ns queremos encontrar o local onde feita a comparao do nmero digitado como nmero correto. Se o nmero no for aquele que voc digitou, elevai exibir uma mensagem, que contm um ttulo e um texto. Isso bastante interessante, pois a provvel lgica do programa verificarpelo nmero digitado e caso ele seja incorreto, nos mostrar aMessageBox. Se ns encontrarmos o local onde o texto utilizadopela MsgBox, sabemos que estamos pertos e um pouco adiante deonde foi feita a verificao.

    H uma maneira bem direta de descobrir o local onde est achamada para a MsgBox, mas vou focar mais no sistema de buscapor string. Vamos l. Entre com um valor qualquer (maior que 0 emenor que 21) e mande verificar. Provavelmente voc recebeu umamensagem semelhante a essa:

  • 8/6/2019 Utilizando Um Debugger

    16/25

    Repare que ela composta por u m ttulo e u m texto. Que talverificar se po ssvel buscar e sses textos dentro do OllyDbg. Paratal, na janela prin cipal, sobre o di sassembly do cdigo, clique com oboto direito e v e m S earc h % or ->Allre f ere ncedtextstri ngs .Isso far com que o Olly mostre u ma janela contendo toda s as strings que so referen ciadas por algum comando dentro do cdigo. Noteque no contedo da janela apare ceram trs itens:

    Podemos observar que te mos trs refern cias ao textomensagem, ocorrendo e m diferente s endere os. Curiosamente astring Mensagem. o ttulo da mensagem de texto que re cebemos ao entrar com um valor errado. Isso significa que en contra mos 3 poss veis locais onde a caixa de texto exibida. U ma maneira f cil dedescobrir qual da s trs a verdadeira (mais pra frente vere mos quena realidade nenhu ma dela s falsa, so apena s mensagens detexto diferente s) setando u m breakpoint sempre a mensagem de

    texto for referen ciada. Para tal, clique com o boto direito e m qualquer u ma da s linhas e selecione S et Break poi n to never ycomma nd . Se mpre que a mensagem for utilizada, o Ollyvai pausar a exe cuo e lhe mostrar onde a exe cuo foi congelada.

    Com o breakpoint configurado, apena s digite nova mente onmero no apli cativo de te ste (sem fechar ou reini ciar o Olly). Ass im que voc clicar no boto, ao inv s de exibir a mensagem de n meroincorreto, o Olly vai pau sar a exe cuo e lhe mostrar o lo cal onde arefern cia de texto foi utilizada. Vo c deve ter parado aqui (linhamarcada e m cinza):

  • 8/6/2019 Utilizando Um Debugger

    17/25

    Foi bem como quera mos. Para mos bem no local onde oendere o da mensagem colocado na pilha para ser utilizada pelafuno MessageBoxA:

    Por curiosidade, note que te mos 3 chamadas para a fun oMessageBox. Pelo texto de cada u ma po ssvel identificar que aprimeira referente ao texto de quando vo c a certa o n mero, asegunda (que n s estamos) de quando vo c erra e a lti ma paraquando vo c entra com um valor fora do intervalo e specificado. Issoexplica ta mbm o fato de ter mos trs refern cias astring

    Mensagem., poi s ela utilizada pela s trs chamadas.Como mencionado anterior mente, e sse mtodo no s faz

    convergir para u m local alm de onde foi feita a compara o (pois amensagem de texto exibida somente depoi s que o valor verificado). Para en contrar a compara o a partir do lo cal atualpodem-s e utilizar diver sos mtodos. Alguns prefere m simplesmente iranalisado o cdigo acima da MsgBox na mo ou fazer u m backtrace, que consiste e m analisar o cdigo asm inversamente.Como esse aplicativo be m pequeno, fi ca fcil achar o local namarra, mas vou dar u ma viso sobre o ba cktracing. O Olly felizmentepossui vrias funes que ajuda m na interpreta o do cdigo, sendoque va mos utilizar as refern cias de salto para e ssa situao. Parachegar at a mensagem de texto, muito provavel mente foi feito u m salto, j que a provvel lgi ca seria:

    1. Adquire os dados digitados pelo usurio2. Compara com o valor real3. igual? 4. Caso no seja igual, pule para...5. Caso seja igual continue / pule para outro lo cal

    Sabendo onde foi realizado o salto no s deixa mais prximoainda do lo cal da comparao. Como o pulo foi realizado para mostrara mensagem de texto, de stino mais provvel para o salto quandoos dados da mensagem de texto comeam a ser e mpilhados.Selecione a linha logo a cima da atual, onde te m o comando PUSH 0 (primeiro valor colocado na pilha ). Note que o Olly identifica esselocal como sendo o alvo de u m salto (veja na parte de baixo daregio do di sassembly):

  • 8/6/2019 Utilizando Um Debugger

    18/25

    Basicamente ele e st te dizendo que para chegar ao lo cal

    atual, foi feito u m salto no endere o 00401061 . Podemos ir at e sselocal e verificar se e sse salto real mente exi ste. Clique com o botodireito sobre e ssa linha (no endere o 00401079) e v e m G oTo ->J & Z f rom 00401061 . Isso nos levar direta mente para o lo cal dosalto:

    Fomos levados at o endere o 00401061 onde real menteexiste u m salto ( ' NZ SHOR( adivinhe.00401079) e provavel menteestamos bem prximo do local da compara o. Realmente e stamos.Analise a s linhas que ante cedem o salto. ( emos uma chamada afuno G etDlg ) tem ) n t (busca u m inteiro contido dentro de u m item da janela, que ne sse caso u ma caixa de texto ) e o ar mazena e m EAX(isso padro, todo retorno de fun o e m EAX). Em sequidatemos:

    1. Compare EAXcom 1 2. Se for menor, pule para 0040108F 3. Compare EAXcom 14 (os nmeros so em hex, logo 14h = 20

    decimal) 4. Se for maior, pule para 0040108F 5. Compare EAXcom 4 6. Se forem diferente s ( 0 NZ / 0 NE), pule para 00401079

    Creio que vo c j tenha sacado o que e st o correndo. Ele e stprimeiramente verifi cando se o n mero digitado e st dentro dointervalo (20 >= X >= 1). Se ele s esto no intervalo, nenhu m salto

    foi realizado, logo ele continua a exe cuo. Logo ap s o valor digitado comparado com o nmero 4, e se ele s forem diferente s, oprogra ma pula para aquela mensage m de texto que e stva mos anterior mente. Que tal experi mentar colocar o n mero 4 na caixa detexto do progra minha de e studo e ver o re sultado? Bingo,encontra mos o local da comparao e por conseqn cia, o n merocom o qual ele compara o valor digitado.

  • 8/6/2019 Utilizando Um Debugger

    19/25

    Esse cdigo asm seria gerado basicamente por uma estruturasemelhante 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 SeSe 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 emum debugger. usado por muita gente, sendo que esse exemplo queapresentei um clssico. Outra forma, muito mais direta, mas que

    exige um conhecimento da AP I do Windows buscar pelas chamadasdas funes das AP Is do Windows.

    Supondo que o usurio tenha certa experincia emprogramao (seja em asm ou em C), ele provavelmente conhecealgumas funes do Windows, j que elas so necessrias paraqualquer aplicativo visual. Como a lgica desse programa se baseiaem buscar e comparar um dado digitado em uma caixa de texto, umusurio que j conhea um pouco da AP I sabe que necessrio usaruma funo do Windows para realizar esse processo. As duas funesmais famosas que pegam dados de controles so: GetDlg I tem Text

    e GetDlg I tem I nt .O Olly possui uma janela que mostra todas as funes

    utilizadas pelo programa, ento podemos verificar se existe umadessas duas funes no aplicativo alvo. Para isso, clique no boto E(ou use o atalho AL T+E) para abrir a janela de mdulos. Vai ter umabreve lista, contendo na primeira linha o prprio programa e nasoutras as DLLs dependentes. Clique sobre a linha que contm o nossoaplicativo (adivinhe) e v em View Names . Isso exibir uma listacom todas as funes utilizadas pelo aplicativo.

  • 8/6/2019 Utilizando Um Debugger

    20/25

    Eis a lista de fun es utilizadas:

    Note que a fun o GetDlgItemInt foi utilizada, comobuscvamos. Para de scobrir o local onde ela u sada pode -se utilizaro mesmo mtodo de ante s, clicando com o boto direito e

    selecionando Set breakpoint oneveryrefere cence. Da ba stacontinuar a exe cuo do progra ma, digitar u m nmero e clicar noboto. Quando o alvo for chamar a fun o, o Olly congela e exibe olocal onde ser feita a chamada, que logo a cima de onde feita averificao, como vimos anterior mente.

    Eu particularmente prefiro e ste mtodo sobre o da s refern cias, por algu mas razes:

    y Ele normalmente no s leva para u ma regio be m mais prximada verificao e ante s dela. Utilizando as refern cias, voc podeser levado para u m local muito alm, necess itando de muito

    backtracing.y Algumas refern cias de texto no apare cem na lista dastringtable, o que torna e sse mtodo mais prtico.

    y No depende de mensagem de texto ou MessageBox, que ne m sempre e sto pre sente s em todos os aplicativos.

  • 8/6/2019 Utilizando Um Debugger

    21/25

    R E-A SS E 1 BL2

    O Olly alm de ser u m timo debugger, u m timoassembler. Com ele ta mbm poss vel editar o cdigo em tempo reale observar a s mudanas de comporta mento. 3 odas as mudanas quevoc realiza no cdigo ficam salvas j janela de S how P atc hes (/) .Vamos agora ver como podemos modificar o cdigo e re -salvar onosso executvel (muito til para correo de bug s) .

    Reabra o no sso arquivo no Olly, caso ele e steja fe chado. Nos captulos anteriore s discutimos um pouco sobre o fun cionamento donosso aplicativo de te ste, ento va mos agora fazer u ma pequenamodificao no mesmo para que ele sempre exiba a mensagem de

    Voc acertou.

    Ns tnha mos uma seqn cia de compara es seguidas pelos seus respectivos saltos. A primeira verificava se o n mero era menorque 1, a segunda se ele era maior que 20 e a ter ceira se ele era e m si o nmero e scondido (4) . Existem diversas formas de fazer com queo nmero seja sempre o correto. Vou li star algu mas:

    y Alterar o cdigo forando que o valor 4 seja movido para EAXante s da compara o.

    y Anular o ltimo salto (aps o CMP EAX,4), fazendo com que ofluxo do aplicativo siga direto para a mensagem correta.

    y Desviando e for ando u m salto para a mensagem correta logona primeira compara o realizada.Existem outra s formas ainda, mas vamos ficar com essas trs,

    pois so a s mais bvias. Eu vou utilizar o lti mo mtodo ne stetutorial para exe mplificar o pro cesso.

    O que ba sicamente n s vamos fazer for ar u m salto logoaps a funo G etDlg 4 tem 4 n t diretamente para a regio que chamaa nossa mensagem de texto Vo c a certou..., como mostra aimagem abaixo:

  • 8/6/2019 Utilizando Um Debugger

    22/25

    Para modificar o disassembly, ba sta clicar sobre a linha quedeseja alterar e apertar a te cla Es pao . Isso far com que u ma

    janela se abra com um local onde vo c po ssa indicar a in struo quedeseja colocar no lo cal.

    O nosso objetivo aqui substituir o CMP EAX,1 por um saltono-condicional at o lo cal onde o s argumento s da nossa mensagem de texto comeam a ser selecionados (no PUSH 0, localizado noendere o 00401063) .

    Clique sobre a linha que contm o CMP EAX,1 (no endere o00401054) e pre ss ione Es pao . A seguinte janela se abrir :

    Na caixa de texto onde vo c entra com a instruo e m assembly que de seja substituir. Caso a instruo que n s inserirmos seja menor (em bytes) que a in struo anterior, o Olly substitui esses bytes restante s pela instruo NOP, que no realiza nenhu maopera o, evitando a ss im que fiquem resqu cios e lixos do comandoanterior (caso a caixa de seleo 5 illwit hNOP s e steja selecionada,claro).

    Altere o CMP EAX,1 por JMP 00401063 , como mostra a figura :

    Em seguida, ba sta clicar e m Assemble para confirmar amodificao. Voc deve ter notado que o Olly coloriu com vermelhoaquilo que foi modificado. Note ta mbm que ele in seriu um comandoNOP aps o salto, indicando que o no sso opcode do salto era 1 bytemenor que o comando anterior.

  • 8/6/2019 Utilizando Um Debugger

    23/25

    Voc pode rodar o nosso aplicativo dentro do Olly e observar amodificao. Agora, com qualquer valor que voc entre (mesmoaqueles fora do intervalo), o programa vai exibir a mensagem quedesejvamos.

    Como mencionado anteriormente, todas as modificaes ficamarmazenadas na janela de patches, que pode s er acessada clicandono boto \ ou atravs o atalho C TRL+P. Para alternar entre ainstruo modificada e a original, basta selecionar a modificaodesejada na janela de patches e apertar Es 6 ao (ou atravs doboto direito -> R estore original code ).

    Para salvar o novo executvel bem simples. Na janela dedissassembly, clique com o boto direito e v para Co 6 ytoExecutable ->Allmodifications . Uma pequena janela seabrir perguntando se voc deseja copiar o cdigo modificado.Selecione Co 6 yAll . Uma nova janela, contendo todo o cdigomodificado, ser exibida. Clique com o boto direito sobre ela eselecione Save File . Basta escolher o local e voc ter um novoexecutvel, contendo a modificao realizada.

    Aps um tempo sem updates, resolvi criar u ma lista com osplugins que considero indispensveis para o Olly.

    P LUGIN S

    I DAFicator Autor: AT4RE

    Um dos melhores plugins j criados para o Olly. Ele traz para oOllyDbg muitas das facilidades e funcionalidades disponveis no IDA(InteractiveDisassembler).

    OllyDum 7

    Autor: Gigapede

    Plugin extremamente til quando est se trabalhando comdescompresso de executveis, em que necessrio realizar umdump do processo na memria (buscar os dados da memria e jogarpara o disco, simplificadamente). Funciona muito b em juntamentecom o ImpRec (ImportReconstructor), que re-alinha todo oexecutvel novamente.

  • 8/6/2019 Utilizando Um Debugger

    24/25

    OllyScri 8 t

    Autor: SHaG

    Indispensvel.Com esse plugin voc pode rodar scripts dentro

    do debugger, automatizando diversos processos e lhe salvandotempo. fcil encontrar sites contendo centenas de scripts, masrecomendo este aqui:

    http://www.tuts4you.com/download.php?list.53

    OllyP erl

    Autor: Joe Stewart

    Outra forma de automatizar o Olly, escrevendo scripts na

    linguagem Perl. Para utilizar o plugin preciso ter o ActivePerlinstalado.

    CommandBar

    Autor: Gigapede

    Quem j utilizou o bom e velho (e infelizmente extinto =()SoftICE certamente vai gostar desse plugin. Trata-se de uma caixa detexto na qual voc pode praticamente controlar o Olly atravs decomandos que seguem a mesma sintaxe utilizada no Soft ICE (bpx,

    bd, cpu, etc).OllyToolBar Manager

    Autor: arjuns

    Com esse plugin voc pode adicionar itens na barra deferramentas do OllyDbg. Muito bom para colocar atalhos paraNotepad, Calculadora, editor Hexadecimal, editor de recursos. Dessaforma voc no precisa ficar perdendo tempo e navegar at a pasta(ou menu iniciar) onde esto os aplicativos. Recomendo muito.

    OllyFlow

    Autor: henryouly

    Talvez um dos plugins mais interessantes. O OllyFlow geragrficos e fluxogramas do disassembly para facilitar a identificao ea interpretao do fluxo do aplicativo (funcionalidade presente noIDA).

  • 8/6/2019 Utilizando Um Debugger

    25/25

    Por enquanto so esses. Mais para frente eu adicionoeventuais plugins e deixo um aviso aqui neste tpico, notificando daatualizao.

    Vou aproveitar esse tpico para colocar o meu scheme de

    cores que criei e utilizo no Olly. Para utilizar, modifique o arq uivoollydbg.ini adicionando as seguintes entradas (verifique pela seocorreta e altere o asterisco para o ndice desejado):

    Cdigo:[Colours]Scheme[*]=0,12,8,18,7,8,7,13Scheme name[*]=Fergo

    [Syntax]Commands[*]=15,4,10,10,9,10,112,13,111,8,12,0,0,0Operands[*]=1,11,11,11,2,2,4,4,0,0,0,0,0,0

    Schemename[*]=Fergo