Fergo
Highlander
Registrado
9.3K Mensagens
1.1K Curtidas
Valeu pessoal!
Pretendo ir postando sim (até não 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 não sobrou tempo para muita coisa.
Fergo
emtudo
Super Participante
Registrado
851 Mensagens
4 Curtidas
Valeu pessoal!
Pretendo ir postando sim (até não 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 não 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...
Fergo
Highlander
Registrado
9.3K Mensagens
1.1K Curtidas
Valeu pelo apoio pessoal.
Finalmente arranjei um tempo livre e dei continuidade do estudo
RE-ASSEMBLY
O Olly além de ser um ótimo debugger, é um ótimo assembler. Com ele também é possível editar o código em tempo real e observar as mudanças de comportamento. Todas as mudanças que você realiza no código ficam salvas já janela de “Show Patches” (/). Vamos agora ver como podemos modificar o código e re-salvar o nosso executável (muito útil para correção de bugs).
Reabra o nosso arquivo no Olly, caso ele esteja fechado. Nos capítulos anteriores discutimos um pouco sobre o funcionamento do nosso aplicativo de teste, então vamos agora fazer uma pequena modificação no mesmo para que ele sempre exiba a mensagem de “Você acertou”.
Nós tínhamos uma seqüência de comparações seguidas pelos seus respectivos saltos. A primeira verificava se o número era menor que 1, a segunda se ele era maior que 20 e a terceira se ele era em si o número escondido (4). Existem diversas formas de fazer com que o número seja sempre o correto. Vou listar algumas:
- Alterar o código forçando que o valor 4 seja movido para EAX antes da comparação.
- Anular o último salto (após o CMP EAX, 4), fazendo com que o fluxo do aplicativo siga direto para a mensagem correta.
- Desviando e forçando um salto para a mensagem correta logo na primeira comparação realizada.
Existem outras formas ainda, mas vamos ficar com essas três, pois são as mais óbvias. Eu vou utilizar o último método neste tutorial para exemplificar o processo.
O que basicamente nós vamos fazer é forçar um salto logo após a função GetDlgItemInt diretamente para a região 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 “Espaço”. Isso fará com que uma janela se abra com um local onde você possa indicar a instrução que deseja colocar no local.
O nosso objetivo aqui é substituir o CMP EAX, 1 por um salto não-condicional até o local onde os argumentos da nossa mensagem de texto começam a ser selecionados (no PUSH 0, localizado no endereço 00401063).
Clique sobre a linha que contém o CMP EAX, 1 (no endereço 00401054) e pressione “Espaço”. A seguinte janela se abrirá:
Na caixa de texto é onde você entra com a instrução em assembly que deseja substituir. Caso a instrução que nós inserirmos seja menor (em bytes) que a instrução anterior, o Olly substitui esses bytes restantes pela instrução NOP, que não realiza nenhuma operação, evitando assim que fiquem resquícios e “lixos” do comando anterior (caso a caixa de seleção “Fill with NOP’s” esteja selecionada, claro).
Altere o CMP EAX, 1 por JMP 00401063, como mostra a figura:
Em seguida, basta clicar em Assemble para confirmar a modificação. Você deve ter notado que o Olly coloriu com vermelho aquilo que foi modificado. Note também que ele inseriu um comando NOP após 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 modificação. Agora, com qualquer valor que você entre (mesmo aqueles fora do intervalo), o programa vai exibir a mensagem que desejávamos.
Como mencionado anteriormente, todas as modificações ficam armazenadas na janela de patches, que pode ser acessada clicando no botão “\” ou através o atalho CTRL+P. Para alternar entre a instrução modificada e a original, basta selecionar a modificação desejada na janela de patches e apertar “Espaço” (ou através do botão direito -> “Restore original code”).
Para salvar o novo executável é bem simples. Na janela de dissassembly, clique com o botão direito e vá para “Copy to Executable -> All modifications”. Uma pequena janela se abrirá perguntando se você deseja copiar o código modificado. Selecione “Copy All”. Uma nova janela, contendo todo o código modificado, será exibida. Clique com o botão direito sobre ela e selecione “Save File”. Basta escolher o local e você terá um novo executável, contendo a modificação realizada.
Espero dar continuidade em breve.
Abraços e bom final de semana,
Fergo
emtudo
Super Participante
Registrado
851 Mensagens
4 Curtidas
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
Fergo
Highlander
Registrado
9.3K Mensagens
1.1K Curtidas
Valeu emtudo!
Já foi liberada a versão 2.0 pré-alpha do Ollydbg, pode ser conferida no link:
http://www.ollydbg.de/
Ainda não é boa para ser utilizada em debugging, pois quase todas as funcionalidades ainda estão desativadas, mas já da para perceber uma certa melhoria na análise do código.
Fergo
losca
Novo Membro
Registrado
3 Mensagens
0 Curtidas
Cara, muito bom mesmo!
Parabéns!
Uma pergunta, vc tbm vai explicar como criar um "patch" pra modificar automaticamente o arquivo?
ate +!
topico favoritado
Fergo
Highlander
Registrado
9.3K Mensagens
1.1K Curtidas
Desculpe a demora.
Como assim criar um patch automaticamente? Você diz algo como o dUP, aquele patcher automático? Se for, não pretendo entrar nessa idéia, pois o intuito desse guia é mais sobre o uso do Olly e tentar fornecer o conteúdo necessário para que o usuário em si tenha conhecimento de como é esse procedimento.
Abraços,
Fergo
david.rj.2k
Membro Senior
Registrado
416 Mensagens
8 Curtidas
Po, muito show mesmo, qnd eu tiver tempo, vo da uma lida nesse tuto...
Uma coisa... pq n faz um mini-book sobre o assunto?
Tpo, pega o conteúdo que vc fez, da uma melhorada (se isso for possível), uma estilizada, e faz um mini-e-book (eauheaau acho q inventei o termo agora hehe), dai publica aki, fikaria muito bom
FLWS!!!
Fergo
Highlander
Registrado
9.3K Mensagens
1.1K Curtidas
Eu pretendo fazer isso sim, lançar um PDF com o conteúdo (como sempre faço), mas ainda não sei se o tutorial terminou ou não, estou pensando no que acrescentar.
Fergo
hkk
Membro Junior
Registrado
147 Mensagens
0 Curtidas
podia fazer um para o GDB
david.rj.2k
Membro Senior
Registrado
416 Mensagens
8 Curtidas
Wow! Show... onde posso achar seus tutoriais???
FLWS!
Fergo
Highlander
Registrado
9.3K Mensagens
1.1K Curtidas
Tem todos eles no meu site ou no link "Artigos e Tutoriais", ambos em minha assinatura.
Valeu!
Fergo
david.rj.2k
Membro Senior
Registrado
416 Mensagens
8 Curtidas
:O :$ Malz hehe... nem tinha me ligado kkk
Então, acabei de te manda uma MP, dai, por via das dúvidas vo coloka a pergunta q fiz a vc aki, q acho q todos devem saber
Tpo, eu não sei se o tópico foi destinado apenas ao assunto, e não sei se isso faz parte do assunto.
Você mostrou a utilização de 3 ints, e gravaram os valores nos registradores EAX, EBX, ECX, mas se, por algum acaso, eu precisar gravar 10 ints, como eu gravaria TODOS nesses registradores?
FLWS!!!
Felipe_Ribas
Novo Membro
Registrado
6 Mensagens
0 Curtidas
Ressucitando o topico...
Fergo, blz? Primeiramente parabéns pelo tutorial e pelos artigos (andei lendo todos relacionados a engenharia reversa no seu site). Aprendi bastante coisa já pois eu não sabia quase nada, apenas o método de achar a msg pela string do msgbox, que na maioria das vezes não era tão útil.
Agora surgiram algumas dúvidas, se puder me tirar:
-ali na chamada região 3, onde fica a memoria fisica (RAM) eu achei que ficava o programa inteiro armazenado, e não fica né? Pois vejo que até mesmo nos seus tutoriais, algumas referencias no codigo asm, como por exemplo um MOV, ele indica a string que vai MOVer num endereço que se encontra ali em baixo, correto? Logo, abri um executavel aqui que eu tentava achar uma string mas não conseguia. Aí abri ele pelo hex antes e achei a string lá mais pro fim. Daí achei q era só abrir pelo olly e essa mesma string ia tá ali em baixo. Mas notei que ali em baixo ele só me abriu uma parte não tão grande do codigo (mais ou menos o miolo). Pq isso? Afinal, como eu acho a string do msgbox agora pelo olly?
Eu tentei achar as referencias às chamadas do MessageBoxA, mas incrivelmente no jogo todo só tinham 3 chamadas... botei o breakpoint e não adiantou como eu já esperava: passou direto sem parar. É capaz de uma dll estar chamando o MessageBox em vez do proprio executavel?
-a outra duvida seria quanto aos endereços da memoria... quando eu boto breakpoint e o programa para, ele não volta com endereços que estavam antes, como por exemplo 00412308 (exemplo qualquer), e sim normalmente iniciado por 7, como por exemplo (77731230), entende? como eu faço pra voltar ao endereço relativo?
Valeu fergo, abraços
ps. continue melhorando no 3D q vc tá indo bem (eu tb mexia no max, sem grandes talentos rs)
Fergo
Highlander
Registrado
9.3K Mensagens
1.1K Curtidas
Na região da memória ele pode exibir diversas informações, que podem se escolhidas através do botão direito. Por padrão ele exibe apenas as seções de dados utilizada no executável, onde ficam os locais para leitura e escrita de dados.
A busca por strings só funciona realmente bem quando o executável utiliza um arquivo .res para armazenar as strings. O Olly possui a capacidade de indetificar qualquer string dentro do .exe, mas nem sempre ele encontra todas ou as detecta corretamente. Você pode tentar usar o plugin "Ultra String" do Olly, que é mais eficaz:
http://www.tuts4you.com/download.php?view.107
Quanto a outra dúvida, não entendi ao certo o que você quis dizer. Que endereço é esse que você está falando?
Abraços,
Fergo