ЕЛФ

Разумевање ЕЛФ формата датотеке

Разумевање ЕЛФ формата датотеке

Од изворног кода до бинарног кода

Програмирање започиње паметном идејом и писањем изворног кода на програмском језику по вашем избору, на пример Ц, и чувањем изворног кода у датотеци. Уз помоћ одговарајућег компајлера, на пример ГЦЦ, ваш изворни код се прво преводи у објектни код. На крају, повезивач преводи објектни код у бинарну датотеку која повезује објектни код са референцираним библиотекама. Ова датотека садржи појединачне упуте као машински код које ЦПУ разумије и извршавају се чим се компајлирани програм покрене.

Горе поменута бинарна датотека прати одређену структуру, а једна од најчешћих се зове ЕЛФ која скраћује извршни и повезиви формат. Широко се користи за извршне датотеке, објектне датотеке које се могу преместити, дељене библиотеке и депоније језгара.

Пре двадесет година - 1999. године - пројекат 86опен је изабрао ЕЛФ као стандардни бинарни формат датотеке за Уник и Уник-сличне системе на к86 процесорима. Срећом, ЕЛФ формат је претходно документован и у бинарном интерфејсу апликације Систем В, и у стандарду за интерфејс алата [4]. Ова чињеница је изузетно поједноставила споразум о стандардизацији између различитих добављача и програмера оперативних система заснованих на Унику.

Разлог иза те одлуке био је дизајн ЕЛФ-а - флексибилност, проширивост и подршка на више платформи за различите енданске формате и величине адреса. ЕЛФ-ов дизајн није ограничен на одређени процесор, скуп инструкција или хардверску архитектуру. За детаљно поређење формата извршних датотека погледајте овде [3].

Од тада, ЕЛФ формат користи неколико различитих оперативних система. Између осталих, ово укључује Линук, Соларис / Иллумос, Фрее-, Нет- и ОпенБСД, КНКС, БеОС / Хаику и Фуцхсиа ОС [2]. Поред тога, наћи ћете га на мобилним уређајима са Андроид, Маемо или Меего ОС / Саилфисх ОС, као и на играћим конзолама попут ПлаиСтатион Портабле, Дреамцаст и Вии.

Спецификација не појашњава екстензију имена датотеке за ЕЛФ датотеке. У употреби су разне комбинације слова, као што су .акф, .канта за смеће, .елф, .о, .прк, .пуфф, .ко, .тако, и .мод, или ниједан.

Структура ЕЛФ датотеке

На Линук терминалу, наредба ман елф даје вам згодан сажетак о структури ЕЛФ датотеке:

Списак 1: Руковање ЕЛФ структуром

$ ман вилењак
ЕЛФ (5) Приручник за програмера за Линук ЕЛФ (5)
НАМЕ
елф - формат извршних датотека и датотека за повезивање (ЕЛФ)
СИНОПСИС
#инцлуде
ОПИС
Датотека заглавља дефинише формат извршне бинарне датотеке ЕЛФ
фајлови. Међу овим датотекама су нормалне извршне датотеке које се могу преместити
објектне датотеке, основне датотеке и дељене библиотеке.
Извршна датотека која користи формат ЕЛФ датотеке састоји се од ЕЛФ заглавља,
након чега следи табела заглавља програма или табела заглавља одељка или обоје.
ЕЛФ заглавље је увек на нули одмака датотеке. Програм
таблица заглавља и помак табеле заглавља одјељка у датотеци су
дефинисано у заглављу ЕЛФ. Две табеле описују остатак
посебности датотеке.

Као што видите из горњег описа, ЕЛФ датотека се састоји од два одељка - ЕЛФ заглавља и података датотеке. Одељак података датотеке може се састојати од табеле заглавља програма која описује нула или више сегмената, табеле заглавља одељка која описује нула или више одељака, а затим следе подаци на које се позивају уноси из табеле заглавља програма и табеле заглавља одељка. Сваки сегмент садржи информације које су неопходне за извршавање датотеке током извођења, док одељци садрже важне податке за повезивање и пресељење. Слика 1 ово схематски илуструје.

ЕЛФ заглавље

