Как программно определить на чем написана программа

Тема в разделе "WASM.BEGINNERS", создана пользователем kosfz, 25 июн 2006.

  1. kosfz

    kosfz New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    45
    Адрес:
    Russia
    Как программно определить на чем написана какая-нибудь программа? Как это делают PEiD или PETools? У PETools в папке лежит Signs.txt(с сигнатурами), как он сравнивает их и с чем непонятно. Объясните пожалуйста как это делается. Заранее спасибо.
     
  2. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    в упомянутом тобой файле лежат т.н. сигнатуры, это собственно то почём ты можеш определить в чем было собрано приложеие.



    краткий анализ этого фала даёт таике результаты.

    - до символа '=' идет описание сигнатуры

    - далее следует сама саиганутра. символ ':' означает любой симовол.

    могу ошибатся конечно однако для подтверждения утебя есть своя голова и поисковики.

    В папке SignMan лежит тулза (так и называется) которая позволяет найти общие байты для двух файлов. Идея заключается в том что если два файла , к примеру, упакованы одним и темже пакером, то в них будит чтото общее - некая последовательность байт. Тоже касается и компиляторов. Если каким либо образом (кпримеру эксперементальным) прийти к выводу что некая последовательность байт будит гарантированно одинакова во всех программмах упакованнах данным пакером/скомпиленых компилятором/запротекченных протектором, то можно считать эту последовательность сигнатурой.

    собственно вот так и можно определять.

    если же вручную то я часто просто открываю файл по ф3 и сматрю названия секций некоторые пакеры меняют их на свои.
     
  3. kosfz

    kosfz New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    45
    Адрес:
    Russia
    Спасибо за ответ.
     
  4. kosfz

    kosfz New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    45
    Адрес:
    Russia
    spencer

    За двоеточия спасибо. Я конечно извиняюсь за назойливость, но у меня вопрос: отобразил я файл в память, а как строчку-то в нем найти?
     
  5. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    ну это отдельная история...

    вопщето мне не приходилось с этим сталкиватся...

    но самое примитивное что приходит в голову это побайтовое сравнение...

    можеш заюзать cmps

    тогда это будит выглядеть както так:


    Код (Text):
    1.  
    2. lea  edi, text2
    3. lea  esi, text1
    4. repe cmps
    5. jne   ArraysAreDifferent
    6.  


    это сравнение двух строк

    ну тебе вместо text1 надо указать указатель на текущую позицию внутри промапированного файла...

    (тебеж не надо перепахивать весь файл в сравнении а только ту часть где должна быть сигнатура)

    вот кпримеру есть утебя такая сигнатура

    [Winkript v1.0=33C08BB800::::::8B9004::::::85FF741B33C950EB0C8A0439C0C804341B880 439413BCA72F058]



    значиш ставиш указатель на туда где должна сигнатура начинатся

    потом сравниваеш следуюшие 10d байт с 33C08BB800

    если равно то перемещаеш указатель на 6 байт и дальше...



    незнаю точно однако 33C08BB800 должно быть обьявленно не как строка а как

    ррр db 33h, 0ch, 8bh, 0b8h, 00



    p.s.

    помоему я чертовски ошибаюсь, однако где... )
     
  6. spencer

    spencer New Member

    Публикаций:
    0
    Регистрация:
    15 авг 2005
    Сообщения:
    277
    да и еще, cmps юзает ecx как счётчик символов которые стоит сверить, смотри не забудь проверить его, ато при ecx = 0ffffffffh получиш маленький казус )
     
  7. kosfz

    kosfz New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    45
    Адрес:
    Russia
    spencer

    Спасибо огромное! Теперь почти полностью разобрался, надо только попробовать будет, так сказать экспериментально проверить. А сигнатура, я так понимаю, начинается с EntryPoint(RAW)(PETools) или с File Offset(PEiD) показывают они одно и тоже, или я не прав?
     
  8. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    kosfz

    Сигнатуры хранятся в отдельном файле. Если они совпадают, то покажут одно и то же. В PEiD есть разные режимы сканирования : normal(EP) и другие.
     
  9. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Я проверял файлы, написанные на разных версиях Дельфи. В некоторых случаях файл не опознается - пишет Unknown.
     
  10. kosfz

    kosfz New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    45
    Адрес:
    Russia
    valterg

    У меня в независимости от режимов сканирования File Offset остается неизменным. А сигнатуры я уже сравнил. Как оказалось они начинаются с File Offset. Я открывал exeшники с помощью HiEW и искал там данные сигнатуры, адрес первого байта сигнатуры совпадал с File Offset в PEiD'е и EntryPoint(RAW) в PETools и так для 12 проверенных программок, написанных на Delphi, VC++, MASM. После чего я программно считывал столько байт сколько нужно, начиная с File Offset, и сравнивал. Результаты работы программы были идентичны результатам PETools(я брал их файл с сигнатурами). Так что откуда надо считывать, чтобы сравнить с образцом я разобрался.

    А EntryPoint(RAW)==File Offset. Да, кстати, а как провести различные режимы сканирования(программно) не подскажешь?

    crypto

    Я заметил, что такое часто встречается в PETools, а вот PEiD этим практически не грешит. У меня например Delphi 6 определяется как Delphi 3, а CBuilder 1999 как CBuilder DLL или что-то в этом роде. Вся загвоздка наверное в сигнатурах PETools, ведь SignMan сравнивает всего два файла. Решение на мой взгляд кроется в сравнении скажем 5, а не 2 файлов. Может тогда точнее будет. Буду писать свой SignMan - может что и получиться. Чем проверял(PETools или PEiD'ом)?
     
  11. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    kosfz

    Проверял PETools.

    Я конкретно для Дельфи по-другому проверяю - по процедуре System.Initialization.
     
  12. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    Еще можно по названию секций.
     
  13. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    mix_mix

    По названиям секций вряд-ли можно узнать конкретную версию софта.
     
  14. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105


    Ну так File Offset и показывает место, где сигнатура найдена. А EntryPoint берется из заголовка. Если программа неупакована и сигнатура сделана для точки входа(а для языков так оно и есть), то ничего удивительного, что адреса совпадают. Возьми запакованные программы.
     
  15. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    crypto

    Можно определить компилятор.
     
  16. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    mix_mix

    В некоторых случаях этого мало, нужно знать версию конкретного компилятора.
     
  17. kosfz

    kosfz New Member

    Публикаций:
    0
    Регистрация:
    25 июн 2006
    Сообщения:
    45
    Адрес:
    Russia
    crypto

    А можно по-подробнее про System.Initialization. А то написал свой SignMan с возможностью сравнения 5 файлов выдает сигнатуру для Delphi 6 такую какой у PETools вообще нет и вот еще у меня сигнатура для Delphi 6 и 7 идентичны. Появляется вопрос: так можно ли их вообще отличить или как в PEiD указывать Delphi 6.0-7.0? Кстати сравнение 5 файлов вносит лишь мельчайшие корректировки.

    valterg

    У меня File Offset и EntryPoint невсегда и для незапакованной программы совпадают. Кстати по-моему в PETools EntryPoint(RAW) обозначают как раз File Offset, а EntryPoint(RVA) как раз и есть обычный EntryPoint.

    mix_mix

    Хочешь сказать что, если CODE, то Borland, а если .code то

    Microsoft. А версия? Delphi 3 или 6? VC++ 6 или 7 ?

    Всем

    У кого-нибудь в арсенале есть старые версии упаковщиков или протекторов, а то новые то есть, а охото еще и сигнатуры для стареньких версий состряпать.
     
  18. mix_mix

    mix_mix Михаил

    Публикаций:
    0
    Регистрация:
    8 окт 2005
    Сообщения:
    277
    Адрес:
    Токио
    kosfz

    Для определения версии есть поля Link Major, Link Minor. Судить по названию секций - только определение фирмы компоновщика, но не более.
     
  19. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    mix_mix

    А ты уверен, что это не относится к версии линкера?
     
  20. valterg

    valterg Active Member

    Публикаций:
    0
    Регистрация:
    19 авг 2004
    Сообщения:
    2.105
    kosfz



    Наоборот. Кроме того - выдает unknown там, где PEID работает. Даже на новеньких сигнатурах.