Re: lug-bg: C/C++ + binary executable file
- Subject: Re: lug-bg: C/C++ + binary executable file
- From: Виктор Василев <viktor@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxx>
- Date: Thu, 30 Sep 2004 12:22:18 +0200
- Mail-followup-to: lug-bg@xxxxxxxxxxxxxxxxxx
В 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;
}
|