Распознавание строк в PE

Тема в разделе "WASM.RESEARCH", создана пользователем Hellspawn, 11 фев 2006.

  1. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    вот решил к своей тулзе прикрутить дизасм...

    нашёл неск. движков.. остановился на CADT by Ms-Rem

    но вот в чём проблема....

    имеем код (олли):
    Код (Text):
    1.  
    2. 0040100B   |.  6A 00            PUSH 0
    3. 0040100D   |.  E8 05000000      CALL DEBUGGER.00401017                              
    4. 00401012   |.  54 65 73 74 00   ASCII "Test",0
    5. 00401017   |>  E8 15000000      CALL DEBUGGER.00401031                              
    6. 0040101C   |.  44 65 62 75 67 6>ASCII "Debugger NOT pre"
    7. 0040102C   |.  73 65 6E 74 00   ASCII "sent",0
    8. 00401031   |>  6A 00            PUSH 0                                              
    9.  


    тут содержатся строки, соотв. если не

    найти их до распознования, то код

    будет диз. не правильно... =\

    какие будут советы, как это реализовать???

    (asm или дельфя)... =\
     
  2. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Реализовано все IDA Pro, но даже там необходимо участие человека.

    Один из способов реализации (который вряд ли тебе подойдет) - это запустить этот кусок кода в пошаговое отладочное выполнение, и дезасемблировать по мере выполнения кода.
     
  3. asd

    asd New Member

    Публикаций:
    0
    Регистрация:
    12 мар 2005
    Сообщения:
    952
    Адрес:
    Russia
    Берёшь длинну инструкции, если она 5 байтная, то проверяешь её опкод на call/jmp. Если это call/jmp, то начинаешь дизасемблировать с нового адреса. Строки обойдутся сами-собой.
     
  4. Sh355

    Sh355 New Member

    Публикаций:
    0
    Регистрация:
    30 мар 2004
    Сообщения:
    56
    Увы, если вставлено что-либо типа push eax / ret, то способ не поможет.
     
  5. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"
    Строки распознавать можно по тому факту, что они состоят из определенного набора символов и заканчиваются нулем.

    И обычно на них идет ссылка из кода.
     
  6. Nothing

    Nothing New Member

    Публикаций:
    0
    Регистрация:
    4 авг 2003
    Сообщения:
    139
    Адрес:
    Russia
    Ms Rem

    Строки распознавать можно по тому факту, что они состоят из определенного набора символов и заканчиваются нулем.

    Строки не только нулем оканчиваются, есть и Unicode-строки и Delphi-строки (с 1 байтовой длиной и с 2-байтовой перед самой строкой). Короче говоря, пробовать надо кучу способов, может какой и поможет на автомате строку опознать.



    Hellspawn

    Явные прыжки и вызовы конечно надо "интерпретировать" по возможности. Кстати, в одной программе редко используются строки разных видов, так что опознав одну строку корректно надо именно этот метод и применять в дальнейшем в первую очередь.



    Ну если никакой способ не подошел и язык программы неизвестен, тогда есть несколько полуавтоматических вариантов. Например, дизассемблирование кода "назад", вместе с таблицей "неиспользуемых" команд (привелигированные и редкие сочетания, которые не должны были бы появляться в коде, типа arpl, bound). Тогда встретив такую команду, надо искать следующую ссылку по коду, которая будет кодом с большой вероятностью, и плясать от нее назад, подбирая команды. Там проблема в том, что многие корректные команды имеют одинаковые окончания, но разную длину и непонятно какая из них реально была в коде, поэтому надо выбирать какую-нибудь стратегию, например "жадный" или "ленивый" разбор (разбор позволяющий дальше всего назад продвинуться) и подбирать команды назад до предыдущего места останова. Иногда помогает, т.к. компилеры в код пихают не только строки, но и всякую другую муть неизвестного формата. Но панацеи, разумеется нет, и для всех случаев это не поможет. Не зря же в ida есть кнопки c и d :)
     
  7. Hellspawn

    Hellspawn New Member

    Публикаций:
    0
    Регистрация:
    4 фев 2006
    Сообщения:
    310
    Адрес:
    Москва
    в принципе я набросал алгоритм... мне пока хватает..

    потом ещё допишу второй...

    смысл такой...



    ищу 0 потом символы в алфавите (['A..Z','a..z', и т.д.])

    потом ещё 0.. это и есть строка...

    забиваю её в массиве нопами.. тогда дизасм всё норм

    делает.. =) пока всё... а в листинге по этому адрессу

    подставляю найденную строку...



    а язык прогаммирования, в принципе известен..

    я определяю на чём написана прога =)
     
  8. Ms Rem

    Ms Rem New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2005
    Сообщения:
    1.057
    Адрес:
    С планеты "Земля"




    Unicode строки в большинстве случаев тоже оканчиваются нулем (не обязательно), а Delphi строки всегда оканчиваются нулем в целях совместимости.