Задачка у меня такая.
Есть некий DOS файл с расширением .exe, необходимо узнать на каком языке это написано, чтобы потом найти програмку декомпилятор и посмотреть исходники.
Кто знает такие програмки которые определяют по exe на чем он написан.
← →
vopros ( 2002-12-15 13:19 ) [1]
в текстовом редакторе посмотри в конце файла.
← →
SZap ( 2002-12-15 13:21 ) [2]
vopros
и что я там должен увидеть.
← →
han_malign ( 2002-12-15 13:29 ) [3]
Чип & файл — новости компьютерного мира. Выпуск
18.
фрагмент:
Восстановление исходного текста программы на языке высокого уровня — давняя
и недостижимая мечта человечества. Но кое-чего все же можно добиться.
Во-первых, с помощью IDA определяются названия многих функций, но только
библиотечных. Во-вторых, для программ, созданных некоторыми
компиляторами, есть утилиты, позволяющие восстановить либо исходный текст,
либо другую информацию, которая пригодится при взломе. Например,
восстанавливаются формы, компоненты и их свойства и адреса обработчиков
событий. Это существенно экономит время, требуемое на взлом. Например, Refox
для языка FoxPro, VBDE и Visual Basic 3 Decompiler для языка Visual Basic, EXE2DPR
и DeDe для Delphi. DeDe также работает с программами откомпилированными в
C++ Builder.
← →
Alx2 ( 2002-12-15 13:32 ) [4]
>SZap (15.12.02 13:18)
Для DOSовских программ поищи intruder.exe
← →
SZap ( 2002-12-15 13:35 ) [5]
han_malign
спасибо конечно, но как мне всетаки определить на каком языке был написан данный exe.
← →
vopros ( 2002-12-15 13:35 ) [6]
Всякий хлам среди которых есть названия функций.
← →
Anatoly Podgoretsky ( 2002-12-15 13:38 ) [7]
Частный случай, как правило в программе свыше одного языка и вычленить из программы часть которая написано одним программистом чрезвычайно сложно, а на чем сделана та или другая библиотека приходится только догадываться
← →
han_malign ( 2002-12-15 13:48 ) [8]
для 32-битных Delphi и CBuilder в ресурсе лежат специальная инфа, для ДОС-программ скорее всего ни фига нет(однозначно можно определить только программы защищенного режима, по раширителю, для Borland Pascal — rtm, для Watcom C — dos4gw, для MS — фиг знает), тут поможет только метод научного тыка(качаешь очередной dasm и пробуешь что получится).
← →
AL2002 ( 2002-12-16 10:33 ) [9]
← →
Karbo ( 2002-12-16 10:58 ) [10]
Напиши сам минимальные программы на Turbo Pascal, С++ и Basic, ( BEGIN END. будет достаточно),посмотри полученные exe-шники каким-нибудь Norton Disk Edit и найди по 12 отличий. Наверняка найдешь какую-нибудь ботву типа "Borland#$%"
← →
Anatoly Podgoretsky ( 2002-12-16 11:04 ) [11]
А теперь к этому добавь Uses . и между BEGIN END вызовы
В общем случае задача нерешаема.
Однако в некоторых частных случаях вполне можно определить, каким компилятором была скомпилирована программа.
К примеру в составе 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, которая может по сигнатурам (специфичным участкам кода) определять компилятор, но к сожалению она уже не развивается и не определяет современные компиляторы.
Поделки криворуких говнокодеров на Delphi/Borland C++ Builder можно спокойно определить на глаз по кривости интерфейса, но если программу в этих средах писал нормальный программист, то на глаз не получится.
ЗЫ:
А собственно зачем это нужно? Если программа работает, не все ли равно на чем она написана?
Хочется раз и навсегда решить проблему определения языка пользовательского ввода на сайте. Представьте, что я делаю многоязычный Habrahabr 🙂 и не хочу спрашивать у пользователя, на каком языке он пишет. Думаю, компьютер должен справится с такой проблемой.
Формулировка задачи
- нужно по фрагменту текста определить его язык. Длина фрагмента — от нескольких слов до нескольких десятков предложений. Это может быть связный текст или, например, заголовок статьи;
- текст дан в кодировке UTF-8;
- набор интересующих меня языков жестко задан. Количество языков — 5..10. В рабочем приложении можно даже ограничиться меньшим количеством, чтобы увеличить точность определения;
- текст может содержать включения других языков. Нужно определить основной (более 60% слов, например);
- для моей задачи не всегда нужно точно определять. Например, чаще всего не нужно различать украинский и русский;
- автор текста знает язык, на котором пишет.
Существующие решения не подходят. Проблема в том, что их делали математики и программисты. Эти решения, в основном, анализируют один параметр и выдают странные вероятности того, что текст написан на каком-то языке. А мне нужны не вероятности. Мне нужно язык определить :-). Вторая проблема — статистические алгоритмы разваливаются на текстах, содержащими включения других языков.
Думаю, нужно последовательно анализировать много параметров.
Ради эксперимента я попробовал визуально определять незнакомый язык текста. Например, запросто отличу португальский от немецкого, хотя не знаю ни тот ни другой.
Алгоритм моих действий примерно такой:
- смотрю на набор символов, которые встречаются в словах. Причем, именно по словам, а не по всему тексту, т.к. в тексте могут быть «иностранные» слова. На этом этапе уже можно исключить две трети языков.
- ищу характерные союзы и предлоги — по ним можно разделить языки с одинаковым набором символов
- пытаюсь прочитать текст, исходя из предположения, что он написан на языке, который определился. Мне сложно сказать, что происходит на этом этапе… Думаю, это сложный анализ грамматики языка. Я распознаю известные мне слова, проверяю окончания.
Несколько примеров несостоятельных алгоритмов
В полиграммной модели со степенью n и основанием M текст представляется вектором i>, i = 1..M n , где fi – частота встречаемости i-ой n-граммы в тексте.n-грамма является последовательностью подряд идущих n – символов вида a1…an-1an.
— нихрена не понял
Дальше искать не стал.
Пример состоятельного алгоритма
Переводчик Google прекрасно определяет язык по нескольким словам. Его не сбивает с толку даже включение «иностранного» слова в предложение.
Еще у меня есть странное желание проделать это на стороне клиента, с использованием javascript. Не думаю, что анализ нескольких слов требует обращения к Google Language API…
В итоге использовал Google Language API… Подозреваю, что в спорных случаях они используют поиск по словарю, а я этого не могу себе позволить на стороне клиента.