Ð 12:33:23pm +0300 ÐÐ 30 ÐÐÐ 2004Ð, Aleksander Valchev ÐÐÐÐÑÐ:
> ÐÑÐÐÐÐÐÐ ÐÐ Ð ÐÑÐÐÑÐÐÐÐ (Ð/Ð++) ÐÐ ÐÐÑÐÐÐÐÐÑ
> ÐÐÐÐ ÐÐÐÐÐ ÑÐÐÐ Ð "binary
> executable"?
> ÐÐÐÐ ÐÐ ÐÑÐÐÐÐÐ ÐÐÑÐ ÐÐÑÐ file(1). Ð `man file` ÐÐÑÐ, ÑÐ
> ÐÑÐÐÐ "binary
> executable" ÑÐÐÐ ÐÐÐ "magic number" ÐÑÐÑÐÐ Ð ÐÐÑÐÐÐÑÐ ÐÐ
> ÑÐÐÐÐ Ð ÐÐ ÑÐÐÐ ÑÐ
> ÐÐÑÐÐÐÐÑ ÐÐÐÐ Ð ÐÐÐÑÐÐÐÐ. ÐÐÐ ÐÑÐÐÐ ÐÐÐÐ ÐÐ
> ÐÐÐÐ ÐÑÐÐÐÑÐ ÐÐÐÐ...
ÐÐÐÐ, ÐÐÐÑÐ ÑÐ ÑÑÑÐÐÐ Ð ÐÐ ÐÑÐÐÐÐÐÐÑ
ÑÐÐÑÐÑÐÐÐÑÐÑÑÐ ÐÐ ÑÐÑÐÐÑÐ ÐÐ
ÐÐÐÑÐÐÐÐÐ ÑÐÐÐÐÐÐ ELF[1]. Ð ÑÐÐÑÑÐ ÐÐ ÐÐÐÑÐÐÐÐÐÑ
ÑÐÐÐ ÑÐ ÐÐÐÐÑÐ
ÐÐÐÐÑÐÑÐÐ ÑÐÐÐÐÑÑÑÐ, ÐÐÑÑÐ ÑÑÑÐÐÐ ÐÐ
ÐÑÐÐÐÑÐÑ[2]. ÐÑÐÐÐÑÐÐ Ð ÐÐÐÐ
ÑÐÐÐÐÐ ÐÐÐÐÐÑÑÑÐÑÐÐÐÐÐ ÐÑÐÐÑÐÐÐÐ :)
[1] http://www.caldera.com/developers/gabi
[2] http://www.caldera.com/developers/gabi/latest/ch4.eheader.html#elfid
ÐÐÐÐÑÐÐÐ,
ÐÐÐÑÐÑ
--
Linux is for those who hate Windows.
FreeBSD is for those who love UNIX.
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>
#include <elf.h>
int check_elf(int fd)
{
Elf_Ehdr ehdr;
int ret;
ret = read(fd, &ehdr, sizeof(Elf_Ehdr));
if(ret == -1 || ret < sizeof(Elf_Ehdr))
return -1;
if(ehdr.e_ident[EI_MAG0] != ELFMAG0 ||
ehdr.e_ident[EI_MAG1] != ELFMAG1 ||
ehdr.e_ident[EI_MAG2] != ELFMAG2 ||
ehdr.e_ident[EI_MAG3] != ELFMAG3)
return -1;
return 0;
}
int main(int argc, char **argv)
{
char *files[] = { "/bin/ls", "/etc/motd" };
int fd;
fd = open(files[0], O_RDONLY);
if(fd == -1)
return 1;
if(check_elf(fd) == -1)
printf("%s: not an ELF executable\n", files[0]);
else
printf("%s: an ELF executable\n", files[0]);
close(fd);
fd = open(files[1], O_RDONLY);
if(fd == -1)
return 1;
if(check_elf(fd) == -1)
printf("%s: not an ELF executable\n", files[1]);
else
printf("%s: an ELF executable\n", files[1]);
close(fd);
return 0;
}