Linux-Bulgaria.ORG
навигация

 

начало

пощенски списък

архив на групата

семинари ...

документи

как да ...

 

 

Предишно писмо Следващо писмо Предишно по тема Следващо по тема По Дата По тема (thread)

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;
}


 

наши приятели

 

линукс за българи
http://linux-bg.org

FSA-BG
http://fsa-bg.org

OpenFest
http://openfest.org

FreeBSD BG
http://bg-freebsd.org

KDE-BG
http://kde.fsa-bg.org/

Gnome-BG
http://gnome.cult.bg/

проект OpenFMI
http://openfmi.net

NetField Forum
http://netField.ludost.net/forum/

 

 

Linux-Bulgaria.ORG

Mailing list messages are © Copyright their authors.