При запуске приложения с этим флагом в консоли вы увидите нечто такое:
Для нетренированного глаза эти строки выглядят как китайская грамота. -XX:+PrintAssembly распечатывает ВСЁ, но смотреть ВЕСЬ машинный код ВСЕХ методов ВСЕГО приложения не имеет большого смысла. Чтобы увидеть машинный код только критического участка, надо воспользоваться другим диагностическим флагом-параметром:
-XX:CompileCommand
Например, я хочу посмотреть машинный код метода addNumbers в моем классе Demo. Параметр запуска будет выглядеть так:
-XX:CompileCommand=print,Demo.addNumbers
Метод вызывается 1 миллион раз. Таким образом, его сначала его компилирует компилятор C1, а затем — компилятор C2. В результате в консоли я увижу:
Я запускал свое приложение на JDK 15 на Intel Core i-5-6400T. У вас машинный код может получиться другой.
Ассемблерный код
Все равно, выдаваемый результат не имеет никакого смысла. Ведь все, что мы видим на экране это hex-коды машинного кода с адресами памяти. Для того, чтобы преобразовать их в ассемблерные инструкции, требуется дополнительная библиотека hsdis. Эта библиотека поставляется в исходниках jdk. Она не распространяется отдельно.
Visual studio где exe. Как сделать exe файл в visual studio. Как скомпилировать cpp в exe. Урок #20.
Ее можно собрать самостоятельно для windows или для linux. Если поместить эту библиотеку в bin папку jdk, и запустить программу с вышеуказанными параметрами, на экране выведется полноценный читаемый ассемблерный код с комментариями. Например,
Этот листинг уже может прочитать человек, и выяснить, что именно сделал JIT компилятор. Это пригодится для отладки какого-то критического участка вашего приложения, где вы точно хотите быть уверены, что генерируемый код соответствует вашим ожиданиям.
Кэш скопилированного кода
Код, который генерируют компиляторы C1 и C2 во время своей работы кэширется во внутренней структуре JVM, которая называется CodeCache.
Кэш имеет определенный размер. Посмотреть размеры кэша по умолчанию и другие параметры связанные с эшем можно запустив приложение с флагом -XX:+PrintFlagsFinal и отфильтровав строки по подстроке CodeCache.
По мере работы приложения и «прогрева кода» CodeCache заполняется, и в конце концов в кэше может не остаться места. В этом случае JVM сбрасывает ненужный код и на освободившееся место записывает новый. Этот процесс называется CodeCacheFlushing. Эта информация важна для достижения low-latency:
- На сброс кода требуется время, что может вызвать задержки
- Сброшенный «старый код» может оказаться важным для какой-то задачи через несколько минут. В этом случае ваш код будет исполняться в режиме интерпретации, т.е. значительно медленнее, чем хотелось бы. А после какого-то времени JIT-компилятор начнет компилировать этот участок кода, а потом снова замещать интерпретированный участок на компилированный. На это тоже уйдет время и может вызвать нежелательные задержки при работе программы.
Поэтому в приложениях, где latency критично, рекомендуется отключать сброс кэша кода с помощью флага -XX:-UseCodeCacheFlushing. В этом случае, все что накомпилируют компиляторы C1 и C2 навечно останется в кэше. Если место к кэше кончится и свободного места для нового кода не будет, компиляция прекратится и оставшийся неоткомпиллированный код будет исполняться в режиме интерпретации. Чтобы этого не произошло, выставляйте размер кэша кода как можно большим, подбирая оптимальный размер экспериментальным путем с помощью флагов -XX:InitialCodeCacheSize и -XX:ReservedCodeCacheSize.
КАК ДЕКОМПИЛИРОВАТЬ EXE DLL C# | КАК УЗНАТЬ ИСХОДНЫЙ КОД ПРОГРАММЫ | ДЕКОМПИЛЯЦИЯ | C# ПЛЮШКИ
Начиная с Java 8 в JVM включена ступенчатая, поэтапная компиляция (tiered compilation). Если она включена, область памяти под кэш кода должна быть по-больше. Если ступенчатая компиляция отключена — по-меньше. Изменение размера делается автоматически в JVM, если размер кэша не выставлен явно с помощью параметров.
Посмотреть на размер и использование кэша можно с помощью этих флагов:
- -XX:+PrintCodeCache — распечатает общую информацию о кэше кода при завершении работы приложения
- -XX:+PrintCodeCacheOnCompilation — будет выводить информацию о состоянии кэша кода при каждой компиляции
Ссылки
- Документация в Wiki на сайте OpenJDK
- Профилирование с точностью до ассемблерных инструкций
Источник: algodma.wordpress.com
Как найти язык, с которого был скомпилирован исполняемый файл?
Имея исполняемый файл (Windows, Linux или Mac OS X) приложения, есть ли способ определить язык программирования, который использовался для написания этого приложения?
задан 16 сен ’11, 02:09
Возможный дубликат — stackoverflow.com/questions/1704202/…. В большинстве случаев будут «отличительные» особенности, но это не будет тривиально — например, нет стандартного заголовка метаданных с отметкой о языке, компиляторе, версии и т. Д. — StuartLC
3 ответы
В общем случае, думаю, нет. Однако в конкретном случае это возможно.
Вы можете дать неквалифицированный нет до Генеральная case, потому что я могу разработать два простых языка прямо сейчас и сделать компиляторы для каждого, которые будут генерировать одни и те же исполняемые файлы для «похожих» программ на каждом языке. — Рэй Тоул
Весьма маловероятно, если с ним не связаны какие-то конкретные метаданные или какая-то языковая функция, связанная с этим исполняемым файлом. Исполняемые файлы (обычно) — это код, скомпилированный для конкретной платформы или промежуточный код, который будет своевременно скомпилирован для определенного языка. В случае JIT-кода вы можете определить, является ли это .NET или каким-либо другим языком, который производит промежуточный код, но по большей части это довольно сложная и неразумная задача. Я могу ошибаться, но, насколько я понимаю, это невозможно.
С таким же успехом я мог бы дать поздний ответ.
Даже если компилятор для данного языка программирования решит выбросить некоторые метаданные, такие как символы, в разделе данных с сообщением типа «Скомпилировано из компилятора C Джо версии 4.1.104», ничего — ничто не мешает мне написать компилятор Go который записывает одно и то же сообщение в одно и то же место в разделе данных, чтобы обмануть ничего не подозревающих людей, смотрящих на исполняемый файл.
Не говоря уже о том, что существует бесконечное количество компиляторов, которые можно написать для любого данного языка.
И предположим, что мы смотрим на исполняемый файл, содержащий всего несколько байтов . не говоря уже о инкременте регистра. Сотни разных языков допускают компиляторы, которые теоретически могут оптимизироваться до исполняемого файла с одним разделом без метаданных.
Ответ просто нет.
TL; DR: Вы всегда можете обмануть.
Источник: stackovergo.com
10 способов определить, скомпилировано ли приложение для 32-разрядной или 64-разрядной системы
Для операционной системы Windows есть две разные архитектуры: 32-разрядная или 64-разрядная, также известная как x86 или x64. Несмотря на то, что практическое правило установки 64-битной Windows применяется в основном для компьютеров с объемом памяти более 4 ГБ, вы обнаружите, что сегодня это не так, поскольку фирменные компьютеры, такие как Dell, уже предварительно устанавливают 64-битную Windows 10 на бюджетный компьютер с 2 ГБ оперативной памяти. Для повышения производительности рекомендуется использовать 64-разрядные приложения в 64-разрядной операционной системе Windows, хотя 32-разрядные также будут работать нормально.
Однако обратите внимание, что попытка запустить 64-битное приложение в 32-битной Windows сообщит об общей ошибке: «Это приложение не может работать на вашем компьютере. Чтобы найти версию для вашего ПК, свяжитесь с издателем программного обеспечения.»
Не все программы поставляются как с 32-разрядными, так и с 64-разрядными сборками, поэтому доступность 64-разрядного приложения во многом будет зависеть от разработчика или доверенной третьей стороны для перекомпиляции исходного кода. Из того, что мы знаем, простая перекомпиляция исходного кода для 64-битной сборки не сильно помогает в производительности, потому что исходный код должен регистрировать новое оборудование и инструкции, которые недоступны в 32-битной версии Windows.
Если вы хотите определить, является ли конкретное приложение 32-битной или 64-битной сборкой, здесь у нас есть 10 способов проанализировать файл с помощью некоторых методов, которые даже не нужны для запуска программы.
1. PeStudio
PeStudio на самом деле является мощным инструментом для обнаружения аномалий в приложении, которые обычно встречаются во вредоносном программном обеспечении и постоянно развиваются с 2009 года. Его также достаточно просто использовать, просто загрузив файл в PeStudio для автоматического анализа и, как вы можете Посмотрите на скриншот ниже, вы можете легко определить, является ли анализируемый исполняемый файл 32-битным или 64-битным приложением, взглянув на строку ЦП.
Преимущество PeStudio в том, что вы можете анализировать любые файлы, не запуская подозрительные файлы, что обеспечивает безопасность вашего компьютера. Он также поставляется со встроенным сканером VirusTotal. PeStudio является портативным и бесплатным для частного некоммерческого использования.
Скачать PeStudio
2. InspectExe
InspectExe работает немного иначе, чем PeStudio, о котором мы упоминали выше, интегрируясь непосредственно в Windows. Дополнительную информацию о программе можно просмотреть, проверив окно свойств программы в меню правой кнопки мыши. Щелкните правой кнопкой мыши по любому исполняемому файлу, выберите «Свойства», и вы найдете несколько дополнительных вкладок, таких как InspectExe, Manifest, Imports, Sections and Resources. Чтобы определить, является ли файл 64-битной программой, просто обратитесь к информации на вкладке InspectExe.
InspectExe – это бесплатное приложение, но полная версия, предлагающая дополнительные функции предварительного просмотра ресурсов в исполняемом файле, доступна для покупки за 12 долларов. Если вы обнаружите, что очень часто проверяете ресурсы исполняемых файлов, InspectExe будет очень удобным инструментом.
Скачать InspectExe
3. MiTeC EXE Explorer
MiTeC EXE Explorer также является бесплатным и работает на Windows 2000 вплоть до текущей Windows 10.
Скачать MiTeC EXE Explorer
4. SigCheck
Sigcheck от Sysinternals – это простой инструмент командной строки, который отображает версию файла, подпись и неожиданно вместе с информацией, является ли файл 32-битной или 64-битной программой. Интересно, что они также включили функцию проверки статуса файла в VirusTotal.
Существует сторонний графический интерфейс для Sigcheck, называемый Sigcheck. SigcheckGUI который более удобен для людей, которые не знакомы с использованием командной строки. Вы можете легко добавить несколько файлов, папок и даже запущенных процессов для сканирования.
Скачать Sigcheck | Скачать SigcheckGUI
5. 64-битный детектор EXE
64-битный детектор EXE – еще один бесплатный инструмент, созданный SecurityXploded, группой, выпустившей более ста полезных инструментов. Это простой инструмент командной строки, который используется только для определения, является ли конкретный исполняемый файл 32-разрядным или 64-разрядным.
Первоначально мы не могли заставить этот инструмент работать, и после дальнейшего тестирования мы обнаружили, что этот инструмент должен вызываться из командной строки с повышенными привилегиями UAC, иначе программа будет остановлена без отображения какой-либо информации.
Скачать EXE 64-битный детектор
6. 7-Zip
Большинство людей распознало бы программное обеспечение 7-Zip как программу архивирования файлов для извлечения или сжатия нескольких файлов в один файл. Однако большинство людей не осознают, что версия 7-Zip для командной строки (7z.exe) может извлекать и отображать информацию PE-заголовка для исполняемой программы с помощью переключателя (l).
Для 7-Zip, безусловно, очень полезно иметь эту функцию, потому что 7-Zip обычно устанавливают на компьютерах с Windows, поскольку он является одним из самых популярных архиваторов, если не самым популярным. В противном случае вы также можете загрузить отдельную версию 7-Zip для командной строки и носить ее с собой на USB-накопителе.
Скачать 7-Zip
7. VirusTotal
VirusTotal – это популярный бесплатный онлайн-сервис для сканирования загруженных файлов с использованием более 50 различных антивирусных программ. Если вы более подробно изучите результаты сканирования, вы найдете много другой информации об анализируемой программе, включая информацию о том, предназначена ли эта программа для 32-разрядных или 64-разрядных компьютеров. Все, что вам нужно сделать, это перейти на вкладку «Сведения о файле» и обратиться к области основной информации PE-заголовка.
Как вы можете видеть на скриншоте выше, VirusTotal показывает, что загруженная программа представляет собой приложение x64, которое также эквивалентно 64-разрядному. Что касается 32-разрядных, он будет отображаться как x86. Этот метод может быть не лучшим решением, если размер файла программы, которую вы хотите проанализировать, велик, поскольку максимальный размер файла VirusTotal составляет 128 МБ.
Посетите VirusTotal
8. Диспетчер задач
Для программы, которая уже запущена, вы можете на самом деле проверить из диспетчера задач, 32-битное или 64-битное приложение. Нажмите одновременно клавиши Ctrl + Shift + Esc, чтобы запустить диспетчер задач, нажмите кнопку «Подробнее», расположенную внизу слева. Перейдите на вкладку «Подробности», щелкните правой кнопкой мыши заголовок столбца и выберите «Выберите столбцы«. Прокрутите вправо до нижней части окна выбора столбцов и отметьте Платформа флажок с последующим нажатием кнопки ОК. Теперь вы увидите дополнительный столбец Platform, в котором отображается, является ли запущенный процесс 32-разрядной или 64-разрядной программой.
Хотя этот метод не зависит от какого-либо стороннего программного обеспечения или онлайн-сервисов, он имеет недостаток, заключающийся в том, что программа должна быть запущена для отображения в диспетчере задач. Очевидно, есть некоторый риск, если вы пытаетесь определить сборку для неизвестной программы.
9. Блокнот
Хотите верьте, хотите нет, но вы можете определить, является ли исполняемая программа 32-разрядной или 64-разрядной, загрузив ее в Блокнот. Запустите Блокнот, перетащите программу, которую вы хотите проверить, в Блокнот. Вы должны увидеть много неизвестных и бессмысленных символов в блокноте, что нормально. Теперь нажмите Ctrl + F, чтобы открыть диалоговое окно «Найти» в «Блокноте», введите PE в текстовое поле «найти что» и нажмите кнопку «Найти далее». При первом результате обратите внимание на первый символ после PE и несколько пробелов. Для 32-битной программы вы увидите букву L,
Что касается 64-битной программы, то она покажет букву d с кинжалом †.
Прежде чем попробовать этот метод, имейте в виду, что загрузка файла огромного размера замедлит работу компьютера и, возможно, приведет к падению Notepad.
10. Ссылка на вкладку «Совместимость»
Другой интересный способ определить, является ли исполняемый файл 32-разрядным или 64-разрядным, – это просмотреть список операционных систем Windows, доступных для выбора на вкладке совместимости в окне свойств файла. Сначала щелкните правой кнопкой мыши программу, которую вы хотите проанализировать, выберите Свойства и перейдите к Совместимость Вкладка. Установите флажок «Запустить эту программу в режиме совместимости для» и щелкните раскрывающееся меню, в котором будет показан список операционных систем Windows.
64-разрядные программы будут показывать только Windows Vista и выше.
Хотя 32-битные программы позволят вам вернуться обратно в Windows 95.
Этот вариант имеет большой смысл, потому что, хотя существует 64-разрядная версия для Windows XP, она не использовалась широко. Таким образом, Windows позволяет вам запускать только 64-битную программу в режиме совместимости для Vista и выше, в то время как 32-битная используется с Windows 95.
Источник: culhu.ru