Можете ли вы извлечь все биты данных и инструкций из исполняемого файла с помощью шестнадцатеричного редактора?

399
bertieb

Кто-то сказал мне, что просмотр двоичного файла программы или подобного в шестнадцатеричном редакторе раскрывает всю сумму данных / инструкций, которые есть у программы. Например, как в игровых хакерах / моддерах старых ретро-игр, таких как Sonic The Hedgehog, исполняемый двоичный файл составляет половину мегабайта (приблизительно).

Это означает, что файл содержит всего лишь 520 000 байт, и, учитывая кодировку, используемую компилятором / сборкой, используемую для получения исполняемого кода для Sega Genesis (двоичные коды операций Motorola 68000), вы можете идти побайтно. байт в шестнадцатеричном файле и редактировать значения кодировки данных / инструкций, используемых в игре (например, контрольную сумму, данные магического числа, инструкции и смещения JUMP / MOVE, записи DATA, такие как жизни и т. д.)?

Это правильно на 100%, или есть какая-то ложь?

2
tl; dr: да, за исключением случаев, когда код был написан для изменения самого себя. grawity 10 лет назад 2
`Двоичный исполняемый файл составляет полмегабайта. Это означает, что файл содержит всего лишь 520 000 байт. Да, еще два пальца (4 288). Synetech 10 лет назад 0

1 ответ на вопрос

1
gronostaj

Ваш жесткий диск - это просто устройство, которое может хранить байты . На аппаратном уровне нет понятия файлов или даже разделов, только байты [1] .

Теперь мы вводим понятие разделов (проверить Введение здесь, если вы хотите знать, почему). Есть таблица разделов, которая также представляет собой набор байтов. Они не имеют смысла, если вы не знаете, как их интерпретировать. Все современные операционные системы используют таблицы разделов, совместимые с MS-DOS [2], поэтому они могут распознавать разделы друг друга. Тем не менее, вы можете просто притвориться, что разделов нет, а есть только байты. Вот что держит жесткий диск.

Каждый раздел должен быть отформатирован в некоторой файловой системе, которая описывает, как файлы сохраняются. Современные версии Windows используют файловую систему NTFS, более старые были основаны на семействе FAT (FAT12, FAT16, FAT32), а установки Linux потребительского уровня обычно используют семейство ext (ext2, ext3, ext4). Файловая система решает, как файлы размещаются на разделе и где находится «оглавление» (и как его интерпретировать). Опять же, это всего лишь байты, если вы не знаете, как их интерпретировать.

Файлы могут иметь дополнительные метаданные (имя, путь, дату создания, дату последнего доступа и т. Д.). В файловой системе указывается, как следует хранить метаданные и как вы можете найти границы файлов, а не как интерпретировать содержимое файлов. Вы должны выяснить, что это за формат файла (подсказка: посмотрите на расширения файлов или магические числа !). Пока вы не знаете формат, это просто куча байтов.

Я хочу сказать, что за хранением файлов нет более глубокой магии. Здесь задействовано много уровней абстракции, но если компьютер может получить доступ к диску на любом из них, он также может позволить вам просматривать или редактировать данные на этом уровне абстракции!

Такие программы, как Paint или Word, работают на самом высоком уровне абстракции, они интерпретируют данные файла в соответствии с форматом . Но шестнадцатеричные редакторы вообще не интерпретируют данные, они останавливаются на уровне файлов и предоставляют вам необработанные байты в шестнадцатеричном формате (это самый удобный формат, который вы можете получить на этом уровне). Интерпретация любого файла = интерпретация его байтов. Так исполняются исполняемые файлы, читаются текстовые файлы или отображаются картинки. Когда процессор выполняет приложение, он видит те же данные, что и шестнадцатеричный редактор. Когда вы открываете JPEG, программа просмотра изображений читает те же данные, что и шестнадцатеричные редакторы!

Похоже, вы заинтересованы в обратном инжиниринге. Есть некоторые инструменты (отладчики, декомпиляторы, дизассемблеры), которые делают этот процесс менее болезненным. Работать с байт-кодом сложно, особенно когда вы имеете дело с процессорами, которые используют инструкции переменной длины (я смотрю на вас, Intel!)


[1] Не совсем, но давайте предположим, что ради простоты. Если вас интересуют подробности, то старые диски использовали схему CHS, которая впоследствии была заменена LBA .

[2] ... или современные GPT, которые хорошо работают с UEFI, но опять же, это не так важно, давайте просто их пропустим. Да, и таблицы MS-DOS чаще называют таблицами разделов MBR .

Строго говоря, процессор не видит ** точно ** те же байты, которые видны в файле образа программы через шестнадцатеричный просмотрщик. Загрузчики программ выполняют перемещение и динамическое связывание во время загрузки. А некоторые форматы исполняемых файлов (например, Linear Executable) имеют возможность сжатия и возможность полностью исключать страницы с нулевым заполнением из образа программы. Это не меняет сути этого ответа, однако. Однако, что изменится, так это то, что вы пропустили использование ресурсов. Спрашивающий действительно спрашивал о редактировании программы ** данных **, и программы для просмотра шестнадцатеричных файлов обычно показывают данные по умолчанию. JdeBP 10 лет назад 0