MANÓ

Az ELF fájlformátum megértése

Az ELF fájlformátum megértése

A forráskódtól a bináris kódig

A programozás egy okos ötlettel kezdődik, és forráskódot ír be egy választott programozási nyelvre, például C-re, és a forráskódot fájlba menti. Megfelelő fordító, például GCC segítségével a forráskódot először objektumkódokká alakítják. Végül a linkelő az objektumkódot bináris fájlba fordítja, amely összekapcsolja az objektumkódot a hivatkozott könyvtárakkal. Ez a fájl tartalmazza az egyetlen utasítást gépi kódként, amelyet a CPU ért, és amelyek a lefordított program futtatásakor azonnal végrehajtásra kerülnek.

A fent említett bináris fájl egy meghatározott struktúrát követ, és az egyik leggyakoribb fájl neve ELF, amely rövidíti az végrehajtható és összekapcsolható formátumot. Széles körben használják futtatható fájlokhoz, áthelyezhető objektumfájlokhoz, megosztott könyvtárakhoz és magfájlokhoz.

Húsz évvel ezelőtt - 1999-ben - a 86open projekt az ELF-et választotta az x86 processzorok Unix és Unix-szerű rendszereinek szabványos bináris fájlformátumává. Szerencsére az ELF formátumot korábban már dokumentálták mind a System V alkalmazás bináris interfészében, mind a szerszám interfész szabványában [4]. Ez a tény hatalmas mértékben leegyszerűsítette a szabványosításról szóló megállapodást a Unix-alapú operációs rendszerek különböző gyártói és fejlesztői között.

A döntés oka az ELF megtervezése volt - rugalmasság, bővíthetőség és platformonkénti támogatás a különböző endian formátumokhoz és címméretekhez. Az ELF kialakítása nem korlátozódik egy adott processzorra, utasításkészletre vagy hardverarchitektúrára. A futtatható fájlformátumok részletes összehasonlítását itt tekintheti meg [3].

Azóta az ELF formátumot több különböző operációs rendszer használja. Többek között ide tartozik a Linux, a Solaris / Illumos, a Free-, a Net- és az OpenBSD, a QNX, a BeOS / Haiku és a Fuchsia OS [2]. Ezenkívül megtalálhatja azokat az Android, Maemo vagy Meego OS / Sailfish OS operációs rendszert futtató mobileszközökön, valamint olyan játékkonzolokon is, mint a PlayStation Portable, a Dreamcast és a Wii.

A specifikáció nem tisztázza az ELF fájlok fájlnévkiterjesztését. Használatában számos betűkombináció található, mint pl .axf, .kuka, .Manó, .o, .prx, .pöfékel, .ko, .így, és .mod, vagy egyik sem.

Az ELF fájl felépítése

Egy Linux-terminálon a man elf parancs hasznos összefoglalót ad az ELF fájl felépítéséről:

1. felsorolás: Az ELF szerkezetének oldala

$ manó manó
ELF (5) Linux programozói kézikönyv ELF (5)
NÉV
elf - futtatható és összekapcsoló formátumú (ELF) fájlok formátuma
SZINOPSZIS
#include
LEÍRÁS
A fejlécfájl meghatározza az ELF futtatható bináris formátumát
fájlokat. Ezen fájlok között vannak normál futtatható fájlok, amelyek áthelyezhetők
objektumfájlok, törzsfájlok és megosztott könyvtárak.
Az ELF fájlformátumot használó futtatható fájl egy ELF fejlécből áll,
amelyet egy program fejléc táblája vagy egy szakasz fejléc táblája követ, vagy mindkettő.
Az ELF fejléc mindig a fájl nulla eltolásával történik. A program
fejléc tábla és a szakasz fejléc tábla eltolása a fájlban
definiálva az ELF fejlécében. A két táblázat leírja a többi elemet
a fájl sajátosságai.

Amint a fenti leírásból látható, az ELF fájl két szakaszból áll - egy ELF fejlécből és a fájl adataiból. A fájladat-rész állhat egy programfejléc-táblából, amely nulla vagy több szegmenst ír le, egy szakaszfejléc-táblázatból, amely nulla vagy több szakaszot ír le, amelyet a programfejléc-táblázat bejegyzéseivel hivatkozott adatok követnek, és a szakaszfejléc-táblázatból. Minden szegmens információkat tartalmaz, amelyek a fájl futásidejű végrehajtásához szükségesek, míg a szakaszok fontos adatokat tartalmaznak az összekapcsoláshoz és az áthelyezéshez. Az 1. ábra ezt sematikusan szemlélteti.

