Нахождение строк в файле...

Тема в разделе "WASM.RESEARCH", создана пользователем dermatolog, 3 авг 2009.

  1. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    На входе имеем PE файл. На выходе надо получить список строк и референсы на них из секции кода.
    Какие могут быть варианты реализации кроме дизасма всего файла?
     
  2. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    Разве можно без дизасма получить референсы на строки?
     
  3. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    в простом случае (компилер, строки не в коде) - начала по релокам, а распознание по наборам символов, видимо
     
  4. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Flint_ta
    Поиск референсов это второй этап - тут ессно без дизасма уже никак.
    На первом этапе требуется быстро найти все строки в файле.
    qqwe
    В общем случае релоков у нас нет.
     
  5. qqwe

    qqwe New Member

    Публикаций:
    0
    Регистрация:
    2 янв 2009
    Сообщения:
    2.914
    dermatolog
    хотите усложнить? зачемто.. ладно

    ищем диапазоны адресов подозрительных на строки, а потом ищем в кодовой секции дворды попадающие в эти диапазоны.

    или так, считаем начало и конец дата секции, потом ищем в кодовой секции дворды попадающие в дату и проверяем не на строку ли оно указывает.

    но тут тоже можно усложнить. строки в коде, расчетные ссылки. шифрованные/просто без 0 строки итд.


    (не понять, почему не пишут линкербазед крипторов. насколько все проще и насколько лучше выйдет)
     
  6. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    dermatolog
    Дайте определение, что следует считать строкой.
     
  7. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    qqwe
    Почему усложнить? ЕХЕ-ники обычно идут без релоков.
    Строки могут лежать не только в секции данных, но и в самой секции кода.
    Тут вообще ниче не понял :))
     
  8. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    asd
    Строкой будем считать последовательность байт, состоящих из следующих символов: 9,10,13,32..255, которая заканчивается нулевым байтом.
     
  9. wsd

    wsd New Member

    Публикаций:
    0
    Регистрация:
    8 авг 2007
    Сообщения:
    2.824
    qqwe
    а если адреса вычисляются? и всё пойдёт лесом :)
     
  10. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    Тогда алгоритм напрашивается сам собой: парсим весь файл на предмет строк состоящих из печатных символов и заканчивающихся нулем, заносим найденные адреса в массив. Затем парсить секцию кода смещаясь каждый раз на один байт и считывая дворд, если есть совпадение с первым массивом, значит велика вероятность что это референс на строку.
     
  11. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    + следует учесть что строки могут быть как в ASCII так и в UNICODE
     
  12. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Flint_ta
    Ну вот тут как раз хотелось бы избежать ложных срабатываний, т.к. кривой референс на строку, которая потом будет изменяться, может в дальнейшем привести к неработоспособности программы (релоки тут конечно нехило помогают, но без них вероятность ложного срабатыванию будет слишком большой).
     
  13. Vam

    Vam New Member

    Публикаций:
    0
    Регистрация:
    16 июл 2008
    Сообщения:
    149
    А чем IDA не нравится, написать скрипт или плагин выбора строк простая задача, и ссылки искать не надо, только бери. На 90% можно сказать что будут получены все строки.
     
  14. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Vam
    С файлом работает отдельная программа, которая ничего кроме себя не использует :))
     
  15. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    Flint_ta
    А если дельта-смещение используется, ссылки на строки вы не найдёте, например я всегда адрес строки загружаю через разность смещений инструкции получающей смещение и RVA строки. Инструкции эти бессмысленны(lea..), так как в них нет адресов в пределах модуля. А юникодовские строки динамически создаются(незачем таскать лишний ноль на каждый символ). Это всё если нет защиты, можно динамически строки собирать, смотря какая задача.
     
  16. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    Тогда чтобы уменьшить вероятность ложного срабатывания следует прочитать несколько байт до дворда и сравнить с типичными инструкциями ассемблера, к примеру:
    нашли в коде 00304000h и в секции данных по адресу
    Код (Text):
    1. 00403000  F1 F2 F0 EE EA E0 00;строка.
    Смещаемся в секции кода на один байт назад
    68 00304000h

    = 68h значит это команда push 00403000, что вполне сгодится для работы со строками.

    P.S. Только таким макаром можно отфильтровать и валидные референсы.
     
  17. dermatolog

    dermatolog Member

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    406
    Адрес:
    Екатеринбург
    Clerk
    Такой вариант исключаем сразу. Предполагается что файл скомпилен без этих извращений.
    Flint_ta
    Обратное дизассемблирование это еще тот гемор - к сожалению мы не можем точно сказать что отмотав несколько байт назад мы попадем точно на границу команды. Да и команды, работающие со строками могут быть не только в виде PUSH XXXX, но и MOV [EBP-XX],XXXX и MOV [XXXX],XXXX - т.е. одним байтом тут не обойтись.
     
  18. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    dermatolog
    Почемуже, для общих случаев найти можно. Например опкод Call $+5, а далее сложение со стеком значения, либо вычитание его, тогда смещение до строки будет определяться добавляемым значением:
    [​IMG]
     
  19. Flint_ta

    Flint_ta New Member

    Публикаций:
    0
    Регистрация:
    25 май 2008
    Сообщения:
    312
    Я сказал не один, а несколько. Один байт я привел лишь для примера.

    Тогда ваша задача не имеет решения, юзайте дизасм.
     
  20. Clerk

    Clerk Забанен

    Публикаций:
    0
    Регистрация:
    4 янв 2008
    Сообщения:
    6.689
    Адрес:
    РБ, Могилёв
    И не большее извращение чем таже строка на си:
    Код (Text):
    1. $PUSH_REF macro Variable
    2. Local dt_
    3.     Call dt_
    4. dt_:
    5.     add dword ptr [esp],(offset Variable - offset dt_)
    6. endm
    7. ; ...
    8.     $PUSH_REF $SectionName
    9.     push ImageHeader
    10.     Call iSearchSectionInModuleInternal
    11. ; ...
    12. $SectionName:
    13.     CHAR ".text",0,0,0