Разбор ELF заголовка

Тема в разделе "WASM.UNIX", создана пользователем NANO_VIRUS, 12 окт 2017.

Метки:
  1. NANO_VIRUS

    NANO_VIRUS New Member

    Публикаций:
    0
    Регистрация:
    24 июл 2017
    Сообщения:
    3
    Приветствую.
    Интересно стало узнать как устроен ELF (Executable and Linkable Format) заголовок. В процессе поиска в интернете смог много о чем узнать сам. Смог разобрать как составляется выбор архитектуры, ос, частично секции и прочее. Осталось часть вещей которые я не смог найти, а именно экспорт и импорт функций.

    По стандарту в FASM уже есть пример написания импорта и экспорта. Но он сделан более в упрощенном для пользователей виде через множество макросов, как и сам ELF заголовок. По сути мне достаточно разобрать все макросы по полочкам, но это займет время, так как я все-же в надежде найти хоть какой-то простейший пример. Иначе пойду разбирать макросы, как никак выход есть.

    Вот простой пример экспорта:

    Код (ASM):
    1. format ELF
    2. public MyFunctionName
    3.  
    4. section '.text'
    5.  
    6. MyFunctionName:
    7. retn
    В файле он автоматически задает название функции и ее адрес. Мне нужно разобрать это более детально.

    Для меня достаточно либо небольшого примера, либо хорошего источника информации (Который я упустил в поисках).

    Вот небольшой пример того чего я начал разбирать. Сейчас я завис на секциях, не могу правильно понять как их правильно воссоздать, так как в данном примере ошибка с секцией ".text", по какому принципу задается название, я не нашел поэтому склеил из примеров в интернете. возможно у вас завалялись свои, если не жалко буду рад:

    Код (ASM):
    1. format binary as 'so'
    2. ;file_header:
    3.  
    4.     ;e_ident:
    5.        
    6.         ;EI_CLASS:
    7.  
    8.             ELFCLASSNONE     equ 0
    9.            
    10.             ;32-х битная машина:
    11.             ELFCLASS32        equ 1
    12.            
    13.             ;64-х битная машина:
    14.             ELFCLASS64        equ 2
    15.  
    16.         ;EI_DATA:
    17.  
    18.             ELFDATANONE    equ 0
    19.            
    20.             ;байты следуют в порядке Little-endian:
    21.             ELFDATA2LSB    equ 1
    22.            
    23.             ;байты располагаются в порядке Big-endian:
    24.             ELFDATA2MSB    equ 2
    25.  
    26.         ;EI_VERSION:
    27.  
    28.             ;некорректное значение:
    29.             EV_NONE    equ 0
    30.            
    31.             ;корректное значение:
    32.             EV_CURRENT equ 1
    33.            
    34.         ;EI_OSABI:
    35.  
    36.             ;UNIX System V ABI:
    37.             ELFOSABI_SYSV equ 0
    38.            
    39.             ;HP-UX operating system ABI:
    40.             ELFOSABI_HPUX equ 1
    41.            
    42.             ;Nx operating system ABI:
    43.             ELFOSABI_NETBSD equ 2
    44.            
    45.             ;3GNU/Linux operating system ABI:
    46.             ELFOSABI_LINUX equ 3
    47.            
    48.             ;GNU/Hurd operating system ABI:
    49.             ELFOSABI_HURD equ 4
    50.            
    51.             ;86Open Common IA32 ABI:
    52.             ELFOSABI_86OPEN equ 5
    53.            
    54.             ;Solaris operating system ABI:
    55.             ELFOSABI_SOLARIS equ 6
    56.            
    57.             ;Monterey project ABI:
    58.             ELFOSABI_MONTEREY equ 7
    59.            
    60.             ;IRIX operating system ABI:
    61.             ELFOSABI_IRIX equ 8
    62.            
    63.             ;Fx operating system ABI:
    64.             ELFOSABI_FREEBSD equ 9
    65.            
    66.             ;TRU64 UNIX operating system ABI:
    67.             ELFOSABI_TRU64 equ 10
    68.            
    69.             ;Novell Modesto:
    70.             ELFOSABI_MODESTO equ 11
    71.            
    72.             ;OpenBSD:
    73.             ELFOSABI_OPENBSD equ 12
    74.            
    75.             ;Open VMS:
    76.             ELFOSABI_OPENVMS equ 13
    77.            
    78.             ;HP Non-Stop Kernel:
    79.             ELFOSABI_NSK equ 14
    80.            
    81.             ;ARM architecture ABI:
    82.             ELFOSABI_ARM equ 97
    83.            
    84.             ;Standalone (embedded) ABI:
    85.             ELFOSABI_STANDALONE equ 255
    86.            
    87. ;program_header:
    88.  
    89.     ;p_type:
    90.        
    91.         ;Обозначает не используемую запись:
    92.         PT_NULL equ 0
    93.        
    94.         ;Сегмент программы, загружаемый в память:
    95.         PT_LOAD equ 1
    96.        
    97.         ;Информация для динамического связывания:
    98.         PT_DYNAMIC equ 2
    99.        
    100.         ;Загрузчик программ:
    101.         PT_INTERP equ 3
    102.        
    103.         ;Дополнительная информация:
    104.         PT_NOTE equ 4
    105.        
    106.         ;Информация о самой таблице заголовков программы:
    107.         PT_PHDR equ 6
    108.        
    109.         ;Thread-local storage:
    110.         PT_TLS equ 7
    111.        
    112.     ;p_flags:
    113.        
    114.         ;Сегмент доступен на выполнение:
    115.         PT_X equ 1
    116.        
    117.         ;Сегмент доступен на запись:
    118.         PT_W equ 2
    119.        
    120.         ;Сегмент доступен на чтение:
    121.         PT_R equ 4
    122.    
    123.  
    124. ;program_section:
    125.  
    126.     ;sh_type:
    127.    
    128.         ;Пустой заголовок секции. Значения всех прочих полей заголовка секции неопределены:
    129.         SHT_NULL equ 0
    130.        
    131.         ;Секции программы (код или данные или что-либо еще):
    132.         SHT_PROGBITS equ 1
    133.  
    134.         ;Таблица символов (для объектных файлов или динамических библиотек):
    135.         SHT_SYMTAB equ 2
    136.  
    137.         ;Таблица строк:
    138.         SHT_STRTAB equ 3
    139.  
    140.         ;Записи о перемещаемых адресах (relocations):
    141.         SHT_RELA equ 4
    142.  
    143.         ;Хеш-таблица имен для динамического связывания:
    144.         SHT_HASH equ 5
    145.  
    146.         ;Информация для динамического связывания:
    147.         SHT_DYNAMIC equ 6
    148.  
    149.         ;Произвольная дополнительная информация:
    150.         SHT_NOTE equ 7
    151.        
    152.         ;Секция не занимает место в файле, но занимает место в адресном пространстве процесса:
    153.         SHT_NOBITS equ 8
    154.  
    155.         ;Записи о перемещаемых адресах:
    156.         SHT_REL equ 9
    157.  
    158.     ;sh_flags:
    159.        
    160.         ;Содержимое секции должно быть доступно на запись в адресном пространстве процесса:
    161.         SHF_WRITE equ 1
    162.        
    163.         ;Для содержимого секции выделяется память в адресном пространстве процесса:
    164.         SHF_ALLOC equ 2
    165.        
    166.         ;Секция содержит инструкции процессора:
    167.         SHF_EXECINSTR equ 4
    168.        
    169.        
    170. SHENTSIZE equ 40
    171. PHENTSIZE equ 32
    172. program_base = 0x00000000
    173.  
    174.     use32
    175.  
    176. ;Заголовок файла:      
    177. file_header:
    178.  
    179.     ;Массив 16 байт, каждый из которых определяет общую характеристику файла:
    180.     e_ident:
    181.     .size = 0x10
    182.  
    183.         EI_MAG0 db 0x7F
    184.         EI_MAG1 db 'E'
    185.         EI_MAG2 db 'L'
    186.         EI_MAG3 db 'F'
    187.        
    188.         ;определяет класс "машины":
    189.         EI_CLASS db ELFCLASS32
    190.        
    191.         ;определяет порядок следования байтов в файле:
    192.         EI_DATA db ELFDATA2LSB
    193.        
    194.         ;определяет номер версии заголовка:
    195.         EI_VERSION db EV_CURRENT
    196.        
    197.         ;определяет операционную систему и ABI:
    198.         EI_OSABI db ELFOSABI_SYSV
    199.        
    200.         ;EI_ABIVERSION (определяет версию ABI):
    201.         ;EI_PAD (начало зарезервированных байтов):
    202.         ;EI_NIDENT(конец зарезервированных байтов):
    203.         rb e_ident+e_ident.size-$
    204.    
    205.     ;Тип файла:
    206.     e_type dw 3
    207.  
    208.     ;Архитектура аппаратной платформы, для которой файл создан:
    209.     e_machine dw 3
    210.  
    211.     ;Номер версии формата:
    212.     e_version dd 1
    213.  
    214.     ;Точка входа:
    215.     e_entry dd start
    216.  
    217.     ;Расположение таблицы заголовков программы:
    218.     e_phoff dd program_header
    219.  
    220.     ;Расположение таблицы заголовков разделов:
    221.     e_shoff dd program_section
    222.  
    223.     ;Связанные с файлом флаги, зависящие от процессора:
    224.     e_flags dd 0
    225.  
    226.     ;Размер заголовка файла:
    227.     e_ehsize dw 52;program_header-file_header
    228.  
    229.     ;Размер каждого заголовка программы:
    230.     e_phentsize dw PHENTSIZE
    231.  
    232.     ;Число заголовков программы:
    233.     e_phnum dw 1
    234.  
    235.     ;Размер каждого заголовка разделов:
    236.     e_shentsize dw SHENTSIZE
    237.  
    238.     ;Число заголовков разделов:
    239.     e_shnum dw SHNUM
    240.  
    241.     ;Индекс записи в таблице разделов, указывающей на таблицу названий разделов:
    242.     e_shstrndx dw SHSTRNDX
    243.    
    244.  
    245.  
    246.  
    247. ;Таблица заголовков секций:
    248. program_section:
    249.  
    250.     dd anullstr-start,SHT_NULL,0,0,0,0,0,0,0,0
    251.    
    252. SHSTRNDX = ($ - program_section) / SHENTSIZE
    253.    
    254.     ;Индекс имени секции:
    255.     sh_name dd atext-start
    256.    
    257.     ;Тип секции:
    258.     sh_type dd SHT_PROGBITS
    259.    
    260.     ;Флаги описывающие дополнительные атрибуты:
    261.     sh_flags dd SHF_ALLOC+SHF_EXECINSTR
    262.    
    263.     ;адрес в виртуальном адресном пространстве процесса:
    264.     sh_addr dd start
    265.  
    266.     ;смещение от начала файла:
    267.     sh_offset dd start
    268.    
    269.     ;размер секции в байтах:
    270.     sh_size dd start.size
    271.    
    272.     ;индекс другой секции:
    273.     sh_link dd 0
    274.  
    275.     ;информация о секции:
    276.     sh_info dd 0
    277.    
    278.     ;требование по выравниванию адреса начала секции в памяти:
    279.     sh_addralign dd 0
    280.    
    281.     ;размер одной записи:
    282.     sh_entsize dd 0
    283.    
    284. SHNUM = ($ - program_section) / SHENTSIZE
    285.  
    286. ;Таблица заголовков программы:
    287. program_header:
    288.    
    289.     ;Тип заголовка:
    290.     p_type dd PT_LOAD
    291.    
    292.     ;Смещение от начала файла, по которому располагается данный сегмент:
    293.     p_offset dd 0
    294.    
    295.     ;Виртуальный адрес начала сегмента в памяти:
    296.     p_vaddr dd program_base
    297.    
    298.     ;NULL:
    299.     p_paddr dd 0
    300.    
    301.     ;Размер сегмента в файле:
    302.     p_filesz dd program_end-program_base
    303.    
    304.     ;Размер сегмента в памяти:
    305.     p_memsz dd program_end-program_base
    306.    
    307.     ;флаги доступа к сегменту в памяти:
    308.     p_flags dd PT_X+PT_W+PT_R
    309.    
    310.     ;:
    311.     p_align dd 0x1000
    312.    
    313.  
    314.  
    315.  
    316.     start:
    317.     retn
    318.    
    319.     anullstr          db 0
    320.     atext             db ".text", 0
    321.    
    322.     start.size = $-start
    323.  
    324.  
    325.  
    326. program_end:
    327.  
    328.