Bosh sahifa Wiki Executable

Executable

Executableoperatsion tizim yoki maxsus runtime tomonidan yuklanib, bajarilishi mumkin bo‘lgan dastur fayli. U machine code, bytecode, script yoki boshqa bajariladigan formatda bo‘lishi mumkin.

Kundalik ishlatishda executable ko‘pincha compiler va linker yaratgan native binary’ni bildiradi. Biroq shell script, Java archive yoki runtime launcher orqali ishlaydigan paket ham bajariladigan dastur vazifasini bajarishi mumkin.

Native executable

Native executable ma’lum protsessor architecture’si uchun machine instructionlarni saqlaydi.

Masalan:

  • x86-64;
  • ARM64;
  • RISC-V;
  • Power Architecture.

Bunday fayl boshqa architecture’da emulyator yoki translation qatlami bo‘lmasa ishlamaydi.

Native executable operatsion tizim ABI va file formatiga ham bog‘liq.

File format

Keng tarqalgan executable formatlar:

  • ELFLinux va ko‘p Unix-like tizimlar;
  • PE — Windows;
  • Mach-O — macOS va boshqa Apple platformalari;
  • firmware va embedded tizimlarda maxsus image formatlari.

Format loaderga quyidagilarni ko‘rsatadi:

Loader

Executable ishga tushirilganda operatsion tizim loaderi faylni processga aylantiradi.

Jarayon:

  1. file header tekshiriladi;
  2. architecture va format aniqlanadi;
  3. virtual address space yaratiladi;
  4. code va data segmentlari map qilinadi;
  5. dynamic librarylar yuklanadi;
  6. relocation bajariladi;
  7. stack, argument va environment tayyorlanadi;
  8. entry pointga boshqaruv beriladi.

Executable faylning o‘zi process emas. U ishga tushirilgandan keyin process instance paydo bo‘ladi.

Entry point

Entry point bajarilish boshlanadigan manzil.

C dasturida developer main() funksiyasini yozadi, ammo loader ko‘pincha avval runtime startup kodiga o‘tadi.

Startup code:

  • argumentlarni tayyorlaydi;
  • runtime’ni boshlaydi;
  • global constructorlarni chaqiradi;
  • main()ni ishga tushiradi;
  • return qiymatini process exit code’ga aylantiradi;
  • cleanup bajaradi.

Shu sababli executable entry point har doim source’dagi mainning o‘zi emas.

Segmentlar

Executable memoryga bir nechta segment sifatida yuklanadi.

Text segment

Machine instructionlar. Odatda read va execute huquqiga ega, write huquqi yo‘q.

Read-only data

String literal va o‘zgarmas constantlar.

Data segment

Boshlang‘ich qiymatga ega writable global ma’lumot.

BSS

Boshlang‘ich qiymati nol bo‘lgan global ma’lumot. Faylda to‘liq nol baytlar saqlanmasligi mumkin.

Dynamic segment

Loader va dynamic linker uchun dependency va relocation ma’lumoti.

Dynamic executable

Dynamic executable tashqi shared librarylarga tayanadi.

Afzalliklari:

Kamchiliklari:

Dependencylar ldd, PE import table yoki platformaga mos vosita bilan ko‘riladi.

Static executable

Static linking kerakli library code’ni executable ichiga qo‘shadi.

Afzalliklari:

Kamchiliklari:

  • fayl kattaroq;
  • library security patchi uchun qayta build;
  • ayrim system integratsiyalari baribir dynamic bo‘lishi mumkin;
  • license shartlari.

Position-independent executable

ASLR uchun executable turli virtual manzilda yuklana olishi kerak.

PIE code absolut manzilga qattiq bog‘lanmasdan ishlaydi.

Loader har ishga tushishda base address’ni o‘zgartirishi mumkin.

Bu exploitationni qiyinlashtiradi, ammo xotira xatolarini yo‘q qilmaydi.

Executable permission

Unix-like tizimda file mode executable bitga ega bo‘lishi kerak.

-rwxr-xr-x

Biroq permissionning o‘zi fayl formatini bajariladigan qilmaydi.

Noto‘g‘ri format:

Exec format error

xatosini berishi mumkin.

Windows ko‘pincha file extension va PE header orqali formatni aniqlaydi.

Shebang

Scriptning birinchi qatori interpreter yo‘lini ko‘rsatishi mumkin.

#!/usr/bin/env python3

Kernel yoki launcher scriptni shu interpreterga argument sifatida uzatadi.

Shebang:

talab qiladi.

Argument va environment

Executable processga aylanganda command-line argumentlar va environment variable’lar beriladi.

Native startup ularni argc, argv yoki runtime’ga mos objectlarga aylantiradi.

Argument va environment maxfiy ma’lumot uchun ehtiyotkorlik bilan ishlatiladi, chunki process listing, crash report yoki logda ko‘rinishi mumkin.

Exit code

Executable tugaganda operatsion tizimga exit status qaytaradi.

Umumiy convention:

  • 0 — muvaffaqiyat;
  • boshqa qiymat — xato yoki maxsus natija.

Signal bilan tugash alohida qayd etiladi.

CLI automation exit code orqali qaror qiladi.

Debug symbol

Release executable’dan debug symbol olib tashlanishi mumkin.

Symbol:

beradi.

Alohida symbol artifact aniq build ID bilan saqlanadi.

Code signing

Executable digital signature bilan imzolanishi mumkin.

Platforma:

  • publisher;
  • certificate;
  • file integrity;
  • timestamp;
  • trust chain

ni tekshiradi.

Signature zararli publisherni “yaxshi” qilmaydi, ammo fayl kim tomonidan chiqarilganini va o‘zgarmaganini tasdiqlaydi.

Architecture mosligi

Executable header target architecture’ni bildiradi.

64-bit OS ayrim 32-bit executable’larni compatibility layer bilan ishlatishi mumkin.

ARM64 tizim x86-64 binary’ni emulyatsiya yoki translation orqali bajarishi mumkin, ammo native librarylar ham mos bo‘lishi kerak.

Diagnostika

Executable ishga tushmasa quyidagilar tekshiriladi:

“File not found” xatosi executable mavjud bo‘lsa ham uning interpreter yoki dynamic loaderi topilmaganini anglatishi mumkin.

Bog‘liq tushunchalar

Binary, ELF, PE, Mach-O, Loader, Entry point, Dynamic linking, Static linking, Process, Code signing