This commit is contained in:
2025-09-05 15:22:12 +02:00
parent 495b5a4d76
commit bd007c9a69
3 changed files with 35 additions and 28 deletions

BIN
a.out

Binary file not shown.

BIN
helpelf

Binary file not shown.

63
main.c
View File

@@ -127,24 +127,23 @@ int read_elf_magic(FILE* fp)
return 0;
}
void display_elf_common(unsigned char e_ident[EI_NIDENT])
void display_elf_common(unsigned char e_ident[EI_NIDENT])
{
// EI_DATA
switch(e_ident[5])
{
// EI_DATA
switch(e_ident[5])
{
case 0x01:
printf("(LSB) ");
break;
case 0x02:
printf("(MSB) ");
break;
default:
printf("\nInvalid data encoding!\n");
exit(-EINVAL);
}
case 0x01:
printf("(little-endian) ");
break;
case 0x02:
printf("(big-endian) ");
break;
default:
printf("\nInvalid data encoding!\n");
exit(-EINVAL);
}
if (verbose)
if (verbose)
{
// EI_VERSION
printf("version %d ", e_ident[6]);
@@ -178,35 +177,36 @@ void display_elf32(struct Elf32_Ehdr* header)
printf("(unknown),");
break;
}
printf(" ");
switch (header->e_machine)
{
case 0x00:
printf("No architecture");
printf("No architecture,");
break;
case 0x01:
printf("AT&T WE 32100");
printf("AT&T WE 32100,");
break;
case 0x02:
printf("SPARC");
printf("SPARC,");
break;
case 0x03:
printf("i386");
printf("i386,");
break;
case 0x04:
printf("Motorola 68000");
printf("Motorola 68000,");
break;
case 0x05:
printf("Motorola 88000");
printf("Motorola 88000,");
break;
case 0x07:
printf("Intel 80860");
printf("Intel 80860,");
break;
case 0x08:
printf("MIPS RS3000");
printf("MIPS RS3000,");
break;
case 0x09:
printf("MIPS RS4000");
printf("MIPS RS4000,");
break;
default:
printf("Unknown architecture");
@@ -272,8 +272,8 @@ unsigned char read_elf_obj_size(FILE* fp)
void display_sec_common()
{
printf("\nNX %s\n", nx ? "enabled" : "disabled");
printf("PIE %s\n", pie ? "enabled" : "disabled");
printf(" %s, ", nx ? "\x1b[32mNX enabled\x1b[0m" : "\x1b[31mNX disabled\x1b[0m");
printf("%s, ", pie ? "\x1b[32mPIE enabled\x1b[0m" : "\x1b[31mPIE disabled\x1b[0m");
}
int main(int argc, char* argv[])
@@ -281,10 +281,15 @@ int main(int argc, char* argv[])
// Argument processing
if (argc < 2)
{
printf("Usage: %s <elf>\n", argv[0]);
printf("Usage: %s <file> [options]\n -v --verbose displays more information\n", argv[0]);
return -EINVAL;
}
for (int i=1; i<argc; i++)
{
if (strncmp(argv[i], "-v", 2) == 0) verbose = true;
}
char* filename = argv[1];
if (!filename)
{
@@ -306,6 +311,8 @@ int main(int argc, char* argv[])
return -EINVAL;
}
printf("%s: ", filename);
// ELF32 or ELF64?
unsigned char elf_obj_size = read_elf_obj_size(elf_file);