u c
âccuucc
Muita gente se pergunta do porquê de usar um debugger,
sendo que na maioria dos casos você tem a acesso ao código fonte
original (caso você tenha programado o aplicativo). Vou citar abaixo
algumas das maiores utilidades de um debugger:
å åu åu
Para entender o funcionamento de um debugger é preciso
saber um pouco sobre alguns conceitos ligados a informática, como o
funcionamento da memória, processador, pilhas e endereços. O
conhecimento básico de assembly também é necessário, já que essa
é a linguagem que teremos de analisar. Caso não tenha experiência
em assembly, fique tranqüilo, pois nos capítulos seguintes darei uma
visão geral sobre ela, o suficiente para entender o nosso mini-
aplicativo de estudo. Abaixo segue uma breve lista de conceitos:
yV
" Local de armazenamento temporário de dados
(são apagados ao desligar o computador). rodo aplicativo se
utiliza da memória para armazenar seus dados e estes são
buscados e gerenciados pelo processador.
yV #
" É uma faixa de valores que
apontam para uma determinada posição de memória. roda vez
que você escreve ou lê algum dado da memória é necessário
indicar o endereço de onde está aquele valor, para que o
processador possa buscá -lo.
cïcå(
Para fazer o debug de binários compilados é necessário ter um
conhecimento (ao menos básico) da linguagem assembly, já que é
para ela que a linguagem de máquina é traduzida.
Código:
MOV EAX,1
Código:
B801000000
Código:
voidmain() {
int a = 4;
int b = 6;
int c;
Código:
00000000MOVEAX,4h ;move o valor 4 para EAX
00000005MOVEBX,6h ;move o valor 6 para EBX
0000000ACMP EAX,4h ;compara EAX com 4, se for verdadeiro: ZF = 1
0000000DJNE 00000019h ;se ZF != 1, pule para endereço 00000019h
0000000FCMP EBX,6h ;compara EBX com 6, se for verdadeiro: ZF = 1
00000012JNE 00000019h ;se ZF != 1, pule para endereço 00000019h
00000014MOVECX,5h ;move o valor 5 para ECX
00000019RErN ;finaliza execução e retorna
ï c cm
css s
cm
m ssm
scm
cm s s s çss
ç s(mmcs)
s s s m cs c
ms
ms s
m s s s css s
32 s ss
m scm s s 32 s
cm
s: C ï ï ï
cmc
msss s sss
m m
ç ms s
scss! m
s !s s s
!s cm s s
"s #c
c
m c"
s m s m s s s
$ % m
s ms (s
s
s%
!/mc) &m s ï
s sm
m c s
ss% c s s
ç s
m ç "m s
ç s
s cmm
c m
m$s mç
m ç
sss s s ss s s 32 s '
m
m
ss
! s8
16scmms
!cmm( s
s s sm
m):
m s s s m
m sm s F s
s
s
!scm s
çs(
s
m) s s
ss cm
%s cc
m s
ç s cm CMï s ss s s ms
c
ss:*F (* F ) CF (C F ) F( F )
*F
s sm
m ç s
m ! (
m
cm ç s &m s
s cm CMï s
s
s s sm s s *F cs s
s
ç s+ ! c s
s) CF
s
s
m ç s
m%m
cm s /c sm cs s ( ,)
Por último, tempos a SF, que é ativada sempre que o bit mais
significativo de um operando for 1, indicando um valor negativo
(pesquise sobre complemento de dois).
Código:
00401000MOV BYrE PrR DS:[00403000], 09h
yV ®ï endereço
JMP 00401008h
yV ® endereço / ® endereço
JE0040101Ah
yV ® endereço / ® endereço
JNZ0040102Ch
yV ïc* valor
PUS) 08h
yV ïï destino
POP EAX
yV å local
CALL User32!GetDlgutemrextA
CALL0040115Fh
http://www.numaboa.com.br/informatic...ncias/opcodes/
u å(c
http://www.fergonez.net/files/adivinhe.rar
s
m
s s
$://,,, - m
css sç
s c&
ms
s
c m
s
sssmc
m
c
s:
yV
å
± ss s ms ç
s
s
ç/s ( s ms s ss çm +
meu artigo sobre o funcionamento dos executáveis). Você pode
reparar que os endereços não são em intervalos iguais para
cada instrução. usso ocorre devido ao fato de que o tamanho
das instruções ser variável, como podemos observar na
segunda coluna.
.+
Essa área mostra todos os registradores e flags que nós vimos
anteriormente (juntamente com diversos outros valores). A cada
instrução essa tela é atualizada, mostrando o estado atual de cada
um dos itens. Caso algum desses itens tenha sido modificado de uma
instrução para outra, o Olly as colore com outra cor (nesse caso é o
vermelho). As flags são mostradas logo abaixo dos registradores,
abreviadas com a letra C (CarryFlag), Z (Zero Flag) e S (SignalFlag).
.,
Essa região nos mostra a memória física (RAM) destinada ao
aplicativo. É possível observar o valor de cada byte de memória
sç s c - cms 0s
c
s:
yV
å
± ssMs s çs
smm"
yV
å
± )
m s sç c
m c
mm" ï cc 8s $
ss !c
çsc sc8m8s
yV
å
±CIIssc
s
!
ms ss scsmm" ï
sç CII sss s
m sç s
!
m
s
yV
å
± ss C
m msm s
s
c
s ç'-s
çc sc
m
sscsç$
c
m
1.(4s)
yV
å
± #
# m!
ç
$
yV
å
± Cmm 2! cm% s ms
mç/s ss
çc
sss$(cm çs )c
sss mç/sc
cm% s
m s /s "s ms ms:
msc çcs
ï6u
F m cm
ms ï ms m c
ç ms m
cc $ s
!
çMss :
ï c
s
ms 3 c$ms
ç
Mss ï c
m
ss c
m
c0 c &m
s
(
"ssms)
c0 &m
c0 cm
m scc Iss
c m
m ms 0s 0cs s
Ms m s
!s 0sc$ms
Cm mc m ss m
s !
c
mc
m cm ç(s
ms m
sm s
c) ï c cm ç c
m-s
! ssm
s
s msmsm
s c" cm Ms m
!
m
c3 c
css m s c" sm sm
Cm ss c
m
c %c c$ c
m ms
mss c3 c !m
ss
% s
ç/s
+
m çc" s
ms
! s 0cs s ss s
ç ï
c$
ms m m
m
m
s+%
%" cs :
5
!!!!" Iss s % m c
s:
Fms s
ç 00401061 m
s
m s ('* ). $00401079) m
sms m "m c cm ç .m sms
s s $s
cm s ms
m c$m
ç# (
sc
m c
mm
+
ss cs
m c ) m! m
(ss
ç
m ) m s
ms:
cm cm &m 4 s s m s
m
ms m
s%ms
m4
m cc &m 4c
m$ s
s
?
c ms c cm ç cs70c &m
cm
cm
Esse código asm seria gerado basicamente por uma estrutura
semelhante a esta, em um pseudocódigo:
Código:
Declara variável inteira X;
X = Número contido na caixa de texto;
Se X < 1 ou X > 20 Então
Exibe mensagem de texto ³Número unválido´
Fim Se
Se X = 4 Então
Exibe mensagem de texto ³Parabéns´
Caso Contrário
Exibe mensagem de texto ³Você Errou´
Fim Se
'
ç 8 ImI
! cm
sc%msï sc c
s-s
!
msm m
s cc cm
sc 3 cc s
c
c
ç m
m &m cc
4
c$m
ç c
cs % c$m
cm
cçcmms m
c
m s m
s s
0cs
ms !/s:
m s
m "m
m "m
ssm Cmm
m
ss c" mm
!
s sm
çscm m ssm
çs
c0 !c" cmss+%+ $ $
ï$ (/)
#ms cm ms mc c" -s
ssc
%(m
& c ç
s)
. ss
cs s+ c$ 's
c
s s sc
ms
m
c s
cm
ss c s ms !
m
mcç msm
sm ms m
#c0c
ï mc sssm s cc s $
s+ c Ü/% Iss % cm
m
+s cm
mcc0ssc s
ç
s+cc c
ss +
s
s
CMï 1
ms
-cc
cs
msssms m
cmçm s scs ( ï2) 0 c!
ç00401063)
' c
c0 cm s
ç m
ssm
s+s
s
Css
ç
"s s ms
s+m (ms)
s
ç s
s
sss
s ss s
ç 'ï
! $
m
çssm
m s
css cm
(cscsç#$$9ï s+sc
c )
m s
s cc m ssm c m
mcç #c0
c
cm m$
mc'm
m
s
mcm
'ï"ssc
sscs 1
m
cm
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.
ïcu
u
* Ar4RE
%
* Gigapede
* S)aG
http://www.tuts4you.com/download.php?list.53
ï
V
* Joe Stewart
å
* Gigapede
* arjuns
3
* henryouly
Código:
[Colours]
Scheme[*]=0,12,8,18,7,8,7,13
Scheme name[*]=Fergo
[Syntax]
Commands[*]=15,4,10,10,9,10,112,13,111,8,12,0,0,0
Operands[*]=1,11,11,11,2,2,4,4,0,0,0,0,0,0
Schemename[*]=Fergo