Posts tagged ‘linguagem C’

04/10/2010

Brincando com o Editor HT

por Alex.S.R

HT é um editor de executáveis distribuído sob a licença GPL. Pode ser baixado tanto para Linux quanto para Windows no seguinte link:

http://hte.sourceforge.net/downloads.html

Bom, nesse tutorial vamos criar um programa bem simples na linguagem C e depois usando o HT vamos editar o binário modificando algum texto que é exibido.

Obs: Embora esse tutorial tenha como foco a plataforma Linux, se o leitor tiver um pouco de conhecimento de como compilar na plataforma Windows conseguirá acompanhar. Toda a parte feita no HT acredito que seja igual (embora não tenha realmente testado).

Primeiramente vamos instalar o HT.

Instalando o HT no Linux (Repositório Debian)

O HT já está nos repositórios do Debian (acredito que esteja em outros também) então basta usar o apt.

Agora com o HT instalado vamos criar no nosso pequeno programa.

Programa

O nosso programa vai ser bem simples e como já dito anteriormente vai ser em linguagem C, ele apenas vai exibir na tela a mensagem “Blog ASRTech!”. Abra um editor de texto qualquer e digite o seguinte código (ou baixe o arquivo prog.c):

1
2
3
4
5
6
7
8
9
//www.asrtech.wordpress.com <--- entre e comente!
#include <stdio.h>

int main()
{
   printf(Blog ASRTech!\n);

   return 0;
}

Salve como prog.c e compile com o gcc.

Vamos executar o nosso programa para ver a saída.

Agora nós temos dois arquivos, como pode ser visto na figura abaixo.

O prog é o nosso binário e o prog.c é o nosso código fonte, ou seja, se quisermos modificar o nosso programa temos que editar o código fonte e compilar novamente. Mas e se nós não tivéssemos o código fonte? Não poderíamos modificar? Ai é que entra o editor de binários HT. Mas que já fique claro que não é tão fácil quanto editar o código fonte e compila-lo novamente (embora seja um exemplo bem simples). Também não vou entrar em questões de legalidade.

Vamos excluir o nosso código fonte.

Agora só temos o arquivo prog que é o nosso binário. O nosso objetivo agora é modificar a mensagem exibida na tela de “Blog ASRTech!” para “OK!”.

Obs: Nos passos a seguir não entrarei em muitos detalhes sobre cada passo.

Primeiramente vamos abrir o binário com o HT.

Obs: Embora o programa se chame HT o comando é hte.

A seguinte “tela” será exibida (para uma total identidade com os prints do tutorial recomendo usar o arquivo fonte que disponibilizei).

A primeira “tela” parece um caos, vários números aparentemente sem significados. Não se assuste, vamos dar uma melhorada nisso, para ficar mais fácil de nós entendermos. Aperte F6 e selecione com as teclas direcionais “elf/image” e de enter.

Agora a tela ficará da seguinte forma:

Agora já deu uma melhorada, podemos identificar alguns caracteres que fazem sentidos para nós (humanos). Não vou explicar linha por linha, pois, fugiria completamente do foco do tutorial. Se quiser saber mais estude assemble.

Bom agora que a gente “consegue ler” o código precisamos achar a função main. Para isso vamos apertar F8 e selecionar “main” (na coluna nome). Depois pressione enter.

Depois de apertar enter vamos ser direcionado para a tela abaixo.

Dando uma olhada na função main podemos ver uma coisa interessante, embora não entendamos muito de assemble. Podemos ver que strz_Blog_ASRTech_8048490 tem o texto que nós queremos modificar. Utilizando as teclas direcionais vamos selecionar esse trecho e dar enter.

Agora fomos direcionado para a parte que contém o texto.

Bom agora vamos apertar F4 para entrar no modo de edição.

Repare que agora no inicio da linha que tem a mensagem apareceu vários números, na verdade o que vamos modificar é esse número, que é o valor em hexadecimal de cada letra. Então precisamos saber qual é o valor em hexadecimal do texto que queremos colocar no lugar, que é “OK!”. Vamos dar uma olhada na tabela ASCII para descobrir qual é o número:

O nosso “OK!” fica assim:

  • O = 4f
  • K = 4b
  • ! = 21

Então temos que colocar 4f4b21 nos números que apareceram quando apertamos F4. Usando as teclas direcionais navegamos até o primeiro número, que no caso é 42 e modificamos para 4f e assim por diante. Note que conforme você modifica o texto vai sendo modificado, então é fácil saber se está modificando para o texto certo ou não.

Mas e agora? A mensagem ficou “OK!g ASRTech!”. Para deixar somente o “OK!” basta inserir 0 para o resto dos números.

Obs: Note que o novo texto tem que ter no máximo o mesmo tamanho do antigo. Ainda não sei como faz para adicionar um texto maior. Quem souber deixe um comentário.

