Чому ми не можемо зрозуміти вміст двійкового файлу після його складання?


11

Наскільки мені відомо, кожна програма складається з пакету інструкцій процесора з деякими певними змінними даних (float, int, char ...) для роботи над процесорами регістрів .

Отже, перше, що я подумав про це (давно), це те, що якщо ви знаєте, що значення ASCII %¨#$¨#(просто випадковий приклад) можна інтерпретувати як адресу реєстру вказівника стека (просто прикладу) x86 процесор. Якщо це правда, щоразу, коли ви виявляєте це "нечитабельне" значення, читаючи вміст бінарного файлу, ви могли інтерпретувати, що реєстр покажчиків стека використовується для управління деякою змінною даних.

На жаль, цього не відбувається. Нижче наведено приклад вмісту ping.exeпрограми з Windows, відкритого за допомогою notepad.exe:

Ping.exe, як показано в Блокноті MS

Це двійковий файл, і його дані незрозумілі для нас людей (це зрозуміло для машин.) Це нікому не має сенсу, навіть якщо вони знають код складання (найнижчий рівень машинної мови.)

Тож, якщо я все правильно зрозумів, міг би хтось пояснити

  1. Чому двійковий код не може повернутися до асемблерського коду, наскільки вони є, глибоко, одне і те ж?
  2. Якщо можна зрозуміти код складання, чому складений двійковий код, що випливає з цього коду, вже не "читабельний"?

12
Можна, вам просто потрібен розбирач .
Девід Шварц

Тож я можу розібрати будь-який .exe файл ??? Я просто знав, що це працює з керованим кодом ...
Diogo

13
Ви можете розібрати будь-який виконуваний файл. Чи можете ви зрозуміти розібраний вихід - інша історія.
Девід Шварц

5
Компіляція або збірка видаляє безліч значущих для людини інформації, таких як імена змінних, мітки гілок тощо. Розбирання отримує потік інструкцій, але ви все ще маєте багато що розібратися.
mpez0

1
Також обфузація коду може перешкоджати розбиранню.
математика

Відповіді:


13

По-перше, регістри не мають адреси. Кожна інструкція на будь-якій мові збірки перекладається на опкод. Опкоди в x86 можуть бути одним, двома, трьома або навіть більше байтами (у деяких інших процесорах вони "фіксованої ширини"). Зазвичай опкод вказує на інструкцію, режим адреси та реєстри, що займаються. "Режим адресації" визначає, чи потрібно більше, ніж опкоду CPU, тобто режим "негайного" адресації означає, що є додаткові дані відразу після (або "негайно після") інструкція для цієї інструкції - "абсолютний" режим адресації означає, що Адреса пам'яті слідує інструкції і використовується цією інструкцією.

Ви можете дізнатися опкод чогось подібного MOV AL,SPчи подібного, а потім шукати його. x86 має безліч інструкцій, які працюють на покажчику стека.

Але будь ласка, киньте користуватися Блокнотом і замість цього скористайтеся шестигранним редактором. Я б рекомендував HxD, хоча є багато інших.

І @David Schwartz вірно. Розбирач буде повторювати файл та переводити опкоди назад у текст, який читається. Те, що ви хочете зробити, цілком можливо.

Однак вам потрібно знати, звідки у файлі починаються інструкції, оскільки якщо ви починаєте з неправильної адреси, деякі дані, які мають бути "операндами" для кодувань (наприклад, інструкції, що приймають адресу операнду чи "аргумент"), можуть бути отримати неправильне тлумачення як опкоди. Знаючи це, потрібно знати формат, у якому виконується виконуваний файл, який для Windows - це "Портативний виконуваний файл" або формат PE (і це часто ELF для систем Linux). Я впевнений, що є розбиральники, які розуміють ПЕ тощо, але я не знаю жодного шаленого.


1
IDA - один із найпоширеніших диспетчерів ПЕ. Працює і з файлами Linux та Mac. Версія 5.0 досі доступна як безкоштовна програма
Скотт Чемберлен

1
> якщо ви починаєте з неправильної адреси, ... може трактуватися неправильно. Ось чому всі випадки %¨#$¨#не обов'язково будуть посиланням на покажчик стека; це може бути просто середина двох різних команд : _3p%¨#і $¨#b5F( _3p   %¨#$¨#   b5F).
Synetech

12

Отже, якщо я все правильно зрозумів

