Introdução Introdução ao Assembly Caríssimos leitores, o presente artigo pretende expor um pouco dos segredos desta linguagem de baixo nível, aquela mais próxima do código máquina. Como fator de motivação, é sabido que quando existe a necessidade de perceber o funcionamento de um executável, por exemplo um jogo de comput computado adorr, a solução solução passa passa pela pela anális análisee do assembly. partir dele, é possível alterar e personali!ar seus seus processos e procedimentos, mas existe a necessidade necessidade de de compreensão do código. "ste artigo não tem objetivo de aprofundar a matéria, apenas oferecer uma introdução de modo a facilitar a compreensão dos artigos de enge#aria reversa do presente blog .
Assembler ou Assembly?
ntes de mais convém esclarecer os conceitos de assembler e e de assembly. $m erro muito comum nos nos indí indívi vidu duos os experts em inform informát átic ica, a, é fala falare rem m de assembler referindo%se & linguagem de programação, mas não, assembler é é o nome dado ao programa de computador que gera o fic#eiro binário apartir do código código assembly. Programa para desenvolve desenvolverr e compila compilarr 'e uma forma ainda mais simplificada simplificada,, assembler ( )Programa assembly), assembly ( )é o nome dado à linguagem de programação). Ferramentas de Trabalho para o Artigo -mu -mu !"#!$ !"#!$(
$m $m assembler para criação do código%fonte. *ossuí uma excelente interface e diversos módulos para debbuging .
T%pico &' (egistos 'e uma forma geral, pode pode di!er%se di!er%se que que o assembly usa variáveis globais. "stas variáveis são +teis para a c#amada c#amada de vários processos, processos, como por exemplo( do teclado,) % ))eri*icar se o utili+ador digitou algo no buffer do de sa.da para o monitor,) % )In*ormar o sistema ue é pretendido escrever no buffer de
"stes "stes são os dois casos casos mais mais simple simpless e fáceis fáceis de perce perceber ber,, na verdade, verdade, isto é um tudo tudo mais mais complicado. s registos mais importantes e comuns são os listados em seguida. &, A/ % acumulador. Compreende A0 e A1, os bytes alto bytes alto e bai#o de A/. 2, 3/ - base. Compreende Compreende 30 e 31, são usados como apontadores registos.
4, 5/ - contador. Compreende 50 e 51, é usado genéricamente em ciclos iterativos loops/. 6, 7/ - deslocamento, este é similar aos registos base 8 BX BX 9. Compreende 70 e 71.
"stes registos são definidos como gerais, pois permitem arma!enar informação. Convém salientar que são são todos todos registos registos de 01 bits, portanto, portanto, significa significa que apenas apenas é possível possível guardar guardar um inteiro positivo de 2 a 13343, ou um inteiro inteiro com sinal de %45617 %45617 até 45617. Como mencioando, estes são registos de 01 bits. "m seguida uma imagem representativa.
signi*icativos de A/. cima foi dito que A0 e A1 são os bytes alto e baixo, isto é, mais e menos signi*icativos 8a verdade, ol#ando ol#ando para a imagem imagem fica fácil perceber perceber o porqu9. :endo estes registos de 01 bits, por ve!es são necessários registos de 45 bits e até 1; bits, conforme as necessidades. principio passa maioritariamente pelo mesmo conceito. "m seguida é apresentada a evolução dos registos de 01 bits para 45 bits. &, A/ 2, 3/ 4, 5/ 6, 7/
-
A/ 3/ 5/ 7/
penas existe a mudança de E , refere%se a extended , isto é, registo extendido. conceito é quase o mesmo do anterior. < possivel observar uma imagem que representa essa mudança em seguida.
=ais uma ve! parece intuitivo, isto funciona de igual forma para os outros registos. >oltando ao registo A/, que foi o escol# escol#ido ido antec antecipa ipadam dament ente, e, é propos proposto to um desaf desafio. io. :e for preten pretendid didoo arma!enar "A65h em A/ como ficará arma!enada a informação? :ota.( 8o assemby a notação usada é a #exadecimal, daí o uso do valor "A658he#adecimal9. ;olução( 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 espaço reservado disponíveis na memória. *ortanto, a junção 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. 'efinição de nibble em #ttp(@@en.AiBipedia.org@AiBi@8ibble #ttp(@@en.AiBipedia.org@AiBi@8ibble./ ./ " > 6 bits, bits, A > 6 bits, bits, 6 > 6 bits, bits, 5 > 6 bits, bits,
>isuali!ando novamente a imagem referente ao A/ e voltando a ol#ar para a solução do problema proposto, ficou claro esta subdivisão do registo na memória e o porqu9 de "A ficar arma!enado em A0. 8a verdade, "A são ! bites, o tamanho total de A0. Caso ainda presistam d+vidas, reparar no próximo caso. A0< "4h 8""""""&&9 A1< &"h 8"""&""""9
ual é o valor de A/? Dasta combinar os valores de A0 e A1. A0 = A1 < "4h = &"h &" h < "4&"h A/< "4&"h
*ara mais informação ver a tabela em( #ttp(@@pt.AiBipedia.org@AiBi@EnteiroFciGHnciaFdaFcomputaGIGJo #ttp(@@pt.AiBipedia.org@AiBi@EnteiroFciGHnciaFdaFcomputaGIGJo// s restantes registos funcionam mais ou menos dentro desta lógica. "m seguida são apresentados os registos mais importantes. , 5; - segmento de código. bloco bloco de memória onde o código é arma!enado. arma!enado. $, 7; - segmento de dados. área área na memória onde onde os dados são são arma!enados. arma!enados. @, ; % segmento extra. penas outro segmento segmento de dados. !, ;; ;; - segmento de pil#a. qui o CPU (Central Processing Unit) arma!ena
os endereços
remotos das subrotinas. &", ;I% índice de fonte. Krequentemente usado para movimentaçLes de blocos de instruçLes. "ste é um apontador que, com um segmento, geralmente ':, é usado pela CPU para 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 são registos do assembly. 8ão existe a necessidade saber todos eles, visto que não é suposto programar em assembly, apenas perceber perceber blocos blocos de assembly, nomeadamente nos próximos artigos de engen#aria reversa. Contudo, é suposto solidificar esta base de con#ecimento, tão importante no contexto da engen#aria reversa. T%pico 2' Tipos de 7ados
proveita proveitando ndo a ideia, ideia, é imporante imporante referir que no assembly, como noutra qualquer linguagem de programação, existem existem diferentes tipos de dados. s mais usuais são os seguintes. seguintes.
&, 3yte ( Conjunto de 7 bits. 2, ord( 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 InstruçDes e a Pilha
8este ponto é sabido que existem registos e diferentes tipos de dados no assembly. $ma possível possível analogia é comparar registos como prateleiras do supermercado, cada uma apenas possuí um certo tipo de produtos, mas dentro dessa produto existem diversas gamas. *ara *ara o uso dos regist registos os são necessá necessária riass instru instruçLe çLes. s. "m seguid seguidaa segue segue uma listag listagem em das mais comuns. Convém referir, que estas poderão variar entre diferentes tipos de CPU . &, E) E) Gdest Gdestin inoH oH Gvalo GvalorH rH
% MOVE . "sta "sta inst instru ruçã çãoo perm permite ite move moverr um valo valorr para para uma uma
determinada posição da memória. "x( E) A/ &4h. 'esta forma, &4h &" em decimal/ é movido para o registo A/. ntes da instrução, A/ contin#a o valor !ero, neste momento possuí &4h. < evidente que todas aquelas aquelas operaçLes feitas feitas no )Mópico0) relaciona relacionadas das com o A/, nomeadamen nomeadamente( te( )apenas )apenas foi usado o bNte mais significa significativo tivo de A/ para arma!enar o valor 04# 7 bits/), se tornam agora mais percetíveis. 2, I:T GnJmeroH %
Enterrupção. "sta instrução gera uma interrupção no sistema.
#' I:T &"h.
8este caso era gerada uma interrupção &"h 01 em decimal/. interrupção lançada depende do conte+do do registo A0, entre outras coisas. *or exemplo, se A/<&4h e a interrupção &"h fosse gerada, o vídeo modo gráfico/ seria colocado no modo 452x522x531. =ais precisamente( precisamente( A0 seria
igual a "" - selecion selecionaa a subfun subfunção ção do modo, modo, e A1 seria igual a &4h - modo gráfico 542x522x531. Contudo, se A0<2h, e a interrupção &$h fosse gerada, isso instruiria a CPU para para checar se alguma tecla pressionada estava no bu!!er do do teclado. :e A0<2h e 30 < "h e a interrupção &"h fosse gerada, então a CPU movia movia o cursor para a posição / em 71 e posição K em 70. Como é possível perceber neste momento, os registos quase que são os ingredientes para fa!er um bolo.
4, A77 GdestinoH GdestinoH GvalorH
%diciona. "sta instrução soma um n+mero ao valor arma!enado em
destino. "x( E) A/ "hO P agora é igual a 2#. A77 A/ h O P agora é igual a 3#. A77 A/ &"h O P agora é igual a 03#. 6, ;L3 GdestinoH GvalorH % :ubtrai. "sta instrução fa! o inverso da adição.
"x( E) A/ &4hO P agora é igual a 04# 0Q decimal/. ;L3 A/ h O A/ agora é igual a "h 0; decimal/. , 75 GregistoH %'ecrementa.
"sta instrução tem a função de decrementar, por exemplo, um
registo. "x( E) A/ &4hO P agora é igual a 04#. 75 A/O P agora é igual a 05#. $, I:5 GregistoH %
Encrementa. < o inverso da operação anterior.
@, 5A11 GprocedimentoH % C#ama uma subfunção.
"ra possível passar umas boas #oras a listar e descrever as instruçLes do assembly, mas tal não irá acontecer acontecer.. uan uando do existe a necessida necessidade de de perceber perceber um programa programa em assembly é necessário o analista usar a ferramenta "nternet e e procurar@perceber o que cada uma das instruçLes fa!. "stas instruçLes, como já mencionado no presente artigo, variam de CPU para para CPU , mas fa!em mais ou menos as mesmas operaçLes. -Pilhas
'uas das instruçLes que normalmente são usadas e que aparecem com regularidade em código assembly são as seguintes. &, PL;0 GregistoH % *us#, coloca algo na pil#a. 2, PP GregistoH % *op, retira algo da pil#a.
conceito de pil#a é bastante simples. *ara não entrar em demasiados detal#es é apresentada a seguinte imagem, ilustrando uma pil#a.
uando é colocado um byte na pil#a ele fica arma!enado na base da pil#a. próximo registo ficaria ;P, +ltimo byte a entrar é sempre o primeiro a sair. "ste é o conceito geral de na posição acima a ;P, pil#a e é assim que funciona através através das instruçLes instruçLes push e pop.
8a prática funciona como na listagem apresentada em seguida, com todos os passos efetuados devidamente comentados.
T%pico 6' InstruçDes e Flags
8o tópico anterior foram vistas algumas das instruçLes mais usuais no assembly, mas de forma propositada, foram deixadas duas das mais importantes, a fim de serem discutidas no presente tópico. ra!ão pela qual estas instruçLes foram descartadas do tópico anterior, foi porque estas fa!em uso de !lags. :em mais demora, estas instruçLes são o CMP comparação comparação de dois valores/ e os JUMPS saltar saltar para determinado endereço de memória o!!set //. //. "sta instrução instrução tem imensas imensas instruçLes JUMP associadas. associadas. &, 5EP A/ 3/ - Comparação. Compara o registo A/ com o registo 3/ e reflete o valor da comparação maior, menor ou igual/ nas !lags. < possível imaginar as !lags como uma uma tabela, tabela, será visto mais adiante. Como se percebe, após uma instrução de CMP é é normal que apareça um JUMP , e a lógica associada é muito simples. :e o valor da comparação *or superior, então o salto #UMP / é efetuado para determinada posição, se o valor *or menor para outra posição e por aí em diante. valor desta comparação é então arma!enado na tabela de !lags, daí a sua real importRncia. 2, 5omparaçDes sem sinal,
"m seguida segue uma tabela com todas as comparaçLes comparaçLes sem sinal e o valor de cada !lag .
8ão será exemplificado o uso destas instruçLes. "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 executável. >er >er mais mais inform informaçã açãoo no blog ( #ttp(@@infptavares.blogspo #ttp(@@infptavares.blogspot.pt@5204@05@os%segre t.pt@5204@05@os%segredos%de%um%exe%pe% dos%de%um%exe%pe% file%portable.#tml ./ file%portable.#tml ./
4, 5omparaçDes com sinal,
"m seguida segue uma tabela com todas as comparaçLes comparaçLes com sinal e o valor de cada !lag .
6, 5omparaçDes menos comuns
baixo segue uma listagem de algumas comparaçLes menos comuns e o valor de cada !lag .
*ara despoletar cada uma das instruçLes acima mencionadas, a CPU analisa analisa de forma individual as !lags da tabela, e verifica o bit que que elas arma!enam. Consoante o seu valor é disparado o respetivo $ump/. "m seguida é apresentada a tabela de !lags do assembly. salto $ump , Flags
1egenda' ;F > Flag de de ;inal, MF > Flag de de Mero, AF > Flag Au#iliar Au#ilia r, PF > Flag de de Paridade, 5F > Flag de de Carry, Carry,
Convém lembrar que existem muitas mais, mas estas são as usuais.
T%pico ' InstruçDes 1%gicas
Completan Completando do a família família das instruçLes instruçLes do assembly, existe um tipo de instruçLes que ainda não foram discutidas no artigo, as instruçLes lógicas. "las são bastante usadas. "m seguida segue uma tabela com as seguintes intruçLes.
"ste tipo de instruçLes são vistas com frequ9ncia antes das instruçLes de comparação CMP /. /. *or ve!es, existe a necessidade de as efetuar. 'as instruçLes listadas, a mais frequ9nte costuma ser o XOR. T%pico $' Implementação de um programa e sua anNlise
presente tópico apresenta a implementação de um pequeno exercício exemplo na linguagem assembly. ntes de avançar com problemas concretos de engen#aria reversa, convém lidar e praticar exercícios deste tipo, de forma a calcificar o con#ecimento adquirido até este ponto. 8este sentido, &orld , onde cada passo é devidamente comentado. *ara a sua foi proposto o famoso exercício %ello &orld implementação é usado o so!t'are referido no início do artigo. &, 5riar um novo proOeto no mu!"#!$,
*ara a criação de um novo projeto neste ambiente de desenvolvimento e emulador, apenas é necessário aceder ao menu file H new e selecionar selecionar a opção opção exe template. *odia ser escol#ido um como os próxim próximos os tutori tutoriais ais de engen engen#ar #aria ia revers reversaa são são perant perantee fic#ei fic#eiros ros !m template template, mas como executáve executáveis is .exe/, foi foi opta optado do o seu seu uso uso nest nestee mini mini tutoria tutorial. l. :egue :egue uma uma imag imagem em abaix abaixoo a demonstrar esse processo.
2, 5%digo gerado por de*eito,
"ntegrated deelopment enironment enironment Consequentemente Consequentemente & criação do fic#eiro, o "E "ntegrated / gera algum código por defeito, nomeadamente as secçLes do assembly. "ste foi um assunto que não foi mencionado no artigo, visto não #aver grande necessidade em fa!9%lo. :erá discutido sem grande detal#e abaixo. "m seguida é apresentada a janela de código gerada pelo "E .
Como é fácil de perceber, o "E comentou comentou o local onde será escrito o código. ntes de mais, foi feito um comentário &s lin#as geradas, por forma a perceber todas as instruçLes. :egue a imagem em seguida.
presente fic#eiro segue então a configuração padrão de qualquer fic#eiro vulgar escrito em assemblN. :egue abaixo um protótipo ainda mais base.
bservand bservando%o o%o é fácil criar uma relação com o projecto projecto gerado pelo "E . *ara os mais curiosos segue em seguida uma listagem a descrever cada uma das secçLes. a9 7;; ( 'i! a C*$ como organi!ar organi!ar o segmento. b9 E71 ( 'eclara o modelo a usar. *oderá explorar mais sobre este ponto c9 ;TA5Q ( ( ual o taman#o de pil#a a alocar. d9 7ATA ( que vai conter o segmento de dados. e9 57 ( que vai conter o segmento de código. *9 ;TA(T( Enício do código. g9 :7 ;TA(T( Kim do código.
se ac#ar necessário./
*osto isto, estão lançados os ingredientes para fa!er o bolo, neste caso, escrever o código exemplo.
Koi criada uma subfunção Rproc' com o código acima. *enso não ser necessário estar a referir cada uma das lin#as, pois elas estão comentadas.
*or fim, de maneira a organi!ar o documento foi c#amada a subfunção através da instrução C"##, como já tin#a sito estudado uns tópicos acima. ntes de terminar, convém referir que este artigo é de caracter importantiss.mo para os próximos artigos sobre engen#aria reversa. "m anexo é disponibili!ado o projecto ,asm para doBnload, Doa continuaçãoS >isite( in*ptavares,blogspot,pt