Vilarejo PK2P
Bem-vindo ao fórum Vilarejo PK2P! O fórum oficial do canal Press Key to Play do Youtube!

Participe do fórum, é rápido e fácil

Vilarejo PK2P
Bem-vindo ao fórum Vilarejo PK2P! O fórum oficial do canal Press Key to Play do Youtube!
Vilarejo PK2P
Gostaria de reagir a esta mensagem? Crie uma conta em poucos cliques ou inicie sessão para continuar.

Grupo para reunir as pessoas que acompanham os vídeos no canal Press Key to Play e discutir os assuntos abrangidos pelo Blog PK2P.

Últimos assuntos

» RPG de Mesa: A fronteira Volume 4: O Castelo Owlrick. (D&D5e)
por Ariano 10/12/2020, 23:18

» [tutorial] hash em C/C++ com openssl
por kodo no kami 21/9/2020, 13:37

» ping lista grafico
por kodo no kami 24/7/2020, 07:53

» [Discord] Campanha de RPG D-cyber
por Jonatan15 17/7/2020, 11:11

» [tradução] 1869 (msdos)
por kodo no kami 26/6/2020, 13:43

» [source] exemplo filtro mediano
por kodo no kami 1/6/2020, 00:24

» [tutorial] criar filtro nas imagens (python)
por kodo no kami 22/5/2020, 19:29

» Wireless IDS Sagemcom
por kodo no kami 22/4/2020, 23:50

» [source] detectar dispositivos no wifi (sagemcom)
por kodo no kami 9/3/2020, 20:25

» [tutorial] wla assemblador (65xx, 68xx, z80, 8008, 8080 e huc6280)
por kodo no kami 2/2/2020, 16:42


Você não está conectado. Conecte-se ou registre-se

[tutorial] breakpoint com int3

Ir para baixo  Mensagem [Página 1 de 1]

kodo no kami

kodo no kami

bom galera muitas vezes precisamos debugar o nosso programa, e muitas vezes essa debugação é bem trabalhosa, as vezes necessitando localizar determinado endereço na memoria para conseguir colocar um breakpoint naquela parte que vamos analisar. Uma forma bastante simples de colocar um breakpoint sem precisar ficar lendo instruções do nosso código na memoria é pela interrupção 3 (int 3). O int 3 é um breakpoint da própria arquitetura x86, então tambem existe um código binário próprio para chamar o int 3. Temos que ficar ciente também que não é possível chamar o int 3 fora de uma debugação, vai crashar o programa. Uma forma da gente usar o int 3 é via asm inline chamando a instrução int com o valor 3

Código:
#include <stdio.h>

int main(void){
   printf("exemplo int3\n");
   __asm__("int $0x3");
   printf("by kodo no kami\n");
}

podemos colocar vários int 3 no nosso código, a cada trecho que a gente precisar

Código:
#include <stdio.h>

int main(void){
   printf("exemplo int3\n");
   __asm__("int $0x3");
   printf("by kodo no kami\n");
   __asm__("int $0x3");
}

se a gente executar esse programa fora do debugador vai dar erro

[tutorial] breakpoint com int3 Zrb2dJ8

por outro lado se ele for aberto em um debugador e executado la dentro vai parar exatamente no primeiro breakpoint

[tutorial] breakpoint com int3 TjbrpCJ

depois disso bastaria continuar a execução

[tutorial] breakpoint com int3 BOQKvOk

o mesmo poderia ser feito em outro debugador tambem, não necessariamente precisaria ser o gdb

[tutorial] breakpoint com int3 4dcr19H

como também é possível fazer em outras linguagens ou IDEs, como exemplo o delphi

Código:
procedure TForm1.Button1Click(Sender: TObject);
begin
  asm
     int $3
  end;
end;

[tutorial] breakpoint com int3 ExY1VYR

outra forma da gente usar ele, é colocando o byte equivalente ao int 3, sendo que esse byte é o codigo hexadecimal 0xcc

Código:
#include <stdio.h>

int main(void){
   printf("exemplo int3\n");
   __asm__(".byte 0xcc");
   printf("by kodo no kami\n");
   __asm__(".byte 0xcc");
}

existe uma diferença entre usar a instrução "int 0x3" e colocar diretamente o byte 0xcc. Essa pequena diferença entre os dois são apenas no byte gerado, ja o resultado final é o mesmo ou seja um breakpoint no nosso codigo. Quando colocamos 0xcc vai ter apenas um byte para o breakpoint int 3, quando usamos a instrução "int 0x3" vai gerar dois bytes sendo um equivalente a instrução "int" (0xcd) e o outro equivalente ao valor 0x3 (0x3). Sendo assim também é possível conseguir essa mesma interrupção adicionando os bytes 0xcd e 0x03 no lugar do 0xcc

Código:
#include <stdio.h>

int main(void){
   printf("exemplo int3\n");
   __asm__(".byte 0xcd,0x03");
   printf("by kodo no kami\n");
   __asm__(".byte 0xcd,0x03");
}

no windows existe a função DebugBreak que funciona de forma semelhante

Código:
#include <stdio.h>
#include <windows.h>

int main(void){
   printf("exemplo int3\n");
   DebugBreak();
   printf("by kodo no kami\n");
   DebugBreak();
}

também podemos usar a função IsDebuggerPresent no windows para saber se o programa está sendo debugado

Código:
#include <stdio.h>
#include <windows.h>

int main(void){
   printf("exemplo int3\n");
   if(IsDebuggerPresent()){
 DebugBreak();
   }
   printf("by kodo no kami\n");
   if(IsDebuggerPresent()){
 DebugBreak();
   }
}

já no linux uma função semelhante ao DebugBreak é o __buitin_trap

Código:
#include <stdio.h>
#include <unistd.h>

int main(void){
   printf("exemplo int3\n");
   __builtin_trap();
   printf("by kodo no kami\n");
   __builtin_trap();
}

[tutorial] breakpoint com int3 FngdYP6

bom galera a interrupção 3 é utilizada muito para debugação dos programas ou ate mesmo na criação de um debugger, embora tambem seja bastante utilizada de forma maliciosa em malwares para criar hooks e anti-debuggers ^^

by kodo no kami

https://eofclub.in/forum

Ir para o topo  Mensagem [Página 1 de 1]

Permissões neste sub-fórum
Não podes responder a tópicos