Данные в секции кода. Как распознать?

Тема в разделе "WASM.RESEARCH", создана пользователем Temir, 18 фев 2007.

  1. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    Stiver
    можно слегка проанализировать несколько команд до JMP'а и условные джампы тоже смотреть.
     
  2. Cr4sh

    Cr4sh New Member

    Публикаций:
    0
    Регистрация:
    17 апр 2006
    Сообщения:
    668
    asd, Stiver
    дык ясно что не все будет гладко, просто это была первая идея которая пришла в голову

    >> и условные джампы тоже смотреть
    об этом я и говорил
     
  3. IceStudent

    IceStudent Active Member

    Публикаций:
    0
    Регистрация:
    2 окт 2003
    Сообщения:
    4.300
    Адрес:
    Ukraine
    Temir
    Я же написал в общем: если управление не попадает на участок данных, то и оставлять его как данные. При анализе у тебя должны быть два типа ссылок - код и данные. Твои mov, add - они все ссылаются на данные. На код могут ссылаться только jmp/call/ret.

    Кстати, дизассемблер ты хочешь полностью автоматический? Невыполнимая задача.
     
  4. Temir

    Temir New Member

    Публикаций:
    0
    Регистрация:
    6 июл 2005
    Сообщения:
    14
    Огромное спасибо всем, кто высказал свое мнение!

    Дизассемблер хочу автоматический. Конечно все фишки не учтешь, но стараюсь это сделать. Причем задачи получить максимальное количество кода не стоит, главное - правильность. Поэтому встретив любой jmp или call на неизвестный адрес, остановлюсь и начну с другой ветки кода.

    В том-то и дело, что управление попадает на данные, которые интерпретируются как код, а это в свою очередь ведет к грубым ошибкам при дизассемблировании.

    Дизасм нужен для распознавания нужного мне кода в потоке файлов. Поскольку он запланирован как автоматический, то погрешность ошибки - нормальное явление.

    Да, конечно флажки (или типа того) я ставлю. При обнаружении любого call или Jxx (условного перехода) я кладу один адрес в стэк, другой же используя для прехода. Когда код заходит в тупик, адрес из стэка я достаю.

    На мой взгляд эти слова наиболее полно отражают проблему. Вот пример:
    Код (Text):
    1.    mov eax, 200
    2.    cmp eax, 10
    3.    jge  xxx1
    4.    jmp xx2
    5. xxx2: nop
    6.         db 90h
    7.         db  E8h
    8. xx1: mov eax, 10
    9.       ........
    Но поскольку составляется вышеназванная карта кода, то на такой ситуации происходит косяк, пояню как отработает мой дизасм: адрес xxx1 кладется в стек. Происходит дизассемлирование данных: 90h - это nop, E8h - call, за которым должно последовать 4 байта относительного смещение. Получится:
    Код (Text):
    1.    mov eax, 200
    2.    cmp eax, 10
    3.    jge xxx1
    4.    jmp xx2
    5. xx2: nop
    6.        nop
    7.        call someAddr
    В итоге получится либо неправильный код, либо все загнется, если someAddr получится корявым каким-нибудь.

    Видимо, без эмуляции выполнения кода на процессоре, т.е отслеживания значений регистров, стека и т.п. такие случаи неразрешимы.
    Еще раз большое спасибо всем, ваши мысли очень помогли мне сделать окончательный вывод.
     
  5. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Temir
    В объектно-ориентированной программе ты довольно часто будешь с этим встречаться (вызовы виртуальных методов).
     
  6. wasm_test

    wasm_test wasm test user

    Публикаций:
    0
    Регистрация:
    24 ноя 2006
    Сообщения:
    5.582
    crypto
    там даже хлеще, JMP на адрес, который лежит в указанном DWORD'е (типа JMP [ EBX + _SMTH_ ]). Насколько я помню, конечно )

    кстати для разных типов программ нужны разные методы анализа. если это в основном прикладные программы, хватит простейщего анализа. если это вири какие или чтонить экзотическое, тут придется извратиться.
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Great
    Короче, если программа создана компилятором - один вариант. Если человеком - совсем другой коленкор.