Определить исходный язык от двоичного файла?

Запуск с Python 3.6, форматирующего в Python, может быть сделан с помощью литералы отформатированной строки или струны фа :

hours, minutes, seconds = 6, 56, 33
f'{hours:02}:{minutes:02}:{seconds:02} {"pm" if hours > 12 else "am"}'

или str.format функция, запускающаяся с 2,7:

"{:02}:{:02}:{:02} {}".format(hours, minutes, seconds, "pm" if hours > 12 else "am")

или строка, форматирующая % оператор для еще более старых версий Python, но см. примечание в документах:

"%02d:%02d:%02d" % (hours, minutes, seconds)

И для Вашего конкретного случая форматирования времени, there’s time.strftime:

import time

t = (0, 0, 0, hours, minutes, seconds, 0, 0, 0)
time.strftime('%I:%M:%S %p', t)

10
задан Community 23 May 2017 в 12:17
поделиться

7 ответов

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

Строго говоря, однако, то, о чем вы спрашиваете, невозможно. Может случиться так, что кто-то сел с ручкой и бумагой и разработал двоичные коды, соответствующие программе, которую они хотели написать, а затем напечатал этот материал в шестнадцатеричном редакторе. По сути, они будут программировать на ассемблере без ассемблера. Точно так же вы никогда не сможете с уверенностью сказать, был ли собственный двоичный код написан на прямом ассемблере или на C с встроенной сборкой.

Что касается сред виртуальных машин, таких как JVM и .NET, Я ожидал, что вы сможете идентифицировать виртуальную машину по байтовым кодам в двоичном исполняемом файле. Однако вы не сможете определить, какой был исходный язык, например C # или Visual Basic, если только нет особых особенностей компилятора, которые вам подсказывают.

7
ответ дан 3 December 2019 в 16:53
поделиться

Краткий ответ: ДА

Длинный ответ:

Если вы посмотрите на двоичный файл, вы можете найти имена библиотек, которые были связаны. Открытие cmd.exe в TextPad легко находит следующее с шестнадцатеричным смещением 0x270: msvcrt.dll, KERNEL32.dll, NTDLL.DLL, USER32.dll и т. д. msvcrt - это функции поддержки среды выполнения Microsoft 'C'. KERNEL32, NTDLL и USER32. dll - это библиотеки, специфичные для ОС, которые сообщают вам либо целевую платформу, либо платформу, на которой она была построена, в зависимости от того, насколько хорошо кроссплатформенная среда разработки разделяет их.

Если отбросить эти подсказки, можно сказать, что любой компилятор c / c ++ Придется вставить имена функций в двоичный файл, есть список всех функций (или точек входа), хранящихся в таблице. C ++ "искажает" имена функций для кодирования аргументов и их типов для поддержки перегруженных методов. Имена функций можно скрыть, но они все равно будут существовать. Сигнатуры функций будут включать количество и типы аргументов, которые можно использовать для отслеживания в системе или внутренних вызовов, используемых в программе. По смещению 0x4190 стоит "SetThreadUILanguage" который можно найти, чтобы узнать много нового о среде разработки . Я нашел таблицу точек входа по смещению 0x1ED8A. Я легко мог видеть такие имена, как printf, exit и scanf; вместе с __p__fmode, __p__commode и __initenv

Любой исполняемый файл для процессора x86 будет иметь сегмент данных, который будет содержать любой статический текст, который был включен в программу. Обратно к cmd.exe (смещение 0x42C8) находится текст «Software.Policies.Microsoft.Windows.System». Строка занимает вдвое больше символов, чем обычно необходимо, потому что она хранилась с использованием символов двойной ширины, вероятно, для интернационализации. Коды ошибок или сообщения являются здесь основным источником.

По смещению B1B0 стоит "pushd", за которым следуют mkdir, rmdir, chdir, md, rd и cd; Я оставил непечатаемые символы для удобства чтения. Это все аргументы команды для cmd.exe.

Для других программ мне иногда удавалось найти путь, по которому программа была скомпилирована.

Итак, да , это возможно для определения исходного языка из двоичного файла.

14
ответ дан 3 December 2019 в 16:53
поделиться

Я ожидаю, что вы сможете, если дизассемблируете исходный код или, по крайней мере, знаете компилятор, поскольку не все компиляторы будут использовать один и тот же код для printf , например, поэтому Objective-C и GNU C здесь должны отличаться.

Вы исключили все языки с байтовым кодом, поэтому эта проблема будет менее распространенной, чем ожидалось.

1
ответ дан 3 December 2019 в 16:53
поделиться

Нет, байт-код не зависит от языка. Различные компиляторы могут даже использовать один и тот же исходный код и создавать разные двоичные файлы. Вот почему вы не видите декомпиляторов общего назначения, которые работают с двоичными файлами.

0
ответ дан 3 December 2019 в 16:53
поделиться

Ну, C изначально преобразован в ASM, поэтому вы можете писать весь код C в ASM.

0
ответ дан 3 December 2019 в 16:53
поделиться

Сначала запустите what на некоторых двоичных файлах и посмотрите на результат. Идентификаторы CVS (и SVN) разбросаны по всему двоичному образу. И большинство из них взяты из библиотек.

Кроме того, часто существует «карта» для различных функций библиотеки. Это тоже большой намек.

Когда библиотеки связаны в исполняемый файл, часто в двоичный файл включается карта с именами и смещениями. Это часть создания «позиционно-независимого кода». Вы не можете просто «связать» различные объектные файлы вместе. Вам нужна карта, и вы должны выполнить поиск при загрузке двоичного файла в память.

Наконец, модуль запуска для C, C ++ (и, как я полагаю, C #) является уникальным для стандартного набора библиотек этого компилятора.

1
ответ дан 3 December 2019 в 16:53
поделиться

Команда 'strings' может использоваться, чтобы получить некоторые подсказки относительно того, какой язык использовался (например, я просто запустил ее на вырезанном двоичном файле для написанного мной приложения C и первых записей он находит библиотеки, связанные исполняемым файлом).

0
ответ дан 3 December 2019 в 16:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: