Autor Tópico: Simple ARM Assembler compilado para Windows x86  (Lida 6951 vezes)

0 Membros e 1 Visitante estão vendo este tópico.

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Simple ARM Assembler compilado para Windows x86
« Online: Setembro 18, 2009, 07:00:59 pm »
O zeurt encontrou o Simple ARM Assembler (aasm), um Assembler gratuito para instruções ARM, mas não havia o binário para Windows. Então usei o Cygwin (http://www.cygwin.com/) e o compilei para Windows x86. Estou enviando o arquivo zipado com o aasm.exe e também com a documentação no formato texto Windows. O site de distribuição, http://intranet.cs.man.ac.uk/Study_subweb/Ugrad/coursenotes/komodo/assembler/ nos dá essa liberdade.

Ele deve ser executado pelo Prompt de Comando do Windows. É bem simples de utilizar e suporta o modo Thumb. Você pode usar o Bloco de Notas e escrever, por exemplo:

Código: [Selecionar]
THUMB
INICIO ADD R0, R1, R1
ADD R2, R1, R1
LSL R1, R2, #3
BNE INICIO

A primeira linha diz que será usado o modo Thumb (16 bits). A segunda possui um label. Já vi que no modo Thumb, os mnemônicos que o IDA chama de ADDS, LSLS e LSRS devem ser escritos como ADD, LSL e LSR, respectivamente. Deve haver mais algumas diferenças em outros mnemônicos, consultem a documentação. Se você não sabe o que é modo Thumb ou como são as instruções do ARM, veja um pouco do assunto a partir deste post: http://ryan.com.br/smf/index.php?topic=392.msg9177215#msg9177215.

Após salvar o arquivo, você pode usar o comando aasm.exe -h - (caminho_do_arquivo\nome_do_arquivo) para ver o hexadecimal gerado na tela ou aasm.exe -h (nome_do_arquivo_de_saida) (caminho do arquivo\nome do arquivo) para gerar um arquivo texto com o hexadecimal. Veja que no primeiro caso, em vez do nome do arquivo de saída, foi usado apenas o símbolo "-". O arquivo de saída não pode ser visualizado corretamente no Bloco de Notas pois ele não está no formato texto Windows. Use outro visualizador. Sugiro o Programmer’s Notepad (http://www.pnotepad.org/) que é muito bom e gratuito. Apesar de não ser possível gerar o binário puro, é possível gerar o ELF com o comando aasm.exe -e (nome_do_arquivo_de_saida) (caminho do arquivo\nome do arquivo). Você pode abrir o arquivo de saída ELF num editor hexadecimal e retirar apenas a parte do seu código (após o cabeçalho).

Há várias outras opções, consultem a documentação. Como não trabalhei com esse software, não conheço suas limitações e nem seus bugs.

O aasm é voltado para o KMD, (http://brej.org/kmd/index.html), um debugger gráfico com suporte ao ARM. Como ele pode complementar o IDA, tentei também instalá-lo com o Cygwin, mas não consegui devido a problemas com a biblioteca GTK. Mas acho que ainda é possível, só é preciso resolver as dependências. Seria mais fácil para os usuários Windows utilizarem-no com o Cygwin, sem que precisem instalar o Linux inteiro. Como usuário Linux, ainda não tive a oportunidade de instalá-lo diretamente. Mas já observei que há pocotes compilados para o Ubuntu.
« Última modificação: Setembro 18, 2009, 09:42:59 pm por rictad »

Offline zeurt

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 333
  • Aprovação: +47/-0
    • Ver Perfil
Re: Simple ARM Assembler compilado para Windows x86
« Responder #1 Online: Setembro 19, 2009, 02:07:10 am »
Oi Rictad, Obrigado mais uma vez!

Estou com algumas dúvidas.
Não consegui usar o aasm.exe no prompt de comando do Windows: ao tentar executá-lo, aparece uma mensagem referente a falta do cygwin.dll.
Então instalei o Cywin (instalação default), coloquei o aasm.exe e o arquivo mnemonics na pasta C:\cygwin\bin e então consegui executá-lo usando o prompt Cygwin. Porém, após ter criado o exemplo que você sugeriu, usando o Bloco de Notas do Windows, ao tentar usar o aasm.exe com esse arquivo, surge a mensagem Can't open mnemonics. Você tem alguma sugestão do que pode estar errado?

FORUM.RYAN.COM.BR

Re: Simple ARM Assembler compilado para Windows x86
« Responder #1 Online: Setembro 19, 2009, 02:07:10 am »

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Simple ARM Assembler compilado para Windows x86
« Responder #2 Online: Setembro 19, 2009, 03:17:56 am »
Olá zeurt,

Eu esqueci de dizer que ia precisar do cygwin1.dll. Não precisa nem instalar o Cygwin, basta colocar a dll no mesmo diretório do aasm.exe ou no diretório System32 do Windows. Depois que fizer isso, você poderá usar o Prompt de Comando do Windows para executar o aasm.exe em qualquer diretório, não precisa ser no bin do Cygwin e nem com o prompt do Cygwin. Eu deixei o arquivo mnemonics juntamente com o aasm.exe na mesma pasta dentro do zip. Talvez você não tenha copiado o mnemonics junto, por isso está dando a mensagem o erro.
« Última modificação: Setembro 19, 2009, 03:42:18 am por rictad »

Offline zeurt

  • Seeder
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 333
  • Aprovação: +47/-0
    • Ver Perfil
Re: Simple ARM Assembler compilado para Windows x86
« Responder #3 Online: Setembro 19, 2009, 03:34:17 am »
Beleza! Agora, com o cygwin1.dll na mesma pasta do aasm.exe, está funcionando perfeitamente no prompt do Windows.
É realmente interessante podermos contar com essa ótima alternativa para facilitar modificações futuras no ARM. Me parece que economizará bastante tempo e trabalho!
Agora falta usar, testar, etc.
Uma coisa que notei é que não há suporte a THUMB-2. Portanto, as instruções de 32 bits devem ser separadas do restante. Como são poucas, não tem tanto problema...
« Última modificação: Setembro 19, 2009, 03:39:06 am por zeurt »

Offline rictad

  • Hacker Honorário
  • Colaboradores
  • Papagaio
  • *
  • Mensagens: 285
  • Aprovação: +59/-0
    • Ver Perfil
Re: Simple ARM Assembler compilado para Windows x86
« Responder #4 Online: Setembro 25, 2009, 11:12:54 pm »
Não se preocupe com o modo Thumb-2. Verificando mais, acho que apenas o modo Thumb é usado nos firmwares. A instrução BL, no modo Thumb, tem realmente 32 bits, e não 16. Se tivesse apenas 16 bits, os saltos diretos seriam de no máximo 64 kbytes. Uma das vantagens do modo Thumb é tornar a execução mais rápida em memórias de 16 bits, e não limitar o tamanho da memória  8). Olhando na página 14 deste documento, percebi que a intrução BL possui sufixo de 16 bits e prefixo de 16 bits, totalizando 32 bits. Podemos ver isso no AASM com o seguinte exemplo:

Código: [Selecionar]
THUMB
INICIO ADD R0, R1, R1
ADD R2, R1, R1
LSL R1, R2, #3
BNE INICIO
BL $000C

E veremos que o BL para o endereço 0x000C terá 4 bytes (em tempo: sem o $, o AASM considera o endereço em decimal, ou seja, BL $000C é equivalente a BL 0012).

Mas é possível fazer a mudança entre os modos em tempo de execução. Acho que só algumas poucas rotinas dos firmwares Mediatek estão em modo ARM, incluindo o início do código. A mudança é feita por meio da instrução BX [Rm], em que Rm é qualquer um dos registradores, de R0 a R15 (lemprando que o R13 é usado como Stack Pointer, por isso também é chamado de SP, o R14 é usado como endereço de retorno de rotina, por isso muitas vezes é chamado de LR e o R15 é usado como contador de programa, daí também ser chamado de PC). O BX [Rm] fará um salto para o endereço que está armazenado em Rm, mas também trocará o modo de execução dependendo do bit 0 de Rm. Veja que uma rotina ARM ou Thumb sempre deve começar em um endereço par, o que facilita as coisas, pois as instruções ou são pares ou quádruplas de bytes. Se o bit menos significativo (bit 0) de Rm for 0, BX [Rm] fará um salto para o endereço em Rm sem mudar o modo de execução. Já se o bit menos significativo de Rm for 1 (endereço ímpar), BX [Rm] irá zerar o bit 0 de Rm (corrige o endereço para par), fará um salto para o endereço (corrigido) em Rm e irá mudar o modo de execução (de Thumb para ARM ou vice-versa). Dessa forma, é possível fazer rotinas em modo Thumb e outras em modo ARM.
« Última modificação: Outubro 01, 2009, 04:17:18 am por rictad »

FORUM.RYAN.COM.BR

Re: Simple ARM Assembler compilado para Windows x86
« Responder #4 Online: Setembro 25, 2009, 11:12:54 pm »