Você está na página 1de 11

Introduo ao Assembly

Carssimos leitores, o presente artigo pretende expor um pouco dos segredos desta linguagem de baixo nvel, aquela mais prxima do cdigo mquina. Como fator de motivao, sabido que quando existe a necessidade de perceber o funcionamento de um executvel, por exemplo um jogo de computador, a soluo passa pela anlise do assembly. partir dele, possvel alterar e personali!ar seus processos e procedimentos, mas existe a necessidade de compreenso do cdigo. "ste artigo no tem objetivo de aprofundar a matria, apenas oferecer uma introduo de modo a facilitar a compreenso dos artigos de enge#aria reversa do presente blog.

Assembler ou Assembly?
ntes de mais convm esclarecer os conceitos de assembler e de assembly. $m erro muito comum nos indviduos experts em informtica, falarem de assembler referindo%se & linguagem de programao, mas no, assembler o nome dado ao programa de computador que gera o fic#eiro binrio apartir do cdigo assembly. 'e uma forma ainda mais simplificada, assembler ( )Programa para desenvolver e compilar assembly), assembly ( ) o nome dado linguagem de programao).

Ferramentas de Trabalho para o Artigo


- mu !"#!$( $m assembler para criao do cdigo%fonte. *ossu uma excelente interface e diversos mdulos para debbuging.

T%pico &' (egistos


'e uma forma geral, pode di!er%se que o assembly usa variveis globais. "stas variveis so +teis para a c#amada de vrios processos, como por exemplo( % ))eri*icar se o utili+ador digitou algo no buffer do teclado,) % )In*ormar o sistema -ue pretendido escrever no buffer de sa.da para o monitor,) "stes so os dois casos mais simples e fceis de perceber, na verdade, isto um tudo mais complicado. ,s registos mais importantes e comuns so os listados em seguida. &, A/ % , acumulador. Compreende A0 e A1, os bytes alto e bai#o de A/. 2, 3/ - base. Compreende 30 e 31, so usados como apontadores registos.

4, 5/ - , contador. Compreende 50 e 51, usado genricamente em ciclos iterativos .loops/. 6, 7/ - , deslocamento, este similar aos registos base 8BX9. Compreende 70 e 71. "stes registos so definidos como gerais, pois permitem arma!enar informao. Convm salientar que so todos registos de 01 bits, portanto, significa que apenas possvel guardar um inteiro positivo de 2 a 13343, ou um inteiro com sinal de %45617 at 45617. Como mencioando, estes so registos de 01 bits. "m seguida uma imagem representativa.

cima foi dito que A0 e A1 so os bytes alto e baixo, isto , mais e menos signi*icativos de A/. 8a verdade, ol#ando para a imagem fica fcil perceber o porqu9. :endo estes registos de 01 bits, por ve!es so necessrios registos de 45 bits e at 1; bits, conforme as necessidades. , principio passa maioritariamente pelo mesmo conceito. "m seguida apresentada a evoluo dos registos de 01 bits para 45 bits. &, A/ 2, 3/ 4, 5/ 6, 7/ A/ 3/ 5/ 7/

penas existe a mudana de E, refere%se a extended, isto , registo extendido. , conceito quase o mesmo do anterior. < possivel observar uma imagem que representa essa mudana em seguida.

=ais uma ve! parece intuitivo, isto funciona de igual forma para os outros registos. >oltando ao registo A/, que foi o escol#ido antecipadamente, proposto um desafio. :e for pretendido arma!enar "A65h em A/ como ficar arma!enada a informao? :ota.( 8o assemby a notao usada a #exadecimal, da o uso do valor "A658he#adecimal9. ;oluo( A0 receber "A e A1 receber 65 8A0<"A e A1<659.

