Tut Memoria

Embed Size (px)

Citation preview

  • 8/3/2019 Tut Memoria

    1/14

    MANIPULAO DE MEMRIA TRAINERSPor: Fernando Birck ( Fergo )

  • 8/3/2019 Tut Memoria

    2/14

    2

    SUMRIO

    INTRODUO.................................................................................................................... 3FERRAMENTAS NECESSRIAS........................................................................................... 4IDENTIFICANDO O LOCAL DE MEMRIA .......................................................................... 5

    PROGRAMANDO O TRAINER ............................................................................................ 9CONCLUSO.................................................................................................................... 14

  • 8/3/2019 Tut Memoria

    3/14

    3

    INTRODUO

    Bem vindo a mais um dos meus artigos. Continuando a seqncia de tutoriais voltadosa linguagem assembly, desta vez vamos falar um pouco sobre manipulao dememria dentro do ambiente Windows. Para tal, resolvi escolher um tema

    interessante, principalmente aos jogadores, que representa muito bem o processo demodificao de memria: os trainers.

    Trainers so basicamente aplicativos que adicionam novos recursos a um determinado jogo, sem alterar nenhum arquivo em disco, mexendo apenas naquilo que foicarregado na memria. Um bom exemplo de trainers so aquelas ferramentas queadicionam veculos ao GTA. Voc basicamente inicia o jogo e em seguida executa otrainer, no qual voc escolhe um determinado veculo e o aplicativo faz o trabalho degerar o automvel no jogo. Isso feito basicamente manipulando os dados carregadosna memria pelo GTA e os adaptando e alterando para pode criar um novo veculo.

    Eles so somente um exemplo. Como outros exemplos podemos citar os aplicativosanti-vrus, que alteram boa parte do espao de memria dos aplicativos do Windowspara poder ter um controle sobre o que acontece dentro deles, podendo tomardecises e alertar o usurio antes que algo ruim acontea ao sistema.Programas de captura de tela tambm funcionam de forma semelhante. Eles seintegram ao espao de memria do Windows ou dos jogos e monitoram o teclado,podendo identificar quando determinada tecla foi pressionada e realizar a captura daimagem.

    Aps essa breve introduo, creio que j d para ter certa noo da importncia e dautilizao desse processo, seja para reforar a segurana do sistema ou paraprogramar addons aos seus jogos.

    A inteno deste guia no ensinar a criar trainers, mas sim exemplificar uma formade acessar a memria dos aplicativos. Tal conhecimento pode ser utilizadoposteriormente para programar aplicativos semelhantes aos exemplificados doispargrafos acima.

    No nosso estudo vamos modificar um jogo extremamente simples e sem muito

    sentido, que programei apenas com a finalidade de estudar esse processo. Consistebasicamente em uma janela e alguns botes, com os quais voc pode comprar itensenquanto possuir dinheiro para tal. O que ns vamos fazer bolar um trainer queadicione mais dinheiro no nosso joguinho, sem modificar nada em disco ou noexecutvel do programa.

    Vale lembrar que bom ter certo conhecimento de programao e o bsico emlinguagem assembly, j que vamos fazer o debug do nosso alvo, identificar o localonde o valor do dinheiro fica armazenado e programar um trainer para modific-lo.

  • 8/3/2019 Tut Memoria

    4/14

    4

    FERRAMENTAS NECESSRIAS

    Abaixo segue uma breve lista das ferramentas que vamos utilizar:

    OllyDbgo Um dos melhores debuggers disponveis. Vamos utiliz-lo para

    identificar o local de memria onde o jogo guarda a informao dodinheiro.

    o http://www.ollydbg.de/download.htm WinASM

    o IDE de programao em assembly. Gratuita e muito prtica de setrabalhar. Necessita o MASM32 para compilar.

    o http://www.winasm.net/ MASM32

    o Compilador de assembly mais conhecido. Tambm gratuito.o http://www.masm32.com/masmdl.htm

    Alvo e cdigos-fonteo Nosso pequeno jogo e o trainer j compilado. Inclui o cdigo-fonte de

    ambos os aplicativoso http://www.fergonez.net/files/tut_memoria.rar

    OBS.: A etapa de configurao do WinASM e do MASM32 descrita na segunda partedo meu artigo sobre a segurana do Windows, disponvel no link abaixo:http://www.fergonez.net/files/seg_windows_pt2.pdf

    Recomendo ler, pois os conhecimentos descritos no guia de segurana sero utilizadosneste artigo.

    No mesmo guia consta uma breve descrio sobre o OllyDbg e o seu funcionamento.Por essa razo, no explicarei como utiliz-lo aqui.

  • 8/3/2019 Tut Memoria

    5/14

  • 8/3/2019 Tut Memoria

    6/14

    6

    Vamos ento buscar pela funo da API que exibe a mensagem de texto(MessageBoxA). Dentro do Olly, pressione ALT+E. Uma janela chamada ExecutableModules ser aberta. Nela esto listadas todas as DLLs das quais o aplicativodepende, dentre elas a user32.dll, que comporta a funo MessageBoxA. Selecione oprimeiro item da lista, cujo nome deva ser jogo, clique com o boto direito e em

    seguida clique em View Names. Uma nova janela aparecer, contendo todas asfunes (e no mais as DLLs) utilizadas pelo aplicativo. Repare que um dos itens afuno MessageBoxA que procurvamos. Clique novamente com o boto direito sobreessa funo e selecione a opo Set breakpoint on every reference.

    Esse item far com que o programa insira um breakpoint em cada referncia feita afuno MessageBoxA, congelando o programa assim que a execuo atingir esseponto.

    Feito isso, feche a janela Names e Executable Modules, retornando a tela principaldo Olly. Vamos iniciar a execuo do programa dentro do debugger. Para isso, bastaclicar no boto Play e o Olly comea a execuo. Para pararmos no breakpoint,precisamos fazer o programa chamar a funo MessageBox, ento tente comprar 2

    TVs HDTV. Antes de o jogo exibir a mensagem de dinheiro insuficiente, o Olly vaipausar a execuo e retornar o foco para si. A linha onde o programa foi congeladoficar marcada e a regio do cdigo ser semelhante a essa:

    Repare que ele foi pausado no instante em que a mensagem seria exibida. possvelnotar que os quatro argumentos necessrios para a exibio da mensagem de texto j

    foram colocados na pilha: tipo da janela, ttulo, mensagem e a janela pai (veja o guiade segurana caso no tenha entendido esse processo). Vamos retomar agora aquela

  • 8/3/2019 Tut Memoria

    7/14

    7

    lgica mencionada no incio. A lgica era que o jogo provavelmente verifica pelaquantia de dinheiro e caso ela seja insuficiente, exibe a mensagem. Pois bem, nscamos nessa regio do cdigo justamente por que no possumos dinheiro suficientepara comprar o item. Vamos analisar as linhas logo acima da chamada da MessageBox:

    CMP WORD PTR DS:[40309C],1194

    Temos aqui uma instruo de comparao (CMP). Sua sintaxe a mostrada abaixo:

    CMPdestino, fonte

    Essa instruo subtrai virtualmente seus operandos (fonte destino), realizando asubtrao mas no armazenando resultados, alterando apenas as flags doprocessador. Caso essa subtrao resulte em zero ou em um valor negativo (indicandoque a fonte menor que o destino), a instruo seta a CarryFlag (CF) para 0. Outrasflags so alteradas no processo, mas no vo nos interessar.

    Logo abaixo dessa instruo temos um jump condicional:

    JNBSHORTjogo.004011B7

    JNB significa Jump if not Below, que traduzindo para o portugus seria Salte se noabaixo. A condio de salto dela depende da CarryFlag. Se ela for zero, o salto realizado, caso contrrio ele executa a prxima instruo, dando continuidade aexecuo.

    Podemos resumir essas instrues de uma maneira mais simples e didtica (no daforma mais correta), atravs de um pseudocdigo:

    Se fonte

  • 8/3/2019 Tut Memoria

    8/14

    8

    Pela imagem podemos ver que o valor contido no endereo 0x40309C 0x09C4, que

    convertendo para a base decimal nos d 2500.So valores extremamente interessantes, pois se voc reparar, 4500 o preo do itemHDTV e 2500 o dinheiro que voc possui atualmente no jogo. Notando isso, nsmatamos a charada, pois identificamos qual o endereo de memria utilizado peloalvo para armazenar a quantia de dinheiro que o jogador possui atualmente, que nessecaso 0x0040309C. Guarde bem este nmero, pois vamos utiliz-lo na hora deprogramar o trainer.

  • 8/3/2019 Tut Memoria

    9/14

    9

    PROGRAMANDO O TRAINER

    Vamos dar incio ao processo de programao. Antes de entrar com cdigos, vou daruma breve explicao de como feito esse processo, utilizando apenas os recursos e adocumentao oferecida pela prpria Microsoft e pela API do Windows.

    Ns temos um alvo, e este possui seu espao de memria delimitado, paginado eprotegido pelo sistema, para evitar que outros aplicativos invadam ou modifiquem asua regio por descuido. No entanto, limitar completamente a memria paginada doaplicativo tornaria o sistema muito sufocado, dificultando bastante a interface entreduas ou mais aplicaes distintas. Por essa razo que o Windows possui funesespecficas que permitem ter o controle do espao de memria alheio, caso contrriono teramos aplicativos anti-malware ou at mesmo de monitoramento derecursos.

    O processo que vamos utilizar faz o uso apenas da API do Windows, utilizando asfunes programadas e embutidas no prprio sistema. A primeira atitude obter ovalor do handle (controle) da janela alvo. Tendo o controle da janela, possvel buscaro handle do processo pai do alvo, que posteriormente vai ser utilizado para obter odomnio sobre o processo e fazer a alterao desejada na memria.

    Todo o cdigo est disponvel dentro do arquivo RAR indicado no incio do tutorial. Elej vem pronto para ser aberto e compilado no WinAsm. Abra o arquivo trainer.wapcontido dentro da pasta Trainer. Como disse no incio do tutorial, recomendvel terum conhecimento bsico de assembly e da sintaxe adotada pelo MASM32. Vou

    ressaltar alguns trechos importantes do cdigo aqui (ele est comentado no arquivo):

    .data

    ddEndereco dd 0040309Ch

    .data?

    hInstance dd ?

    dwDinheiro dw ?

    dwProcessId dd ?

    hProcess dd ?

    Temos aqui apenas algumas declaraes de variveis (as mais importantes). Oendereo de memria que vamos modificar fica armazenado na varivelddEndereo. O valor dessa varivel foi aquele endereo que obtivemos no OllyDbg.

    Em seguida vem as variveis no inicializadas que sero utilizadas basicamente para oshandles e IDs obtidos atravs de API. Uma exceo a dwDinheiro, que armazenara quantia de crditos injetada no alvo.

  • 8/3/2019 Tut Memoria

    10/14

    10

    Em seguida vem o trecho mais importante do trainer, que a funo de callbackutilizada para processar as mensagens do Windows e verificar os eventos queocorreram. Abaixo uma imagem de como ela se assemelha (removi os comentriospara poupar espao):

    Para quem j programa sobre a API do Windows esse cdigo no novidade, portantovou ressaltar a parte mais importante, que realmente executa o patch de memria,comeando pela funo FindWindow.

    invokeFindWindow,NULL,offset szJanela

    E a sua estrutura, retirada do MSDN:

    HWND FindWindow(

    LPCTSTRlpClassName,

    LPCTSTRlpWindowName

    );

    Bem simples, recebe apenas dois argumentos. O primeiro o lpClassName, que no utilizado neste guia e pode ser nulo. O segundo um ponteiro para o nome da janela(foi declarada na seo .data do cdigo).

    Em seguida temos a funo GetWindowThreadProcessId:

    invokeGetWindowThreadProcessId,eax, offset dwProcessId

  • 8/3/2019 Tut Memoria

    11/14

    11

    Sua sintaxe descrita pelo MSDN tambm:

    DWORD GetWindowThreadProcessId(

    HWNDhWnd,

    LPDWORDlpdwProcessId

    );

    Ela pede o handle da janela e um ponteiro para armazenar o valor do ProcessID. Ohandle foi obtido na funo anterior (FindWindow) e ficou armazenado em EAX(registrador de retorno padro do Windows). Estamos passando o EAX diretamentecomo parmetro desta funo. O ldwProcessId o ponteiro para uma DWORD ondeser armazenado o valor do ProcessId, aps o processamento da funo.

    Tendo o ProcessId possvel j obter o acesso ao programa alvo. Isso feito pelafuno OpenProcess:

    invokeOpenProcess,PROCESS_ALL_ACCESS, FALSE, dwProcessId

    Sua sintaxe:

    HANDLE OpenProcess(

    DWORDfdwAccess,

    BOOLfInherit,

    DWORDIDProcess

    );

    Essa funo pede trs argumentos: tipo de acesso (total, restrito, para debug, etc),herana (se vai ser possvel controlar os processos filhos) e o ID do processo alvo. Elaretorna um handle para o processo aberto (caso seja bem sucedida), que movidopara o hProcess. Por fim, esse hProcess utilizado na operao mais importante doprograma, que a escrita na memria do alvo, executado pela funoWriteProcessMemory:

    invokeWriteProcessMemory,hProcess, ddEndereco, addr dwDinheiro, 2,

    offset lpWrittenBytes

    Sintaxe:

    BOOL WriteProcessMemory(

    HANDLEhProcess,

    LPVOIDlpBaseAddress,

    LPVOIDlpBuffer,

    DWORD nSize,

    LPDWORDlpNumberOfBytesWritten

    );

    Ela pede cinco argumentos. Os nomes so auto-explicativos, mas vou explicar cada umdeles mesmo assim. hProcess o handle do processo alvo, obtido na operaoanterior. lpBaseAddress o endereo de memria que ser modificado pela funo.Ele foi declarado l no incio do cdigo, na seo .data, como sendo 0040309Ch (ou

    0x0040309C nos padres do C/C++). O prximo argumento o lpBuffer, um ponteiropara os valores que sero inseridos. No nosso caso ele corresponde ao dinheiro

  • 8/3/2019 Tut Memoria

    12/14

  • 8/3/2019 Tut Memoria

    13/14

    13

  • 8/3/2019 Tut Memoria

    14/14

    14

    CONCLUSO

    Vamos ficando por aqui. Espero que este guia tenha sido til, explicando um poucosobre o uso das APIs do Windows para obter dados de outros aplicativos. Como disseno incio do tutorial, o trainer foi apenas um exemplo devido praticidade de se fazer

    um tutorial baseado neles. O mesmo processo pode ser utilizado para criao deoutros softwares, principalmente queles relativos a segurana do sistema, proteoresidente ou qualquer aplicao em que preciso monitorar as aes antes que elasaconteam ou sejam processadas pelo alvo, como no caso dos aplicativos de capturade tela.

    Abraos e at a prxima!Fergo Agosto 2007

    Website: http://www.fergonez.net