sexta-feira, 26 de maio de 2017

Curso de Assembly Aula 15



+-------------+
¦ ASSEMBLY XV ¦
+-------------+

    Continuando o  papo  sobre  o  TASM,  precisaremos aprender como
manipular tipos de dados mais complexos do que WORD, BYTE ou  DWORD.
Eis a descriçäo das estruturas!

    Uma  estrutura  é o agrupamento de tipos de dados simples em uma
única classe de armazenamento, por exemplo:

 +-----------------------------------------------------------------+
 ¦  STRUC   MyType                                                 ¦
 ¦      A   DB  ?                                                  ¦
 ¦      B   DW  ?                                                  ¦
 ¦  ENDS                                                           ¦
 +-----------------------------------------------------------------+

    A estrutura MyType acima,  delimitada pelas palavras-chava STRUC
e ENDS, foi construida com dois tipos de dados simples (BYTE e WORD)
com os nomes de A e B. Note que as linhas acima  apenas  declaram  a
estrutura,  sem  alocar  espaço  na  memória  para  ela.   Criar uma
'instancia' dessa estrutura é täo  simples quanto criar uma variável
de tipo simples:

 +-----------------------------------------------------------------+
 ¦  MyVar   MyType  <0,0>                                          ¦
 +-----------------------------------------------------------------+

    A sintaxe  é  basicamente  a  mesma  de  qualquer  declaraçäo de
variável em assembly, com a diferença de que o 'tipo' do  dado  é  o
nome  (ou  TAG)  da  estrutura  -  MyType  - e os dados iniciais dos
elementos da estrutura estäo localizados entre os simbolos < e >. Na
linha acima criamos a  variável  MyVar,  cujos  elementos säo 0 e 0.
Vamos a um exemplo de uso desse novo tipo:

 +----------------------------------------------------------------+
 ¦  ;... Aqui entra o modelamento,...                             ¦
 ¦                                                                ¦
 ¦  DATASEG                                                       ¦
 ¦                                                                ¦
 ¦  MyVar   MyType  <0,0>                                         ¦
 ¦                                                                ¦
 ¦  CODESEG                                                       ¦
 ¦                                                                ¦
 ¦  PROC    SetA        ; Poe valor em A na estrutura.            ¦
 ¦  ARG     V : Byte                                              ¦
 ¦          mov     al,[V]                                        ¦
 ¦          mov     [MyVar.A],al                                  ¦
 ¦          ret                                                   ¦
 ¦  ENDP                                                          ¦
 ¦                                                                ¦
 ¦  PROC    SetB        ; Poe valor em B na estrutura.            ¦
 ¦  ARG     V : Word                                              ¦
 ¦          mov     ax,[V]                                        ¦
 ¦          mov     [MyVar.B],ax                                  ¦
 ¦          ret                                                   ¦
 ¦  ENDP                                                          ¦
 ¦                                                                ¦
 ¦  ;... Aqui entra o fim do código...                            ¦
 +----------------------------------------------------------------+

    Simples, näo?

    Mas, e se quisermos trabalhar  com  um  vetor  do  tipo  MyType?
Vetores de tipos mais simples é facil:

 +----------------------------------------------------------------+
 ¦  DATASEG                                                       ¦
 ¦                                                                ¦
 ¦  MyVar1  dw  10 DUP (0)                                        ¦
 ¦                                                                ¦
 ¦  CODESEG                                                       ¦
 ¦                                                                ¦
 ¦  PROC    Fill1                                                 ¦
 ¦      mov     cx,10                                             ¦
 ¦      sub     bx,bx                                             ¦
 ¦  @@FillType1:                                                  ¦
 ¦      mov     [bx+MyVar1],0FFh                                  ¦
 ¦      add     bx,2                                              ¦
 ¦      dec     cx                                                ¦
 ¦      jnz     @@FillType1                                       ¦
 ¦      ret                                                       ¦
 ¦  ENDP                                                          ¦
 +----------------------------------------------------------------+

    Aqui fiz da  maneira  mais  dificil  apenas para exemplificar um
método de preenchimento  de  vetores.   No  caso,  BX  contém o item
desejado do vetor.  MyVar1 é o  deslocamento  do  primeiro  item  do
vetor  na  memória  e  CX  a quantidade de itens do vetor.  Note que
temos um vetor de WORDS  e  precisaremos  adicionar 2 (tamnho de uma
WORD) para cara item do vetor.  No caso da estrutura, isso  fica  um
pouco mais complicado porque ela pode ter um tamanho näo múltiplo de
2  (o que complica o cálculo.  Por exemplo, MyType (a estrutura) tem
3 bytes de  tamanho.   Eis  a  implementaçäo  (näo otimizada) para a
rotina FillType para preenchimento de um  vetor  de  MyType  com  10
itens:

 +-----------------------------------------------------------------+
 ¦  DATASEG                                                        ¦
 ¦  MyVar   MyType  10 dup (<0,0>)                                 ¦
 ¦                                                                 ¦
 ¦  CODESEG                                                        ¦
 ¦  PROC    FillType                                               ¦
 ¦          mov     cx,10                                          ¦
 ¦          sub     bx,bx   ; indice para localizar itens.         ¦
 ¦  @@FillLoop:                                                    ¦
 ¦          mov     [bx+MyVar.A],0FFh   ; * Instruçäo destacada... ¦
 ¦          mov     [bx+MyVar.B],0FFFFh                            ¦
 ¦          add     bx,3                                           ¦
 ¦          dec     cx                                             ¦
 ¦          jnz     @@FillLoop                                     ¦
 ¦          ret                                                    ¦
 ¦  ENDP                                                           ¦
 +-----------------------------------------------------------------+

    Essa rotina merece ser observada mais de perto:

    Vejamos a  instruçäo  destacada  na  listagem  acima...  MyVar.A
fornece o deslocamento de A, do primeiro item do vetor, na  memória,
enquanto isso BX fornece o indice do item desejado no vetor.  Assim,
BX+MyVar.A  fornecerá  o  offset  do elemento A do item da estrutura
desejado.

    Well... É isso...

Nenhum comentário:

Postar um comentário

Curso SANS 504 Hacker Techniques, Exploits & Incident Handling

SANS SECURITY 504 - Hacker Techniques, Exploits & Incident Handling     SANS Security 504.5.pdf13 MB     SANS Security 504.1.pdf12 M...