'ito isto, se verificar a imagem re*erente ao registo A/ intuitivo que tanto A0 como A1 cont9m 7 bits de espao reservado disponveis na memria. *ortanto, a juno dos dois . A/ = A0/ permite obter o registo A/ de 01 bits. 'e uma forma bastante simplista possivel afirmar que cada )valor) do n+mero( "A65 vale 6 bits, um nibble. .'efinio de nibble em #ttp(@@en.AiBipedia.org@AiBi@8ibble./ " > 6 bits, A > 6 bits, 6 > 6 bits, 5 > 6 bits, >isuali!ando novamente a imagem referente ao A/ e voltando a ol#ar para a soluo do problema proposto, ficou claro esta subdiviso do registo na memria e o porqu9 de "A ficar arma!enado em A0. 8a verdade, "A so ! bites, o tamanho total de A0. Caso ainda presistam d+vidas, reparar no prximo caso. A0< "4h 8""""""&&9 A1< &"h 8"""&""""9 Cual o valor de A/? Dasta combinar os valores de A0 e A1. A0 = A1 < "4h = &"h < "4&"h A/< "4&"h *ara mais informao ver a tabela em( .#ttp(@@pt.AiBipedia.org@AiBi@EnteiroF.ciGHnciaFdaFcomputaGIGJo/ ,s restantes registos funcionam mais ou menos dentro desta lgica. "m seguida so apresentados os registos mais importantes. ?, 5; - , segmento de cdigo. , bloco de memria onde o cdigo arma!enado. $, 7; - , segmento de dados. rea na memria onde os dados so arma!enados. @, ; % , segmento extra. penas outro segmento de dados. !, ;; - , segmento de pil#a. qui o CPU (Central Processing Unit) arma!ena os endereos remotos das subrotinas. &", ;I% , ndice de fonte. Krequentemente usado para movimentaLes de blocos de instruLes. "ste um apontador que, com um segmento, geralmente ':, usado pela CPU para leitura. &&, 7I - , ndice de destino. 8ovamente um apontador, que com um segmento, geralmente ":, usado para escrita pela CPU. &2, ;P - , apontador da pil#a. Comumente usado com o segmento da pil#a. "stes e muitos outros so registos do assembly. 8o existe a necessidade saber todos eles, visto que no suposto programar em assembly, apenas perceber blocos de assembly, nomeadamente nos prximos artigos de engen#aria reversa. Contudo, suposto solidificar esta base de con#ecimento, to importante no contexto da engen#aria reversa.

T%pico 2' Tipos de 7ados


proveitando a ideia, imporante referir que no assembly, como noutra qualquer linguagem de programao, existem diferentes tipos de dados. ,s mais usuais so os seguintes.

&, 3yte ( Conjunto de 7 bits. 2, Aord( Conjunto de 01 bits. 4, 7Bord( Conjunto de 45 bits. 6, CBord( Conjunto de 1; bits. < possivel perceber que sempre a dobrar o tipo de dados .bits/ do anterior.

T%pico 4' As InstruDes e a Pilha


8este ponto sabido que existem registos e diferentes tipos de dados no assembly. $ma possvel analogia comparar registos como prateleiras do supermercado, cada uma apenas possu um certo tipo de produtos, mas dentro dessa produto existem diversas gamas. *ara o uso dos registos so necessrias instruLes. "m seguida segue uma listagem das mais comuns. Convm referir, que estas podero variar entre diferentes tipos de CPU. &, EF) GdestinoH I GvalorH % MOVE. "sta instruo permite mover um valor para uma determinada posio da memria. "x( EF) A/I &4h. 'esta forma, &4h .&" em decimal/ movido para o registo A/. ntes da instruo, A/ contin#a o valor !ero, neste momento possu &4h. < evidente que todas aquelas operaLes feitas no )Mpico0) relacionadas com o A/, nomeadamente( )apenas foi usado o bNte mais significativo de A/ para arma!enar o valor 04# .7 bits/), se tornam agora mais percetveis. 2, I:T GnJmeroH % Enterrupo. "sta instruo gera uma interrupo no sistema. #' I:T &"h. 8este caso era gerada uma interrupo &"h .01 em decimal/. interrupo lanada depende do conte+do do registo A0, entre outras coisas. *or exemplo, se A/<&4h e a interrupo &"h fosse gerada, o vdeo .modo grfico/ seria colocado no modo 452x522x531. =ais precisamente( A0 seria igual a "" - seleciona a subfuno do modo, e A1 seria igual a &4h - modo grfico 542x522x531. Contudo, se A0<2h, e a interrupo &$h fosse gerada, isso instruiria a CPU para chec ar se alguma tecla pressionada estava no bu!!er do teclado. :e A0<2hI e 30 < "h e a interrupo &"h fosse gerada, ento a CPU movia o cursor para a posio / em 71 e posio K em 70. Como possvel perceber neste momento, os registos quase que so os ingredientes para fa!er um bolo.

4, A77 GdestinoH I GvalorH % diciona. "sta instruo soma um n+mero ao valor arma!enado em destino. "x( EF) A/I "hO P agora igual a 2#. A77 A/I ?h O P agora igual a 3#. A77 A/I &"hO P agora igual a 03#. 6, ;L3 GdestinoHI GvalorH % :ubtrai. "sta instruo fa! o inverso da adio. "x( EF) A/I &4hO P agora igual a 04# .0Q decimal/. ;L3 A/I ?h O A/ agora igual a " h .0; decimal/. ?, 7 5 GregistoH %'ecrementa. "sta instruo tem a funo de decrementar, por exemplo, um registo. "x( EF) A/I &4hO P agora igual a 04#. 7 5 A/O P agora igual a 05#. $, I:5 GregistoH % Encrementa. < o inverso da operao anterior. @, 5A11 GprocedimentoH % C#ama uma subfuno. "ra possvel passar umas boas #oras a listar e descrever as instruLes do assembly, mas tal no ir acontecer. Cuando existe a necessidade de perceber um programa em assembly necessrio o analista usar a ferramenta "nternet e procurar@perceber o que cada uma das instruLes fa!. "stas instruLes, como j mencionado no presente artigo, variam de CPU para CPU, mas fa!em mais ou menos as mesmas operaLes.

-Pilhas
'uas das instruLes que normalmente so usadas e que aparecem com regularidade em cdigo assembly so as seguintes. &, PL;0 GregistoH % *us#, coloca algo na pil#a. 2, PFP GregistoH % *op, retira algo da pil#a. , conceito de pil#a bastante simples. *ara no entrar em demasiados detal#es apresentada a seguinte imagem, ilustrando uma pil#a.

Cuando colocado um byte na pil#a ele fica arma!enado na base da pil#a. , prximo registo ficaria na posio acima a ;P, , +ltimo byte a entrar sempre o primeiro a sair. "ste o conceito geral de pil#a e assim que funciona atravs das instruLes push e pop.

8a prtica funciona como na listagem apresentada em seguida, com todos os passos efetuados devidamente comentados.

T%pico 6' InstruDes e Flags


8o tpico anterior foram vistas algumas das instruLes mais usuais no assembly, mas de forma propositada, foram deixadas duas das mais importantes, a fim de serem discutidas no presente tpico. ra!o pela qual estas instruLes foram descartadas do tpico anterior, foi porque estas fa!em uso de !lags. :em mais demora, estas instruLes so o CMP .comparao de dois valores/ e os JUMPS .saltar para determinado endereo de memria . o!!set//. "sta instruo tem imensas instruLes JUMP associadas. &, 5EP A/ I 3/ - Comparao. Compara o registo A/ com o registo 3/ e reflete o valor da comparao .maior, menor ou igual/ nas !lags. < possvel imaginar as !lags como uma tabela, ser visto mais adiante. Como se percebe, aps uma instruo de CMP normal que aparea um JUMP, e a lgica associada muito simples. :e o valor da comparao *or superior, ento o salto .#UMP/ efetuado para determinada posio, se o valor *or menor para outra posio e por a em diante. , valor desta comparao ento arma!enado na tabela de !lags, da a sua real importRncia. 2, 5omparaDes sem sinal, "m seguida segue uma tabela com todas as comparaLes sem sinal e o valor de cada !lag.

8o ser exemplificado o uso destas instruLes. "ste ser um tema a abordar no primeiro artigo de engen#aria reversa. Como j referido, este artigo apenas serve como suporte & linguagem e de certa forma, ajudar o leitor a perceber o funcionamento .)por baixo)/ de qualquer fic#eiro executvel. .>er mais informao no blog( #ttp(@@infptavares.blogspot.pt@5204@05@os%segredos%de%um%exe%pe% file%portable.#tml ./

4, 5omparaDes com sinal, "m seguida segue uma tabela com todas as comparaLes com sinal e o valor de cada !lag.

6, 5omparaDes menos comuns baixo segue uma listagem de algumas comparaLes menos comuns e o valor de cada !lag.

*ara despoletar cada uma das instruLes acima mencionadas, a CPU analisa de forma individual as !lags da tabela, e verifica o bit que elas arma!enam. Consoante o seu valor disparado o respetivo salto .$ump/. "m seguida apresentada a tabela de !lags do assembly. ?, Flags

1egenda' ;F > Flag de ;inal, MF > Flag de Mero, AF > Flag Au#iliar, PF > Flag de Paridade, 5F > Flag de Carry, Convm lembrar que existem muitas mais, mas estas so as usuais.

T%pico ?' InstruDes 1%gicas


Completando a famlia das instruLes do assembly, existe um tipo de instruLes que ainda no foram discutidas no artigo, as instruLes lgicas. "las so bastante usadas. "m seguida segue uma tabela com as seguintes intruLes.

"ste tipo de instruLes so vistas com frequ9ncia antes das instruLes de comparao . CMP/. *or ve!es, existe a necessidade de as efetuar. 'as instruLes listadas, a mais frequ9nte costuma ser o XOR.

T%pico $' Implementao de um programa e sua anNlise


, presente tpico apresenta a implementao de um pequeno exerccio exemplo na linguagem assembly. ntes de avanar com problemas concretos de engen#aria reversa, convm lidar e praticar exerccios deste tipo, de forma a calcificar o con#ecimento adquirido at este ponto. 8este sentido, foi proposto o famoso exerccio %ello &orld, onde cada passo devidamente comentado. *ara a sua implementao usado o so!t'are referido no incio do artigo. &, 5riar um novo proOeto no mu!"#!$, *ara a criao de um novo projeto neste ambiente de desenvolvimento e emulador, apenas necessrio aceder ao menu file H new e selecionar a opo exe template. *odia ser escol#ido um !m template, mas como os prximos tutoriais de engen#aria reversa so perante fic#eiros executveis ..exe/, foi optado o seu uso neste mini tutorial. :egue uma imagem abaixo a demonstrar esse processo.

2, 5%digo gerado por de*eito, Consequentemente & criao do fic#eiro, o "(E ."ntegrated de)elopment en)ironment / gera algum cdigo por defeito, nomeadamente as secLes do assembly. "ste foi um assunto que no foi mencionado no artigo, visto no #aver grande necessidade em fa!9%lo. :er discutido sem grande detal#e abaixo. "m seguida apresentada a janela de cdigo gerada pelo "(E.

Como fcil de perceber, o "(E comentou o local onde ser escrito o cdigo. ntes de mais, foi feito um comentrio &s lin#as geradas, por forma a perceber todas as instruLes. :egue a imagem em seguida.

, presente fic#eiro segue ento a configurao padro de qualquer fic#eiro vulgar escrito em assemblN. :egue abaixo um prottipo ainda mais base.

,bservando%o fcil criar uma relao com o projecto gerado pelo "(E. *ara os mais curiosos segue em seguida uma listagem a descrever cada uma das secLes. a9 7F;; P ( 'i! a C*$ como organi!ar o segmento. b9 EF7 1 ( 'eclara o modelo a usar. .*oder explorar mais sobre este ponto se ac#ar necessrio./ c9 ;TA5Q ( Cual o taman#o de pil#a a alocar. d9 7ATA ( , que vai conter o segmento de dados. e9 5F7 ( , que vai conter o segmento de cdigo. *9 ;TA(T( Encio do cdigo. g9 :7 ;TA(T( Kim do cdigo. *osto isto, esto lanados os ingredientes para fa!er o bolo, neste caso, escrever o cdigo exemplo.

Koi criada uma subfuno Rproc' com o cdigo acima. *enso no ser necessrio estar a referir cada uma das lin#as, pois elas esto comentadas.

*or fim, de maneira a organi!ar o documento foi c#amada a subfuno atravs da instruo C"##, como j tin#a sito estudado uns tpicos acima. ntes de terminar, convm referir que este artigo de caracter importantiss.mo para os prximos artigos sobre engen#aria reversa. "m anexo disponibili!ado o projecto ,asm para doBnload, Doa continuaoS >isite( in*ptavares,blogspot,pt