Bosh sahifa Wiki Disassembly

Disassembly

Disassembly — mashina kodi baytlarini protsessorning assembly ko‘rsatmalariga aylantirish jarayonidir. Disassembler executable, obyekt fayl, xotira dumpi yoki ishlayotgan jarayon kodini o‘qib, opcode va operandlarni mnemonik shaklda ko‘rsatadi. Natija asl assembly manbasiga aynan teng emas, chunki komment, makro, label nomlari va yuqori darajali tuzilma kompilyatsiyada yo‘qoladi.

Ko‘rsatma chegaralari

Fixed-length ISA’da ko‘rsatmalarni ajratish nisbatan sodda. Variable-length arxitekturada bir bayt offsetdan noto‘g‘ri boshlash keyingi barcha dekodlashni o‘zgartiradi va baribir sintaktik yaroqli ko‘rsatmalar hosil qilishi mumkin. Executable section metadata va control-flow entry pointlar kod chegarasini topishga yordam beradi.

Linear sweep sectionni boshidan oxirigacha ketma-ket dekodlaydi. Recursive traversal esa entry pointdan branch va call maqsadlarini kuzatadi. Birinchisi inline ma’lumotni kod deb qabul qilishi, ikkinchisi bilvosita jump orqali yetiladigan kodni o‘tkazib yuborishi mumkin. Amaliy vositalar relocation, symbol va exception metadata bilan ikkala usulni birlashtiradi.

Symbol va annotatsiya

Symbol mavjud bo‘lsa, xom manzil o‘rniga funksiya nomi va relocation maqsadi ko‘rsatiladi. Debug ma’lumoti source qatorlarini instruction diapazoniga bog‘laydi. Compiler yaratgan control-flow graph, calling convention va stack frame naqshi funksiyalarni tushunishga yordam beradi. Stripped binarda tahlilchi importlar, konstantalar va xulqdan ma’no chiqaradi.

Disassembly sintaksisi vositaga qarab farq qiladi. Bir xil x86 kodi Intel yoki AT&T operand tartibida ko‘rsatilishi mumkin. Pseudo-instruction ayrim haqiqiy ko‘rsatmalarni qulay nomga birlashtiradi. Shuning uchun tahlil hisobotida ISA rejimi, endianness va sintaksis ko‘rsatiladi.

Qo‘llanish

Dasturchi compiler optimizatsiyasi, SIMD tanlovi yoki keraksiz allocationni tekshirish uchun hot funksiya disassembly’sini ko‘radi. Crash tahlilida instruction pointer atrofidagi kod, registrlar va faulting xotira murojaati sababni ko‘rsatadi. Xavfsizlik mutaxassisi zararli binar, exploit ta’siri yoki patch farqini tahlil qiladi. Bu ish qonuniy vakolat va xavfsiz izolyatsiyalangan muhitda bajariladi.

Disassembly statik ko‘rinish beradi; runtime’da self-modifying code, JIT, unpacking yoki dinamik branch maqsadi boshqacha bo‘lishi mumkin. Debugger va trace dinamik xulqni to‘ldiradi. Xotiradagi kod breakpoint traplari yoki hot patch sabab diskdagi binardan farqlanishi mumkin.

Cheklovlar

Assemblyni ko‘rish source algoritmni avtomatik tiklamaydi. Register reuse, inlining va optimizatsiya semantik chegaralarni yo‘qotadi. Decompiler yuqori darajali taxminiy pseudocode yaratishi mumkin, lekin nom va type’lar to‘liq bo‘lmasa natija tekshirishni talab qiladi. Disassembler parserining o‘zi ishonchsiz binarni o‘qiydi; u yangilangan, sandboxlangan muhitda ishlatiladi.

+## Patch taqqoslash

Ikki binar buildni disassembly darajasida solishtirish security patch qaysi control-flow yoki constantni o‘zgartirganini ko‘rsatishi mumkin. Biroq compiler versiyasi, link tartibi va manzil randomizatsiyasi juda ko‘p ahamiyatsiz farq yaratadi. Function hash, normalized instruction va source-matched build shovqinni kamaytiradi. Binary diff yangi branchni topgani zaiflik to‘liq tuzatilganini isbotlamaydi; kirish validatsiyasi va test natijasi bilan birga baholanadi. Patchni tahlil qilishdan olingan texnik tafsilotlar himoyachilarga yangilanish ustuvorligini belgilashda yordam beradi, ammo ekspluatatsiya ko‘rsatmasini tarqatishdan oldin mas’ul oshkor qilish va foydalanuvchilarga patch yetib borishi hisobga olinadi.

Position-independent koddagi bilvosita call maqsadi GOT yoki relocation ma’lumotisiz faqat register orqali ko‘rinadi. Tahlilchi loader hal qiladigan symbolni obyekt metadata’sidan oladi. Runtime patching va interposition sabab statik topilgan maqsad amalda boshqa funksiya bo‘lishi mumkin.

Bog‘liq tushunchalar

Machine code, Assembly language, Disassembler, Debug symbol, Reverse engineering, Decompiler, Control-flow graph