wanted алгоритм поиска инлайн-функций в бинарном коде

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

  1. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    По уровню оптимизации я располагаю компилеры вот так:

    - MSVC++

    - G++

    - W++ / B++

    По сути, что такое оптимизация комп. программы? Это во первых - поиск минимального пути в CFG. Из за этого возникает проблема слежения за DFG. Кто лучше всего умеет отслеживать DFG тот на коне.

    Для примера



    if ( flag) then {...} else {...}

    Компилер выяснил, что flag всегда поднят и выбрасывает ветку else.

    Вот по этому критерию я и выстраиваю компилеры.



    В продолжение мыслей Ильфака, декомпилеру предпочтительнее иметь собственный компилер. Поддерживать всякие разные к. обойдется себе дороже.
     
  2. crypto

    crypto Active Member

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

    Я согласен, что MSVC++ создает самый замысловатый код, который даже вручную трудно реверсить.

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

    Кстати, ты решил проблему нахождения циклов для MSVC++?
     
  3. crypto

    crypto Active Member

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

    Я согласен, что MSVC++ создает самый замысловатый код, который даже вручную трудно реверсить.

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

    Кстати, ты решил проблему нахождения циклов для MSVC++?
     
  4. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    Приведи легкий(по обьему) пример.
     
  5. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    А в вапросик не врубился. Проблема нахождения циклов. Ну что на это сказать, можно взглянуть на диссертацию Кристины Це, почитать Ахо и Ульмана про Компиляторы ( не Книга Драгона, а что -то поновее, название не помню).

    Веть CFG ( code flow graph) - ето направленный граф, с узлами из базовых блоков и связями в виде переходов. Нужно посторить анализатор графа для поиска ребер, у которые направлены назад и точка перехода уже посещена. В любом случае это будет цикл. Если проще CFG - как река течет к морю , а в цикле есть ребро против течения.

    Есть такая задница, называемая irreducible graph, которая появляется при использовании goto. Самый простейший -



    1

    / \

    V V

    2<->3

    Это граф, у которого лишние ребро или ребра. Нужно будеть научиться удалять эти ребра.
     
  6. crypto

    crypto Active Member

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

    Блин, я никак этот фрагмент не найду. Просто переключился временно с исследований Визуального С на Борланда. Мне показалось это более актуальным по многим причинам, несмотря на наличие клевых тулзов типа DeDe. Как только руки дойдут, так сразу и выложу.
     
  7. crypto

    crypto Active Member

    Публикаций:
    0
    Регистрация:
    13 дек 2005
    Сообщения:
    2.533
    Кстати, анализировать CFG - не есть самый лучший способ :)
     
  8. MrHammer

    MrHammer New Member

    Публикаций:
    0
    Регистрация:
    9 июл 2003
    Сообщения:
    197
    Поясни. :derisive: