terça-feira, 7 de abril de 2009

Transformando arquivos com zeros e uns em executável


Contador de acessoVisitas


Postei aqui anteriormente o viewbin, que transformava um arquivo binário, executável em uma seqüência binária de 1's e 0's.
Agora estou postando o oposto, um programa que transforma esse arquivo seqüencial de uns e zeros em um executável.

De posse dos 2, é possível transformar um executável em seqüência binária, alterar o arquivo em um editor de texto e voltar o arquivo para executável.

A idéia desses programas é fornecer ferramentas para estudo do formato ELF, para entendermos e criarmos um vírus didático para linux. É uma evolução do artigo já postado por mim sobre criação de vírus para linux.

Segue o código.


/* bintoexe.c */

#include

char bitToByte (char* bin);

int main (int argc, char* argv[])
{
   FILE *arq;
   FILE *arqDest;
   char buf[2];
   char byte[8];
   int contBit=0;
   unsigned int f;

   if (argc!=3)
   {
      printf ("Parametro incorreto.\n");
      printf ("Informe o nome do arquivo a ser convertido e o nome do arquivo de destino\n");
      return 1;
   }

   if (!(arq=fopen(argv[1],"r")))
   {
      printf ("Nao foi possivel abrir o arquivo %s!",argv[1]);
      return 1;
   }

   if (!(arqDest=fopen(argv[2],"wb")))
   {
      printf ("Nao foi possivel criar o arquivo %s!\n",argv[2]);
      return 1;
   }

   while (f=fread(buf,1,1,arq))
   {
      if ((buf[0]=='1') || (buf[0]=='0'))
      {
         byte[contBit] = buf[0];
         contBit++;
         if (contBit == 8)
         {
            buf[0] = bitToByte (byte);
            f=fwrite(buf,1,1,arqDest);
         }
      }
      /* o programa ignora qualquer sequencia que seja diferente de 8 zeros ou uns consecutivos */
      else
      {
         contBit = 0;
      }
   }
   close (arq);
   close (arqDest);
   printf ("\n");
}

char bitToByte (char* bin)
{
   char r=0;
   /* faz um OR do r com as posições dos bits do mais ao menos significativos */
   if (bin[0]=='1') r |= 0x80;
   if (bin[1]=='1') r |= 0x40;
   if (bin[2]=='1') r |= 0x20;
   if (bin[3]=='1') r |= 0x10;
   if (bin[4]=='1') r |= 0x8;
   if (bin[5]=='1') r |= 0x4;
   if (bin[6]=='1') r |= 0x2;
   if (bin[7]=='1') r |= 0x1;

   return r;
}

Um comentário:

Advogados
Visitas