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;
}
nossa que legal .. bom artigo
ResponderExcluir