Не зовсім.

Це двійковий файл, і його дані незрозумілі для нас, людей

Зазвичай двійковий файл незрозумілий людині та машині, особливо коли мета файлу невідома. Зауважте, що не всі бінарні файли - це виконувані файли. Дуже багато бінарних файлів - це файли даних, які не містять інструкцій на машині. Ось чому розширення файлів використовуються при іменуванні файлів (в деяких ОС). The. com розширення використовувалося CP / M для позначення виконуваного файлу. The. розширення EXE додано MS-DOS для позначення іншого файлу, що виконується. * nixes використовує атрибут Execute для позначення файлів, які можна виконати, хоча це може бути як сценарій, так і код.

Як уже згадували інші, бінарні файли, що містять числа, повинні переглядатися шістнадцятковим дамп-програмою або шестигранним редактором, а не переглядачем тексту.

є приклад вмісту програми ping.exe

Цей файл насправді є переїзною програмою, і не всі дані у цьому файлі представляють машинний код. Існує інформація про програму, наприклад, які динамічні бібліотеки їй потрібні, які підпрограми повинні бути пов'язані, вимоги до стеку та пам'яті програми та даних та точку входу програми. Операнди адрес у файлі можуть бути відносними значеннями, які потрібно обчислити до абсолютних значень, або посиланнями, які потрібно вирішити.

"Програмний файл", про який ви, мабуть, думаєте, називається двійковим файлом зображень або дампом програмної пам'яті. Такий файл містив би лише машинний код та дані з усіма посиланнями на адресу, правильно встановлені для виконання.

навіть якщо вони знають код складання (найнижчий рівень машинної мови.)

Мова складання не є такою ж, як машинна мова . Типовий (як для виключення комп'ютерів мови високого рівня) процесор приймає машинний код як вхід, по одній інструкції за раз. Операнди - це регістри або адреси чисельної пам'яті. Мова складання - мова вищого рівня, яка може використовувати символьні мітки для розташування інструкцій та змінних, а також замінювати числові оп-коди мнемонікою. Програма мови складання повинна перетворитись на машинну мову / код до того, як вона фактично може бути виконана (як правило, утилітами, що називаються ассемблер, лінкер та завантажувач).

Зворотна операція, демонтаж, може бути виконана на програмних файлах з деяким успіхом і втратою символічної інформації. Розбирання дамп-пам'яті пам'яті або файлу програмного зображення - це більше проб і помилок, оскільки місця розташування коду та даних потрібно визначати вручну.

До речі, є люди, які можуть читати та кодувати (числовий) код машини. Звичайно, це 8-бітний процесор чи мікроконтролер набагато простіше, ніж 32-бітний процесор CISC з десятками режимів адреси пам'яті.


3

Ви не можете побачити належне, призначене кодування двійкового файлу через Блокнот. Перегляньте це для подальшого ознайомлення. Більшість програм редагування тексту не розбирають формати кодування бінарного кодування, і очікується, що вони будуть аналізувати форматування коду символів ASCII.

Таким чином, відкриття бінарного файлу в текстовому редакторі дасть еквівалентні символи ASCII, які не мають сенсу у вихідному форматі двійкових даних, як їх розбирає текстовий редактор. Як уже згадувалося, для перегляду вмісту в чистому двійковому форматі шестигранні редактори та деякі мають бінарні функції.

Ви невірні, що вміст двійкового файлу неможливо зрозуміти. Хоча вони будуть важкими, а в сучасних комп’ютерних архітектурах надзвичайно важко вручну розібрати від бінарних даних до відповідних інструкцій, визнаних процесором для виконання (або емульованих / віртуальних процесорів) тощо, це можна зробити.

Як ви думаєте, як запрограмовані емулятори? Розробнику потрібно знати опкоди, щоб мати змогу запрограмувати вигадану систему для розпізнавання та поведінки, як справжнє обладнання на певному рівні. Документації пояснюють багато архітектури процесорів, і навіть GPU мають їх (хоча і більш секретні).

Ще одне, що слід зазначити, що в нижчих рівнях, хоча і співвідносних, "двійкові дані" насправді не є сукупністю нулів і одиниць, але високі та низькі напруги посилюються / перемикаються через електричну ланцюг як струм.

Бінарний звичайно становить 1: 1 з цим, тому має сенс використовувати систему числення для цього.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.