Можно ли преобразовать двоичный исполняемый файл в исходный код и другие файлы?
Почти так, как просит название. Например, если бы я взял диск Playstation, можно ли написать программу, которая преобразует весь двоичный файл на диске обратно в исходные файлы кода, художественные ресурсы и т. Д.? Разве это не просто как расшифровка? Если нет, то возможно ли сделать язык или добавить код к нашим текущим языкам, который позволил бы будущим программам конвертировать в обратном направлении? Спасибо!
3 ответа
Давайте успокоимся.
Предположим, вы знаете, что x^2 = 4
, вы не можете сказать, х был 2 или -2.
Точно так же у вас есть двоичный исполняемый код или код сборки, вы не можете сказать, на каком языке он был написан.
Но вы можете конвертировать двоичный файл в код сборки. Есть много хороших инструментов для Linux и Windows, как платных, так и бесплатных. Их называют дизассемблерами. Вы можете использовать их, чтобы увидеть, что делает программа, и даже можете изменить ее во время выполнения.
В некоторых случаях да, вы можете получить исходный или почти исходный набор кода обратно из исполняемого файла или скрипта. На некоторых платформах разработки проще делать то, что называется декомпиляцией. Для декомпиляции используется специальный инструмент, называемый декомпилятором для определенного языка, и он попытается по существу выполнить реинжиниринг программы, чтобы вы могли получить код, который выполняет реальная программа. Вероятно, он будет немного отличаться, так как не будет никаких комментариев, и способ его компиляции может отличаться от того, как он был написан (например, оптимизации, сгенерированный компилятором код).
Это намного проще, особенно если код скомпилирован в байт-коды, как в Java (то есть Java-байт-код) для JVM или.NET CLI (который является JIT- редактором, но это другая история). В случае Playstation я бы предположил, что большинство игр, вероятно, будут написаны на C++. В случае с C или C++ нет простого способа декомпилировать его, поскольку его вывод - это прямой машинный код, который работает прямо на процессоре. Да, вы можете превратить его в ассемблерный код с дизассемблером и прочитать его самостоятельно, но ничто не близко к исходному высокоуровневому языковому коду. Вы можете как-то назвать это "шифрованием", и да, возможно "расшифровать его", сильно переработав код, который мог бы занять годы с тем, насколько большими и сложными являются игры в наши дни.
Возможно, вы сможете получить активы, но вам придется выяснить, в каком формате они хранятся и действительно ли они зашифрованы или что-то в этом роде.
Кроме того, диски Playstation, вероятно, хранятся в собственном формате, что означает, что Sony не хочет, чтобы вы выясняли, как данные форматируются и хранятся, и не является общедоступной информацией, передаваемой Sony (но, конечно, это не мешает людям пытаться повернуть вспять). инженер это)
ТЛ; др:
- Код, вероятно, написан на C++, который невозможно декомпилировать в исходный код.
- Если вы не хотите тратить годы на чтение ассемблерного кода, очень маловероятно, что вы сможете получить оригинальный код.
- Тем не менее, существуют другие языки, которые не компилируются в ассемблерный код или машинный код, а выполняются в форме байт-кодов, сценариев или чего-то еще. Это включает
- По сути все скриптовые языки
- Языки JVM - например, Java, Scala
- Языки CLR - например, C#, VB.NET, F#
- Другие интерпретаторы байт-кода или JIT-языки в целом
- Я уверен, что Sony использует собственный формат, означающий, что, скорее всего, он не использует только стандартный формат файлов DVD. Другими словами, вы не должны ожидать, что сможете вставить его в дисковод DVD на вашем компьютере и ожидать, что он сможет прочитать его.
тл; др мой тл; др:
Извините, но сегодня этого не происходит. Я предлагаю подождать до следующего тысячелетия и посмотреть, как оно пройдет.
Просто нет. Вы не можете преобразовать двоичный код 1 в 1 в исходный код на C++ или что-то подобное. Но вы можете сделать обратный инжиниринг.