ЕЛФ заглавље дугачко је 32 бајта и идентификује формат датотеке. Почиње секвенцом од четири јединствена бајта која су 0к7Ф, а затим 0к45, 0к4ц и 0к46 што се преводи у три слова Е, Л и Ф. Између осталих вредности, заглавље такође указује да ли се ради о ЕЛФ датотеци за 32 или 64-битни формат, користи мали или велики ендианнесс, приказује верзију ЕЛФ-а, као и за који оперативни систем је датотека компајлирана да би се могло интероперовати са бинарни интерфејс десне апликације (АБИ) и скуп инструкција процесора.

Хекдумп додира бинарне датотеке изгледа овако:

.Унос 2: Хекдумп бинарне датотеке

$ хд / уср / бин / тоуцх | глава -5
00000000 7ф 45 4ц 46 02 01 01 00 00 00 00 00 00 00 00 00 |.ЕЛФ… |
00000010 02 00 3е 00 01 00 00 00 е3 25 40 00 00 00 00 00 |…>…% @… |
00000020 40 00 00 00 00 00 00 00 28 е4 00 00 00 00 00 00 | @… (… |
00000030 00 00 00 00 40 00 38 00 09 00 40 00 1б 00 1а 00 | [емаил протецтед] @… |
00000040 06 00 00 00 05 00 00 00 40 00 00 00 00 00 00 00 | [емаил заштићен] |

Дебиан ГНУ / Линук нуди наредбу реаделф која је наведена у ГНУ 'бинутилс' пакету. У пратњи преклопника -х (кратка верзија за „-филе-хеадер“) лепо приказује заглавље ЕЛФ датотеке. Напис 3 илуструје ово за команду тоуцх.

.Унос 3: Приказивање заглавља ЕЛФ датотеке

$ реаделф -х / уср / бин / тоуцх
ЕЛФ заглавље:
Магија: 7ф 45 4ц 46 02 01 01 00 00 00 00 00 00 00 00 00
Класа: ЕЛФ64
Подаци: Комплемент 2, мали ендиан
Верзија: 1 (тренутна)
ОС / АБИ: УНИКС - Систем В
Верзија АБИ: 0
Тип: ЕКСЕЦ (извршна датотека)
Машина: Напредни микро уређаји Кс86-64
Верзија: 0к1
Адреса улазне тачке: 0к4025е3
Почетак заглавља програма: 64 (бајтова у датотеку)
Почетак заглавља одељака: 58408 (бајтова у датотеку)
Заставе: 0к0
Величина овог заглавља: ​​64 (бајтова)
Величина заглавља програма: 56 (бајтова)
Број заглавља програма: 9
Величина заглавља одељака: 64 (бајтова)
Број заглавља секција: 27
Индекс табеле низа заглавља одељка: 26

Заглавље програма

Заглавље програма приказује сегменте који се користе током извођења и говори систему како да креира слику процеса. Заглавље из листе 2 показује да се ЕЛФ датотека састоји од 9 заглавља програма који имају величину од 56 бајтова, а прво заглавље почиње у бајту 64.

Поново, наредба реаделф помаже у издвајању информација из ЕЛФ датотеке. Прекидач -л (скраћеница од -програм-заглавља или -сегменти) открива више детаља као што је приказано у листи 4.

.Унос 4: Прикажите информације о заглављима програма

$ реаделф -л / уср / бин / тоуцх
Тип датотеке Елф је ЕКСЕЦ (извршна датотека)
Улазна тачка 0к4025е3
Постоји 9 заглавља програма, почевши од офсет 64
Заглавља програма:
Тип Оффсет ВиртАддр ПхисАддр
ФилеСиз МемСиз Флагс Поравнај
ПХДР 0к0000000000000040 0к0000000000400040 0к0000000000400040
0к00000000000001ф8 0к00000000000001ф8 Р Е 8
ИНТЕРП 0к0000000000000238 0к0000000000400238 0к0000000000400238
0к000000000000001ц 0к000000000000001ц Р 1
[Захтев за тумачем програма: / либ64 / лд-линук-к86-64.тако.2]
ЛОАД 0к0000000000000000 0к0000000000400000 0к0000000000400000
0к000000000000д494 0к000000000000д494 Р Е 200000
ЛОАД 0к000000000000де10 0к000000000060де10 0к000000000060де10
0к0000000000000524 0к0000000000000748 РВ 200000
ДИНАМИЦ 0к000000000000де28 0к000000000060де28 0к000000000060де28
0к00000000000001д0 0к00000000000001д0 РВ 8
НАПОМЕНА 0к0000000000000254 0к0000000000400254 0к0000000000400254
0к0000000000000044 0к0000000000000044 Р 4
ГНУ_ЕХ_ФРАМЕ 0к000000000000бц40 0к000000000040бц40 0к000000000040бц40
0к00000000000003а4 0к00000000000003а4 Р 4
ГНУ_СТАЦК 0к0000000000000000 0к0000000000000000 0к0000000000000000
0к0000000000000000 0к0000000000000000 РВ 10
ГНУ_РЕЛРО 0к000000000000де10 0к000000000060де10 0к000000000060де10
0к00000000000001ф0 0к00000000000001ф0 Р 1
Одељак за мапирање сегмената:
Одељци сегмената…
00
01 .интерп
02 .интерп .Белешка.АБИ-таг .Белешка.гну.буилд-ид .гну.хасх .динсим .динстр .гну.верзија .гну.версион_р .рела.дин .рела.плт .у томе .плт .текст .фини .родата .ех_фраме_хдр .ех_фраме
03 .инит_арраи .фини_арраи .јцр .динамичан .добио .добио.плт .подаци .бсс
04 .динамичан
05 .Белешка.АБИ-таг .Белешка.гну.буилд-ид
06 .ех_фраме_хдр
07
08 .инит_арраи .фини_арраи .јцр .динамичан .добио

Заглавље секције

Трећи део ЕЛФ структуре је заглавље одељка. Намењено је навођењу појединачних одељака бинарног система. Прекидач -С (скраћеница од -сецтион-хеадерс или -сецтионс) наводи различита заглавља. Што се тиче команде додира, постоји 27 заглавља одељака, а на листи 5 су приказана само прва четири и последњи. Свака линија покрива величину секције, тип секције као и њену адресу и помак меморије.

.Списак 5: Детаље о одељку објавио реаделф

$ реаделф -С / уср / бин / тоуцх
Постоји 27 заглавља секција, почевши од офсета 0ке428:
Заглавља секција:
[Нр] Име Тип Адреса Помак
Величина ЕнтСизе Флагс Линк Информације Поравнај
[0] НУЛЛ 0000000000000000 00000000
0000000000000000 0000000000000000 0 0 0
[1] .интерп ПРОГБИТС 0000000000400238 00000238
000000000000001ц 0000000000000000 А 0 0 1
[2] .Белешка.АБИ-таг НАПОМЕНА 0000000000400254 00000254
0000000000000020 0000000000000000 А 0 0 4
[3] .Белешка.гну.буилд-и НАПОМЕНА 0000000000400274 00000274


[26] .схстртаб СТРТАБ 0000000000000000 0000е334
00000000000000еф 0000000000000000 0 0 1
Кључ за заставе:
В (писање), А (додељивање), Кс (извршавање), М (спајање), С (жице), л (велико)
И (информације), Л (редослед веза), Г (група), Т (ТЛС), Е (изузима), к (непознато)
О (потребна додатна обрада ОС-а) о (специфично за ОС), п (специфично за процесор)

Алати за анализу ЕЛФ датотеке

Као што сте могли приметити из горњих примера, ГНУ / Линук је представљен низом корисних алата који вам помажу да анализирате ЕЛФ датотеку. Први кандидат који ћемо погледати је услужни програм за датотеке.

датотека приказује основне информације о ЕЛФ датотекама, укључујући архитектуру скупа инструкција којој је намењен код у датотеци која се може преместити, извршити или делити. У списку 6 вам говори да је / бин / тоуцх 64-битна извршна датотека која следи Линук Стандард Басе (ЛСБ), динамички повезана и направљена за ГНУ / Линук кернел верзију 2.6.32.

.Списак 6: Основне информације помоћу датотеке

$ датотека / канта / додир
/ бин / тоуцх: ЕЛФ 64-битна ЛСБ извршна датотека, к86-64, верзија 1 (СИСВ), динамички повезана, интерпретер / либ64 / л,
за ГНУ / Линук 2.6.32, БуилдИД [сха1] = ец08д609е9е8е73д4бе6134541а472ад0еа34502, скинут
$

Други кандидат је читав. Приказује детаљне информације о ЕЛФ датотеци. Листа прекидача је сразмерно дуга и покрива све аспекте ЕЛФ формата. Коришћење прекидача -н (скраћено од -нотес) На списку 7 приказани су само одељци белешки који постоје у додиру датотеке - ознака верзије АБИ и битстринг ИД-а градње.

.Списак 7: Прикажите изабране одељке ЕЛФ датотеке

$ реаделф -н / уср / бин / тоуцх
Приказивање напомена пронађених у помаку датотеке 0к00000254 дужине 0к00000020:
Власничка величина података Опис
ГНУ 0к00000010 НТ_ГНУ_АБИ_ТАГ (ознака верзије АБИ)
ОС: Линук, АБИ: 2.6.32
Приказивање напомена пронађених у помаку датотеке 0к00000274 дужине 0к00000024:
Власничка величина података Опис
ГНУ 0к00000014 НТ_ГНУ_БУИЛД_ИД (јединствени битстринг ИД-а градње)
ИД верзије: ец08д609е9е8е73д4бе6134541а472ад0еа34502

Имајте на уму да под Соларис и ФрееБСД услужни програм елфдумп [7] одговара реаделф-у. Од 2019. године није било новог издања или ажурирања од 2003. године.

Број три је пакет назван елфутилс [6] који је искључиво доступан за Линук. Пружа алтернативне алате за ГНУ Бинутилс, а такође омогућава потврђивање ЕЛФ датотека. Имајте на уму да сва имена услужних програма наведена у пакету почињу са еу за „елф утилс“.

На крају, али не најмање важно, поменућемо објдумп. Овај алат је сличан реаделф-у, али се фокусира на објектне датотеке. Пружа сличан опсег информација о ЕЛФ датотекама и другим објектним форматима.

.Списак 8: Информације о датотекама издвојио објдумп

$ објдумп -ф / бин / тоуцх
/ бин / тоуцх: формат датотеке елф64-к86-64
архитектура: и386: к86-64, заставе 0к00000112:
ЕКСЕЦ_П, ХАС_СИМС, Д_ПАГЕД
почетна адреса 0к00000000004025е3
$

Постоји и софтверски пакет под називом „елфкицкерс“ [9] који садржи алате за читање садржаја ЕЛФ датотеке, као и за манипулисање њоме. Нажалост, број издања је прилично низак и зато га само помињемо и не показујемо даље примере.

Као програмер, можда ћете погледати 'пак-утилс' [10,11]. Овај скуп услужних програма пружа бројне алате који помажу у валидацији ЕЛФ датотека. Као пример, думпелф анализира ЕЛФ датотеку и враћа датотеку заглавља Ц која садржи детаље - погледајте слику 2.

Закључак

Захваљујући комбинацији паметног дизајна и одличне документације, ЕЛФ формат делује веома добро и још увек је у употреби након 20 година. Горе приказани услужни програми омогућавају вам увид у ЕЛФ датотеку и омогућавају вам да откријете шта програм ради. Ово су први кораци за анализу софтвера - срећно хаковање!

Везе и референце
  • [1] Извршни и повезиви формат (ЕЛФ), Википедиа
  • [2] Фуцхсиа ОС
  • [3] Поређење формата извршних датотека, Википедиа
  • [4] Линук Фоундатион, референциране спецификације
  • [5] Циро Сантилли: Водич за ЕЛФ Хелло Ворлд
  • [6] елфутилс Дебиан пакет
  • [7] елфдумп
  • [8] Мицхаел Боелен: 101 ЕЛФ датотека на Линук-у: Разумевање и анализа
  • [9] елфкицкерс
  • [10] Очврсли / ПаКс услужни програми
  • [11] пак-утилс, пакет Дебиан
Захвалнице

Писац би желео да се захвали Акселу Бекерту на подршци у вези са припремом овог чланка.

Преглед бежичног миша Мицрософт Сцулпт Тоуцх
Недавно сам читао о Мицрософт Сцулпт Тоуцх бежични миш и одлучио да га купи. Након што сам га неко време користио, одлучио сам да са њим поделим своје...
Екран Трацкпад и показивач миша АппиМоусе за Виндовс таблете
Корисницима таблета често недостаје показивач миша, посебно када су уобичајени за коришћење преносних рачунара. Паметни телефони и таблети на додир ос...
Средњи тастер миша не ради у оперативном систему Виндовс 10
Тхе средње дугме миша помаже вам да се крећете кроз дугачке веб странице и екране са пуно података. Ако се то заустави, на крају ћете користити тастат...