Agora que já modificamos o que queríamos vamos salvar apertando F2 e logo em seguida F10 para sair do HT.

Agora basta executar o nosso arquivo prog para conferir o resultado.

Vídeo Complementar

Click aqui para assistir o vídeo.

Pronto, conseguimos modificar o nosso programa pelo binário.

Até mais.

Alex.S.R.

29/09/2010

Linguagem C – %d vs %i

por Alex.S.R

Desde que começei a aprender a linguagem C na faculdade aprendi que tem dois especificador de formato para o tipo de dado inteiro (int no caso da linguagem C), o %i e o %d.

Sempre me disseram que eram iguais. Até ai tudo bem, na verdade nunca tive problemas com isso até que, já em outra faculdade (que o professor só ensinou o %i) tive um exercício que descobri que existe diferença entre os dois. Era um programa que a pessoa entrava com o dia e mês do seu aniversário no formado ddmm e a saida era o signo da pessoa (sem comentários)

Obs: Não era preciso tratar validação de dados.

Primeiramente fiz com o %i, segue o código:

#include <stdio.h>

int main()
{
   int data, mes, dia;
   
   printf("Informe o dia e o mes do seu nascimento (ddmm): ");
   scanf("%i", &data);
   
   dia = data / 100;
   mes = data % 100;
   
   if((mes == 1 && dia >= 21) || (mes == 2 && dia <= 18)){
      printf("Aquario\n");
   }
   else if((mes == 2 && dia >= 19) || (mes == 3 && dia <= 19)){
      printf("Peixes\n");
   }
   else if((mes == 3 && dia >= 20) || (mes == 4 && dia <= 20)){
      printf("Aries\n");
   }
   else if((mes == 4 && dia >= 21) || (mes == 5 && dia <= 20)){
      printf("Touro\n");
   }
   else if((mes == 5 && dia >= 21) || (mes == 6 && dia <= 20)){
      printf("Gemeos\n");
   }
   else if((mes == 6 && dia >= 21) || (mes == 7 && dia <= 21)){
      printf("Cancer\n");
   }
   else if((mes == 7 && dia >= 22) || (mes == 8 && dia <= 22)){
      printf("Leao\n");
   }
   else if((mes == 8 && dia >= 23) || (mes == 9 && dia <= 22)){
      printf("Virgem\n");
   }
   else if((mes == 9 && dia >= 23) || (mes == 10 && dia <= 22)){
      printf("Libra\n");
   }
   else if((mes == 10 && dia >= 23) || (mes == 11 && dia <= 21)){
      printf("Escorpiao\n");
   }
   else if((mes == 11 && dia >= 22) || (mes == 12 && dia <= 21)){
      printf("Sargitario\n");
   }
   else if((mes == 12 && dia >= 22) || (mes == 1 && dia <= 21)){
      printf("Capricornio\n");
   }
      
   return 0;
}

Quando tava testando o programa vi que se eu entrasse com algum dado que não começasse com 0 funcionava e se entrasse com 0 não funcionava. Fiquei encucado com isso, era claro que era o 0 que estava causando problemas.

Na cagada resolvi usar o %d (linha 8) e pra minha surpresa funcinou com todos os dados!

Ai eu fiquei encucado com isso, pois, eu sempre pensei que os dois fossem iguais, mas agora descobri que não eram, só que não sabia qual era a diferença.

Na faculdade alguns amigos disseram que o %i desprezava 0 e várias outras coisas. Até que um colega disse o certo, usando o %i ele da a possibilidade de trabalhar com números em outras bases numericas e começando um número com 0 ele subentendia que era um número octal. Já o %d (d de decimal) só aceita números na base decimal.

Fiz um pequeno programinha para testar se isso era verdade. Para octal entre com 0 na frente do número e para hexadecimal entre com 0x na frente do número.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#include <stdio.h>

int main()
{
   int n1, n2;

   printf("Informe um numero: ");
   scanf("%i", &n1);
   printf("Informe outro numero: ");
   scanf("%d", &n2);

   printf("Numero do %%i: %i\n", n1);
   printf("Numero do %%d: %d\n", n2);
   
   return 0;
}

O programa recebe 2 números, sendo um com o %i e outro com o %d(insira numeros começando com 0 e pra ficar mais facil a visualização o mesmo número para os dois) e depois exibe os números recebidos.

Por exemplo: Se inserirmos 010 no primeiro e 010 no segundo vai ser entendido da seguinte forma:

  • Primeiro %i: recebe 010 = (10) em base octal, que é igual 8 em base decimal
  • Segundo %d: recebe 010 = (10) em base decimal

Logo a saida será:

Numero do %i: 8
Numero do %d: 10

Se alguém souber mais sobre isso comente.

Até mais.

Alex.S.R