Ответ от Ra[гуру]
В общем случае задача нерешаема.
Однако в некоторых частных случаях вполне можно определить, каким компилятором была скомпилирована программа.
К примеру в составе mingw есть утилита strings способная извлекать из исполняемого файла текстовые строки. Если программа создана сишным компилятором от микросовта можно найти строку:
Visual C++ CRT
если GCC:
Mingw runtime
если Free Pascal:
FPC 2.6.0
и т. д.
Программы Delphi/Borland C++ Builder часто тянут с собой runtime (всякие dll), в названии которого есть слово «borland».
Программы на C#, VB.NET, С++/CLI тянут .net framework и без него просто не работают.
Упакованные в exe программы на скриптовых языках типа tcl, ruby, python, php можно распаковать и в некоторых случаях даже посмотреть исходники.
Кроме того есть утилита PEiD, которая может по сигнатурам (специфичным участкам кода) определять компилятор, но к сожалению она уже не развивается и не определяет современные компиляторы.
Вопрос — ответ #4 — Как читать исходный код других программ? Зачем?
Поделки криворуких говнокодеров на Delphi/Borland C++ Builder можно спокойно определить на глаз по кривости интерфейса, но если программу в этих средах писал нормальный программист, то на глаз не получится.
ЗЫ:
А собственно зачем это нужно? Если программа работает, не все ли равно на чем она написана?
Ответ от Ёергей Сергеевич Трифонов[гуру]
В нетрезвой
Ответ от А.К. (лично)[гуру]
дизассемблером его и посмотреть какие операнды
Ответ от Serj Diff[гуру]
Никак. Можно попытаться узнать, каким компилятором она была скомпилирована, но вот был ли вызван компилятор из командной строки, из блокнота или из какой то IDE’шки узнать не возможно.
Ответ от 22 ответа[гуру]
Привет! Вот подборка тем с похожими вопросами и ответами на Ваш вопрос: как узнать в какой среде написана программа?
Источник: 22oa.ru
Как определить на каком языке написана программа
ben
Вообще существует явный характер кода.
Допустим, программа не запакована.
Ты лезешь в Олли и смотришь код.
Чаще всего (процентов 60), проги пишут на VC или Delphi (CBuilder и Delphi – один хрен).
VC и Delphi имеют совершенно не похожий код.
У Delphi программ нет оптимизации. Всегда океан лишних команд и куча пустых вызовов (видимо программеры виноваты).
Если ты постоянно встречаешь в коде вот такие вещи:
004076ED |. A3 6866A700 mov dword ptr ds:[A76668], eax ; сохранить EAX в память
004076F2 |. A1 6866A700 mov eax, dword ptr ds:[A76668] ; пустое действие
004076F7 |. A3 DC50A200 mov dword ptr ds:[A250DC], eax ; сохранить EAX в другое место
то это Delphi или Builder.
Так же у Delphi в процедурах есть постоянного вида пролог:
009E2A48 /$ 55 push ebp
009E2A49 |. 8BEC mov ebp, esp
009E2A4B |. 83C4 F4 add esp, сколько-то
КАК ДЕКОМПИЛИРОВАТЬ EXE DLL C# | КАК УЗНАТЬ ИСХОДНЫЙ КОД ПРОГРАММЫ | ДЕКОМПИЛЯЦИЯ | C# ПЛЮШКИ
И стек всегда выравнивается по ходу процедуры не один раз.
Если же прога написана на VC, тут всё зависит от компилятора и метода.
Но часто бывает, что пролога в функциях нет вообще. Стек по ходу функции не ровный и лишь перед выходом приводится в нужный вид.
Так же код из VC использует оптимизацию по стандартным блокам действий. Часто опознаётся оператор switch (читай на wasme) и переодически блоки вроде:
41DDA2 cmp dword ptr ds:[58C870], 1
41DDA9 sbb eax, eax
41DDAB neg eax
41DDAD test dword ptr ds:[ebx+58], eax
Таких блоков в Delphi просто не бывает. Код Delphi вообще использует значительно меньше команд Асма. Так же оптимизация 4+1+1 (читай о процессоре) и т.п.
Выходит 60% не пакованных прог можно определить сразу.
БОльшая часть оставшихся это:
BAISC (чаще всего p-code)
VC c MFC (тут код тоже видно сразу)
И разного рода C++.
С BAISC’ом по коду сложнее. Если p-code, в Olly он опознаётся как запакованная прога (на чём обламываются некоторые чайники).
Но в целом, пару недель в отладчике на разных примерах – и ты будешь сам всё определять .
А вот пакованные проги определяются по особенностям файла в PE-формате.
Источник: exelab.one
Как узнать на каком языке написана программа
Ну как же можно пройти мимо незапертой двери с большой надписью СЕКРЕТНО? Тот кто прикрепил эту надпись, сделал все, чтобы приманить любопытных (возможно, подсознательно именно этого и желал).
А какая разница на чём его писали?
После компиляции всегда один результат — файл с набором инструкций для конкретного процессора.
Так что ваш вопрос должен звучать по другому «какой процессор был в союзе и где на него надыбать декомпилятор»
Если выяснить в какое время был создан аппарат можно прикинуть какие это могли быть языки. А потом методом тыка. Ну и в журналах и тематичесой литературе копаться в поисках подсказок.
Есть ли способ узнать, на каком языке была написана программа?
У меня есть настольная программа, которую я скачал и установил. Он запускается из файла .exe.
Есть ли какой-нибудь способ узнать из файла .exe, какой язык программирования использовался для написания программы?
Есть ли какие-нибудь инструменты, чтобы помочь с этим?
Какие языки можно определить, а какие нет?
Хорошо, вот две вещи, которые я ищу:
Эта программа IsDelphi от Брюс МакГи найдет все приложения, созданные с помощью Delphi, Delphi для .Net или C ++ Builder, которые находятся на вашем жестком диске.
11 ответов
Я понимаю ваше любопытство.
Вы можете определить приложения Delphi и C ++ Builder и их SKU, просмотрев несколько конкретных ресурсов, которые добавляет компоновщик. В частности, RC Data DVCLAL и RC DATA PACKAGEINFO. XN Resource Editor значительно упрощает эту задачу, но может подавиться сжатым EXE.
Компрессоры EXE немного усложняют дело. Они могут скрывать или шифровать содержимое ресурсов. Программы, сжатые с помощью UPX, легко идентифицировать с помощью HEX editor, потому что первые 2 раздела в заголовке PE имеют имена UPX0 и UPX1. Вы можете использовать приложение, чтобы распаковать их.
Приложения, скомпилированные с помощью .Net, обнаружить несложно. Последние версии Delphi даже включают в себя функцию IsAssembly, или вы могли бы сделать небольшой анализ в заголовке PE. Ознакомьтесь с функцией IsManaged в IsDelphi.
Сложнее определить, какой язык .Net использовался. По умолчанию VB.Net включает ссылку на Microsoft.VisualBasic, а приложения VCL.Net включают ссылки на конкретную версию Borland. Однако VCL.Net перестает функционировать в пользу Delphi Prism, и вы можете добавить ссылку на сборку VB на любой управляемый язык.
Я не смотрел некоторые приложения, которые используют сигнатуры для идентификации компилятора, поэтому не знаю, насколько хорошо они работают.
Надеюсь, это поможет.
Я использую WinDowse (небольшую бесплатную утилиту, написанную на Delphi) для шпионить за окнами программы . например, если вы посмотрите на Таблицу «Класс», вы можете обнаружить имя «Класс» элемента управления ..
- TFormXX, TEditYY, TPanelZZZ для приложений delphi
- WindowsForms10.XXXX.yyy, для приложений .NET
- wxWindowsXXX для приложений wxWindows
- AfxWndXX для приложений MFC / VC ++ (я думаю)
Я считаю, что это самый быстрый (хотя и не самый точный ) способ найти информацию о приложениях.
Во-первых, посмотрите, какие библиотеки времени выполнения он загружает. Программа на C обычно не загружает библиотеку Visual Basic.
Также проверьте исполняемый файл на наличие контрольных строк. В большинстве исполняемых файлов это почти конец. Если программа использует строковые константы, это может указывать на то, как они хранятся.
Хороший дизассемблер, плюс, конечно, отличное понимание базовой архитектуры ЦП, часто могут помочь вам определить используемые библиотеки времени выполнения. Если исполняемый файл не был тщательно «лишен» символов и / или замаскирован иным образом, имена символов, видимые в библиотеках времени выполнения, часто будут давать вам подсказки на языке программирования, потому что стандарты разных языков определяют разные имена, а поставщики компиляторов и сопутствующих библиотеки времени выполнения обычно очень строго соблюдают эти стандарты.
Конечно, вы не добьетесь этого без знания различных возможных языков и их библиотечных стандартов — и если автор кода намеревался замаскировать информацию, им это тоже не сложно сделать.
Если у вас есть большой набор примеров из известных компиляторов, я думаю, это будет отличное приложение для машинного обучения. Я считаю, что здесь уместно так называемое «обучение с учителем». К сожалению, я почти ничего не знаю по этой теме — только то, что я слышал впечатляющие результаты, представленные на конференциях.
Вы можете покопаться в материалах Рабочей конференции по обратному проектированию , чтобы узнать, интересуется ли эта проблема еще кем-нибудь.
Предполагая, что это приложение для Windows .
Признает ли Reflector сборку .NET? Тогда это MSIL, 99% либо VB, либо C #, но вы, скорее всего, никогда не узнаете, какой именно, и это не имеет значения.
Нужен ли интпредставитель (например, Java?)? Тогда это Java (или другой интерпретатор.)
Проверьте, какие библиотеки DLL времени выполнения требуются.
Требуются ли DLL-библиотеки времени выполнения VB? Поздравляем, VB из VisualStudio 6.0 или более ранней версии.
Требуются ли для этого библиотеки Delphi? Поздравляю, Дельфи.
Вы зашли так далеко? C / C ++. Предположим, C ++, если он не требует msys или cygwin dll, и в этом случае C имеет вероятность 25%.
Поздравляем, это должно быть верным для подавляющего большинства программного обеспечения Windows. Это, вероятно, на самом деле вам не поможет, так как на всех этих языках можно сделать много одинаковых вещей.
IDA Pro Free (http://www.hex-rays.com/idapro/idadownfreeware. htm) может оказаться полезным. Даже если вы не понимаете язык ассемблера, если вы загрузите EXE в IDA Pro, его начальный вывод о ходе выполнения может (при наличии каких-либо явных признаков) включать его наилучшее предположение о том, какой компилятор использовался.
Начните с различных опций в dumpbin. Имена символов, если их не стереть, дадут вам всевозможные подсказки относительно того, C, C ++, CLR или что-то еще.
Другие инструменты используют сигнатуры для идентификации компилятора, используемого для создания исполняемого файла, например PEiD, CFF Explorer и другие.
Обычно они сканируют точку входа исполняемого файла по сравнению с подписью.
Обозреватель сигнатур из CFF Explorer может дать вам представление о том, как подпись построена.
Похоже, компоновщик VC ++ от V6 до добавляет подпись к заголовку PE, который вы можете проанализировать.
Я предлагаю PEiD (бесплатное программное обеспечение, с закрытым исходным кодом). Имеет все подписи Delphi для Win32, также может сказать вам, какой упаковщик использовался (если есть).
Как определить язык программирования?
Меня очень интересует вопрос, как можно определить язык программы, если она уже откомпилирована?
Самое простое и быстрое для вас решение — взять PeID и проанализировать им исполняемый файл. Если программа без защит, есть шансы успешного определения.
Это, на самом деле, дело не из легких, поверьте! С супер точностью определить ничего не получится, так как языки могут быть разные, поддерживаемые, скажем одной средой программирования( VS, например, в которой поддерживается разработка на свыше 10 языках), а та, в свою очередь, добавляет сходную последовательность asm-секций в машинный код любого приложения, написанного в этой среде.
Поэтому, скажем, с точностью( и то не всегда 100%-ой! ) можно определить среду разработки. Делается это, естественно, под дезассемблером. Лучший на мой взгляд( и где я, кстати, чаше всего провожу отладку ) — это OllyDBG. Под ним очень легко и быстро можно разобрать почти любую софтину( за исключением упакованой, обфусцированной и т.д ). Так, VS, например, добавляет в ассемблерный код несколько секций, порядок которых специфичен для данной среды. Последовательность похожа на эту( только пример! ), насколько я помню:
Нажимая «Принять все файлы cookie» вы соглашаетесь, что Stack Exchange может хранить файлы cookie на вашем устройстве и раскрывать информацию в соответствии с нашей Политикой в отношении файлов cookie.
Есть ли способ узнать, на каком языке была написана программа?
У меня есть настольная программа, которую я скачал и установил. Он запускается из файла .exe.
Есть ли какой-нибудь способ узнать из файла .exe, какой язык программирования использовался для написания программы?
Есть ли какие-нибудь инструменты, чтобы помочь с этим?
Какие языки можно определить, а какие нет?
Хорошо, вот две вещи, которые я ищу:
Эта медитация Программа «ИсДельфи» by Брюс МакГи найдет все приложения, созданные с помощью Delphi, Delphi для .Net или C ++ Builder, которые есть на вашем жестком диске.
Джон / Роджер: На самом деле мой вопрос возник, честно говоря, когда я увидел функцию в другой программе, которая, как я думал, подойдет для моей. Мне было бы легче искать, как эта функция была реализована, если бы я знал язык, на котором она была написана. lkessler
Это веская причина. Не закрывайте это. — Christy John
Какая особенность? Знание языка реализации на самом деле не очень полезно, но вопрос об этой конкретной функции в сочетании с языками / наборами инструментов, которые вы уже используете или уже знаете, с гораздо большей вероятностью приведет к ответу, который вы можете использовать. — Roger Pate
То, что вы не думаете, что у OP есть веская причина делать то, что он делает, не означает, что это «не связано с программированием». Мне это кажется вполне разумным вопросом. Интересная (и очень связанная с программированием) часть этого вопроса заключается в том, действительно ли вы можете это сделать и как, а не о том, существует ли инструмент. Серьезно, ребята, не все здесь заявление разработчик. Существует более одного типа программирования и более одного определения термина «полезное». — Todd Gamblin
Зачем сомневаться в этом вопросе? Если он хочет знать, он хочет знать, и, поскольку это касается программного обеспечения, это подходящий вопрос для Stack Overflow. Я не знаю о мотивах мистера Кесслера, но время от времени я задавался вопросом, на каком языке было написано что-то, как и многие другие, я уверен. — davidtbernal
11 ответы
Я понимаю ваше любопытство.
Вы можете определить приложения Delphi и C ++ Builder и их SKU, просмотрев несколько конкретных ресурсов, которые добавляет компоновщик. В частности, RC Data DVCLAL и RC DATA PACKAGEINFO. В Редактор ресурсов XN делает это намного проще, но может подавиться сжатыми EXE-файлами.
Компрессоры EXE немного усложняют дело. Они могут скрывать или шифровать содержимое ресурсов. Программы, сжатые с помощью UPX легко идентифицировать с HEX редактор потому что первые 2 раздела в заголовке PE имеют имена UPX0 и UPX1. Вы можете использовать приложение, чтобы распаковать их.
Приложения, скомпилированные с помощью .Net, обнаружить несложно. Последние версии Delphi даже включают в себя функцию IsAssembly, или вы могли бы сделать небольшой анализ в заголовке PE. Ознакомьтесь с функцией IsManaged в IsDelphi.
Сложнее определить, какой язык .Net использовался. По умолчанию VB.Net включает ссылку на Microsoft.VisualBasic, а приложения VCL.Net включают ссылки на конкретную версию Borland. Однако VCL.Net перестает функционировать в пользу Delphi Prism, и вы можете добавить ссылку на сборку VB на любой управляемый язык.
Я не смотрел некоторые приложения, которые используют сигнатуры для идентификации компилятора, поэтому не знаю, насколько хорошо они работают.
Похожие публикации:
- Как зайти в службу xbox live
- Как ракета летит по параболе
- Как рассчитать расход эл энергии формула excel
- Как сделать virtualbox на весь экран
Источник: gshimki.ru