Logo Hardware.com.br
emtudo
emtudo Super Participante Registrado
851 Mensagens 4 Curtidas
#17 Por emtudo
05/10/2007 - 14:50
Fergo disse:
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
Fergo Highlander Registrado
9.3K Mensagens 1.1K Curtidas
#18 Por Fergo
20/10/2007 - 14:37
Valeu pelo apoio pessoal.
Finalmente arranjei um tempo livre e dei continuidade do estudo smile.png

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:

Imagem


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á:

Imagem


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:

Imagem


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.

Imagem


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
david.rj.2k
david.rj.2k Membro Senior Registrado
416 Mensagens 8 Curtidas
#28 Por david.rj.2k
06/11/2007 - 01:14
: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 wink.png

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
Felipe_Ribas Novo Membro Registrado
6 Mensagens 0 Curtidas
#29 Por Felipe_Ribas
09/01/2008 - 20:30
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
Fergo Highlander Registrado
9.3K Mensagens 1.1K Curtidas
#30 Por Fergo
13/01/2008 - 19:33
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
© 1999-2024 Hardware.com.br. Todos os direitos reservados.
Imagem do Modal