#include #include #include #include "futil.c" #include "elf_header.h" // typedef enum EIdent // { // EI_MAG0 = 0, //Magic number position zero - three. // EI_MAG1 = 1, // EI_MAG2 = 2, // EI_MAG3 = 3, // EI_CLASS = 4, // EI_DATA = 5, // EI_VERSION = 6, // EI_OSABI = 7, // EI_ABIVERSION = 8, // EI_PAD = 9, // EI_NIDENT = 16 //End of reserved 16 bytes for the header. // } EIdent; // typedef enum EIClass // { // ELFClassNone = 0, // ELFClass32 = 1, // ELFClass64 = 2 // } EIClass; // typedef enum EI_Data // { // ELFDataNone = 0, // ELFDataLSB = 1, // ELFDataMSB = 2 // } EIData; // typedef enum ELFType{ // ET_None = 0, //No file type // ET_Rel = 1, //Relocatable file // ET_Exec = 2, //Executable file // ET_Dyn = 3, //Shared object file // ET_Core = 4, //Core file // ET_LOProc = 0xff00, //Processor // ET_HIProc = 0xffff //Specific // } ELFType; // typedef enum ELFMachine // { // EM_None = 0, // EM_M32 = 1, //AT&T WE 32100 // EM_Sparc = 2, // EM_386 = 3, // EM_68k = 4, // EM_88k = 5, // EM_860 = 7, // EM_MIPS = 8, // EM_X86_64 = 62 // } ELFMachine; // typedef enum ELFOSABI // { // ELFOSABI_SYSTEMV = 0, // ELFOSABI_HPUX = 1, // ELFOSABI_NETBSD = 2, // ELFOSABI_GNU = 3, // ELFOSABI_LINUX = 3, // ELFOSABI_SOLARIS = 6, // ELFOSABI_AIX, // ELFOSABI_IRIX, // ELFOSABI_FREEBSD, // ELFOSABI_TRU64, // ELFOSABI_MODESTO, // ELFOSABI_OPENBSD, // ELFOSABI_OPENVMS, // ELFOSABI_NSK, // ELFOSABI_AROS, // ELFOSABI_FENIXOS, // ELFOSABI_CLOUDABI, // ELFOSABI_OPENVOS // } ELFOSABI; int main(int argc, char** argv) { char* bytes; size_t size; //int64_t entryAddress; if (argc != 2) { printf("No argcs\n"); return 0; } if (!ReadAllString(argv[1], &bytes, &size)) return 0; ParseObjectFile(bytes, size); // char magic[5] = { bytes[EI_MAG0], bytes[EI_MAG1], bytes[EI_MAG2], bytes[EI_MAG3], '\0' }; // if (strcmp(magic, "\x7f""ELF") != 0) // { // fprintf(stderr, "Failed to find ELF magic number in file header.\n"); // return 0; // } // printf("Magic: "); // for(int i = 0; i < EI_NIDENT; i++) // { // printf("%02X ", bytes[i]); // } // printf("\n"); // switch(bytes[EI_CLASS]) // { // case ELFClass32: // printf("Class: 32-bit object\n"); // break; // case ELFClass64: // memcpy(&entryAddress, &bytes[0x18], sizeof(int64_t));//bytes[0x18]; // printf("Class: 64-bit object\n"); // break; // default: // printf("Class: Invalid\n"); // return 1; // } // switch(bytes[EI_DATA]) // { // case ELFDataLSB: // printf("Data: 2's complement, little endian.\n"); // break; // case ELFDataMSB: // printf("Data: 2's complement, big endian.\n"); // break; // default: // printf("Data: Unknown byte order\n"); // return 1; // } // if (bytes[EI_VERSION] == 1) printf("Version: 1 (Current)\n"); // else printf("Version: 0 (Invalid)\n"); // printf("OS/ABI: "); // switch(bytes[EI_OSABI]) // { // case ELFOSABI_SYSTEMV: // printf("System V ABI\n"); // break; // case ELFOSABI_HPUX: // printf("Hewlett-Packard HP-UX ABI\n"); // break; // case ELFOSABI_NETBSD: // printf("NetBSD ABI\n"); // break; // case ELFOSABI_LINUX: // printf("GNU ABI\n"); // break; // case ELFOSABI_SOLARIS: // printf("Sun Solaris ABI\n"); // break; // case ELFOSABI_AIX: // printf("AIX ABI\n"); // break; // case ELFOSABI_IRIX: // printf("IRIX ABI\n"); // break; // case ELFOSABI_FREEBSD: // printf("FreeBSd ABI\n"); // break; // case ELFOSABI_TRU64: // printf("Compaq TRU64 UNIX ABI\n"); // break; // case ELFOSABI_MODESTO: // printf("Novell Modesto ABI\n"); // break; // case ELFOSABI_OPENBSD: // printf("OpenBSD ABI\n"); // break; // case ELFOSABI_OPENVMS: // printf("Open VMS ABI\n"); // break; // case ELFOSABI_NSK: // printf("Hewlett-Packard Non-Stop Kernel ABI\n"); // break; // case ELFOSABI_AROS: // printf("Amiga Research OS ABI\n"); // break; // case ELFOSABI_FENIXOS: // printf("The FenixOS highly scalable multi-core OS ABI\n"); // break; // case ELFOSABI_CLOUDABI: // printf("Nuxi CloudABI ABI\n"); // break; // case ELFOSABI_OPENVOS: // printf("Stratus Technologies OpenVOS ABI\n"); // break; // default: // printf("Reserved ABI (%d)\n", bytes[EI_ABIVERSION]); // break; // } // printf("ABI Version: %d\n", bytes[EI_ABIVERSION]); // printf("Type: "); // switch(bytes[EI_NIDENT] + bytes[EI_NIDENT + 1]) // { // case ET_None: // printf("None\n"); // break; // case ET_Rel: // printf("Rel\n"); // break; // case ET_Exec: // printf("Exec\n"); // break; // case ET_Dyn: // printf("DYN (Position-Independent Executable file)\n"); // break; // case ET_Core: // printf("Core\n"); // break; // case ET_LOProc: // printf("LO\n"); // break; // case ET_HIProc: // printf("HI\n"); // break; // default: // fprintf(stderr, "Unknown file type\n"); // return 1; // } // printf("Machine: "); // switch (bytes[EI_NIDENT + 2] + bytes[EI_NIDENT + 3]) { // case EM_860: // printf("Intel 80860\n"); // break; // case EM_X86_64: // printf("AMD x86-64 architecture\n"); // break; // default: // fprintf(stderr, "Failed to identify machine type\n"); // return 1; // } // printf("Version: %#04x\n", bytes[EI_NIDENT + 4] + bytes[EI_NIDENT + 5]); // printf("Entry point address: %#06lX\n", entryAddress); printf("Read %ld bytes from file '%s'\n", size, argv[1]); }