Az ELF fejléc

Az ELF fejléc 32 bájt hosszú, és azonosítja a fájl formátumát. Négy egyedi byte szekvenciával kezdődik, amelyek 0x7F, majd 0x45, 0x4c és 0x46 következnek, ami három E, L és F betűvé változik. A fejléc egyéb értékek mellett azt is jelzi, hogy ELF-fájlról van-e szó 32 vagy 64 bites formátumban, használ-e kis vagy nagy endianitást, megmutatja az ELF verziót, valamint azt, hogy melyik operációs rendszer számára lett összeállítva a fájl az együttműködés érdekében. jobb alkalmazás bináris interfész (ABI) és cpu utasításkészlet.

A bináris fájl érintésének hexdumpja a következőképpen néz ki:

.2. lista: A bináris fájl hexdump-ja

$ hd / usr / bin / touch | fej -5
00000000 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ELF… |
00000010 02 00 3e 00 01 00 00 00 e3 25 40 00 00 00 00 00 |…>…% @… |
00000020 40 00 00 00 00 00 00 00 28 e4 00 00 00 00 00 00 | @… (… |
00000030 00 00 00 00 40 00 38 00 09 00 40 00 1b 00 1a 00 | [e-mail védett] @… |
00000040 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00 | [e-mail védett] |

A Debian GNU / Linux felajánlja a readelf parancsot, amelyet a GNU 'binutils' csomag tartalmaz. A -h kapcsoló (a „-file-header rövid verziója”) kíséretében szépen megjeleníti egy ELF fájl fejlécét. A 3. lista ezt szemlélteti a parancsérintéssel.

.3. lista: ELF fájl fejlécének megjelenítése

$ readelf -h / usr / bin / touch
ELF fejléc:
Varázslat: 7f 45 4c 46 02 01 01 00 00 00 00 00 00 00 00 00
Osztály: ELF64
Adatok: 2 kiegészítése, kis endian
Verzió: 1 (aktuális)
OS / ABI: UNIX - V. rendszer
ABI verzió: 0
Típus: EXEC (futtatható fájl)
Gép: Advanced Micro Devices X86-64
Verzió: 0x1
Belépési pont címe: 0x4025e3
A programfejlécek kezdete: 64 (bájt fájlba)
A szakasz fejlécének kezdete: 58408 (bájt fájlba)
Zászlók: 0x0
A fejléc mérete: 64 (bájt)
A programfejlécek mérete: 56 (bájt)
A programfejlécek száma: 9
A szakaszfejlécek mérete: 64 (bájt)
Szakaszfejlécek száma: 27
Szakaszfejléc karakterlánc-tábla indexe: 26

A Program fejléc

A program fejléce megmutatja a futás közben használt szegmenseket, és megmondja a rendszernek, hogyan kell létrehozni egy folyamatképet. A 2. lista fejlécéből kiderül, hogy az ELF fájl 9 programfejből áll, amelyek mindegyike 56 bájt méretű, és az első fejléc 64 bájtnál kezdődik.

Ismét a readelf parancs segít kivonni az információkat az ELF fájlból. A -l kapcsoló (rövid a -program fejlécekhez vagy -segmentekhez) további részleteket tár fel, amint azt a 4. lista mutatja.

.4. lista: Információk megjelenítése a programfejlécekről

$ readelf -l / usr / bin / touch
Az Elf fájl típusa: EXEC (futtatható fájl)
Belépési pont 0x4025e3
9 programfejléc van, a 64-es eltolással kezdődik
Programfejlécek:
Típus Eltolás VirtAddr PhysAddr
FileSiz MemSiz jelzi az igazítást
PHDR 0x000000000000000040 0x0000000000400040 0x0000000000400040
0x00000000000001f8 0x00000000000001f8 R E 8
INTERP 0x0000000000000238 0x0000000000400238 0x0000000000400238
0x000000000000001c 0x000000000000001c R 1
[Kérelmező programértelmező: / lib64 / ld-linux-x86-64.így.2]
LOAD 0x000000000000000000 0x0000000000400000 0x0000000000400000
0x000000000000d494 0x000000000000d494 R E 200000
LOAD 0x00000000000000de10 0x00000000006060de10 0x0000000000606010
0x0000000000000524 0x0000000000000748 RW 200000
DYNAMIC 0x00000000000000de28 0x00000000006060de28 0x00000000006060de28
0x00000000000001d0 0x00000000000001d0 RW 8
MEGJEGYZÉS: 0x0000000000000254 0x0000000000400254 0x0000000000400254
0x0000000000000044 0x0000000000000044 R 4
GNU_EH_FRAME 0x000000000000bc40 0x000000000040bc40 0x000000000040bc40
0x00000000000003a4 0x00000000000003a4 R 4
GNU_STACK 0x000000000000000000 0x000000000000000000 0x000000000000000000
0x0000000000000000 0x0000000000000000 RW 10
GNU_RELRO 0x00000000000000de10 0x00000000000060de10 0x0000000000606010
0x00000000000001f0 0x00000000000001f0 R 1
Szakasz szegmensek leképezése:
Szakaszok szegmentálása…
00
01 .interp
02 .interp .jegyzet.ABI-tag .jegyzet.gnú.build-id .gnú.hash .dynsym .dynstr .gnú.változat .gnú.verzió_r .rela.dyn .rela.plt .benne .plt .szöveg .fini .rodata .eh_frame_hdr .eh_frame
03 .init_array .fini_array .jcr .dinamikus .kapott .kapott.plt .adat .bss
04 .dinamikus
05 .jegyzet.ABI-tag .jegyzet.gnú.build-id
06 .eh_frame_hdr
07
08 .init_array .fini_array .jcr .dinamikus .kapott

A szakaszfejléc

Az ELF szerkezet harmadik része a szakaszfejléc. Célja a bináris egyes szakaszainak felsorolása. Az -S kapcsoló (röviden a szekciófejléceknek vagy -szakaszoknak) felsorolja a különböző fejléceket. Ami az érintési parancsot illeti, 27 szakaszfejléc létezik, és az 5. lista csak az első négyet és az utolsót mutatja, csak. Minden sor kiterjed a szakasz méretére, a szakasz típusára, valamint a címére és a memória eltolására.

.5. felsorolás: A részletek részletei önmaga által feltárva

$ readelf -S / usr / bin / touch
27 szakaszfejléc van, a 0xe428 eltolással kezdődően:
Szakaszfejlécek:
[Nr] Név Típus Cím eltolás
Size EntSize Flags Link Info Align
[0] NULL 000000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[1] .interp PROGBITS 0000000000400238 00000238
000000000000001c 0000000000000000 A 0 0 1
[2] .jegyzet.ABI-tag MEGJEGYZÉS: 0000000000400254 00000254
0000000000000020 0000000000000000 A 0 0 4
[3] .jegyzet.gnú.build-i MEGJEGYZÉS: 0000000000400274 00000274


[26] .shstrtab STRTAB 000000000000000000 0000e334
00000000000000ef 000000000000000000 0 0 1
Kulcs a zászlókhoz:
W (írás), A (allokálás), X (végrehajtás), M (egyesítés), S (karakterláncok), l (nagy)
I (info), L (link sorrend), G (csoport), T (TLS), E (kizárás), x (ismeretlen)
O (extra operációs rendszer szükséges) o (operációs rendszer specifikus), p (processzor specifikus)

Eszközök az ELF fájl elemzéséhez

Amint azt a fenti példákból megjegyezhette, a GNU / Linux számos hasznos eszközzel egészül ki, amelyek segítenek egy ELF fájl elemzésében. Az első jelölt, akit megnézünk, a fájl segédprogram.

A fájl az ELF fájlokkal kapcsolatos alapvető információkat jeleníti meg, beleértve az utasításkészlet architektúráját, amelyhez az áthelyezhető, futtatható vagy megosztott objektum fájlban lévő kódot szánják. A 6. listában azt mondja, hogy a / bin / touch egy 64 bites futtatható fájl, amely a Linux Standard Base-t (LSB) követi, dinamikusan kapcsolódik és a GNU / Linux kernel 2-es verziójához készült.6.32.

.6. lista: Alapvető információk a fájl használatával

$ file / bin / touch
/ bin / touch: ELF 64-bites LSB futtatható, x86-64, 1-es verzió (SYSV), dinamikusan kapcsolódik, tolmács / lib64 / l,
GNU / Linux 2-hez.6.32, BuildID [sha1] = ec08d609e9e8e73d4be6134541a472ad0ea34502, lecsupaszítva
$

A második jelölt készen áll. Részletes információkat jelenít meg az ELF fájlról. A kapcsolók listája viszonylag hosszú, és az ELF formátum minden aspektusát lefedi. Az -n kapcsoló (rövid a -jegyzetekhez) használatával a 7. lista csak azokat a jegyzetszakaszokat jeleníti meg, amelyek léteznek a fájl érintésében - az ABI verziócímke és a build ID bitstringek.

.7. lista: Az ELF fájl kijelölt szakaszainak megjelenítése

$ readelf -n / usr / bin / touch
A 0x00000254 fájlkorrekcióban található megjegyzések megjelenítése 0x00000020 hosszúsággal:
Tulajdonos adatméret Leírás
GNU 0x00000010 NT_GNU_ABI_TAG (ABI verziócímke)
Operációs rendszer: Linux, ABI: 2.6.32
A 0x00000274 fájlkorrekcióban található megjegyzések megjelenítése 0x00000024 hosszúsággal:
Tulajdonos adatméret Leírás
GNU 0x00000014 NT_GNU_BUILD_ID (egyedi buildazonosító bitstring)
Építés azonosítója: ec08d609e9e8e73d4be6134541a472ad0ea34502

Ne feledje, hogy a Solaris és a FreeBSD alatt az elfdump [7] segédprogram megfelel a readelf-nek. 2019-től 2003 óta nem volt új kiadás vagy frissítés.

A harmadik az elfutils [6] nevű csomag, amely tisztán elérhető a Linux számára. Alternatív eszközöket kínál a GNU Binutilshez képest, és lehetővé teszi az ELF fájlok érvényesítését is. Ne feledje, hogy a csomagban szereplő segédprogramok összes neve az 'elf utils' eu-val kezdődik.

Végül, de nem utolsósorban megemlítjük az objdump-ot. Ez az eszköz hasonló a készenléthez, de az objektumfájlokra összpontosít. Hasonló információt nyújt az ELF fájlokról és más objektumformátumokról.

.8. lista: Az objdump által kinyert fájlinformációk

$ objdump -f / bin / touch
/ bin / touch: fájlformátum elf64-x86-64
architektúra: i386: x86-64, zászlók 0x00000112:
EXEC_P, HAS_SYMS, D_PAGED
kezdőcím 0x00000000004025e3
$

Van egy „elfkickers” [9] nevű szoftvercsomag is, amely eszközöket tartalmaz az ELF fájl tartalmának elolvasásához és manipulálásához. Sajnos a kibocsátások száma meglehetősen alacsony, ezért csak megemlítjük, és nem mutatunk további példákat.

Fejlesztőként megnézheti a „pax-utils” -ot [10,11]. Ez a segédprogramkészlet számos eszközt kínál, amelyek segítenek az ELF fájlok érvényesítésében. Például a dumpelf elemzi az ELF fájlt, és a részleteket tartalmazó C fejlécfájlt adja vissza - lásd a 2. ábrát.

Következtetés

Az okos tervezés és a kiváló dokumentáció kombinációjának köszönhetően az ELF formátum nagyon jól működik, és 20 év után is használatos. A fent bemutatott segédprogramok betekintést engednek az ELF fájlba, és kitalálják, hogy mit csinál egy program. Ezek az első lépések a szoftverelemzéshez - a boldog hackeléshez!

Linkek és hivatkozások
  • [1] Futtatható és összekapcsolható formátum (ELF), Wikipédia
  • [2] Fuchsia OS
  • [3] A futtatható fájlformátumok összehasonlítása, Wikipédia
  • [4] Linux Foundation, hivatkozott specifikációk
  • [5] Ciro Santilli: ELF Hello World bemutató
  • [6] elfutils Debian csomag
  • [7] elfdump
  • [8] Michael Boelen: Az ELF fájlok 101-je Linuxon: Megértés és elemzés
  • [9] elfkickerek
  • [10] Edzett / PaX segédprogramok
  • [11] pax-utils, Debian csomag
Köszönetnyilvánítás

Az író köszönetet mond Axel Beckertnek a cikk elkészítésével kapcsolatos támogatásáért.

Az X-Mouse Button Control segítségével az egér gombjait másképp alakíthatja át a különböző szoftvereknél
Lehet, hogy szüksége van egy eszközre, amely megváltoztathatja az egér vezérlését minden használt alkalmazással. Ebben az esetben kipróbálhatja az úgy...
Microsoft Sculpt Touch vezeték nélküli egér áttekintés
Nemrég olvastam a Microsoft Sculpt Touch vezeték nélküli egér és úgy döntött, hogy megveszi. Egy ideig használat után úgy döntöttem, hogy megosztom ve...
AppyMouse képernyős Trackpad és egérmutató a Windows táblagépekhez
A táblagép-felhasználók gyakran hiányolják az egérmutatót, különösen akkor, ha szokták használni a laptopokat. Az érintőképernyős okostelefonok és táb...