повернуть программу вспять...

Тема в разделе "WASM.ASSEMBLER", создана пользователем Tid0Wlas, 18 июн 2007.

  1. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    asmlamo
    повторяемся - http://www.wasm.ru/forum/viewtopic.php?pid=184902#p184902
     
  2. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    насколько я помню проблема обратного дизассемблирования так и не была решена
    а обратное исполнение еще посложнее будет
     
  3. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    backtrace был в td386 и все нормально работало.
     
  4. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    infern0
    Да, я тоже помню такое. И как интересно это было реализованно...Явно ограниченная в возможностях вещь.
     
  5. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Имхо, тут надо просто сохранять инфу при каждой выполненной инструкции (контекст и etc.). Иначе ничего не получиться. Это же не просто выполнение команд наоборот, а изменение EIP на инструкцию плюс востановление предыдущего контекста (т.е. контекста до выполнения последней команды).
     
  6. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    Невозможно по определению.

    Обратное выполние программы - к изменению EIP отношение имеет ооочень далекое...если не сказать, что не имеет никакого отношения в принципе. Разворачивать нужно не комманды, а алгоритмические
    шаги
    ... А чтобы разложить программу на алгоритмические составляющие - это вам не ахти. Даже ида этого не умеет. Человек это не всегда умеет...даже проф. реверсыры часто сталкиваются с проблемами на этом шаге.
    Более того, нужно не просто разложить программу на составляющие, но и найти неделимые блоки.

    к примеру

    push offset szSomeLib
    call LoadLibraryA


    это неделимый блок...

    если начать исполнение функции, а закончить доставанием параметра из стека - это приведет к исключениею.

    Уже видно, что задача не из тривиальных


    Но и это еще не все.
    Мало того, что нужно разложить программу на алгоритмические шаги, и неделимые блоки, но и найти
    "обратное действие". А это не всегда возможно. Чаще - это просто невозможно. Даже для элементарных действий add, xor, sub не всегда можно найти обратное.

    xor eax,eax
    sub eax, eax
    add eax, dword ptr [ebp+14] - а регистр ebp задается как правило в начале функции и тут у нас возникает бааальшая трабла.

    А вот обратные действия к АПИ - это вообще на грани искуственного интеллекта. И написать таблицу обратных функций апи - это не выход. )


    пример:

    hLib=LoadLibraryA("MyLib.dll")
    ...1-2 мегабайта кода....

    xFunc=GetProcAddress(hLib, "MyFucntion")

    ....1-2 мегабайта кода....
    x=xFunc(3, 1,4, someparameter)

    ... еще мегабайты кода

    x = x+Rsult;
    return x;


    И каким образом это выполнить в обратном порядке?


    Мы можем только выполнять программу в прямом порядке, но сохранять данные.. Не более... Толко смотреть на результаты работы ....
     
  7. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    мне нравятся подобные заявления, несмотря на фактическое существование подобной вещи. ппц просто...
    ты _лично_ попробовал как работает это в td386 и чем оно ограничено прежде чем что-либо заявлять ?
     
  8. Stiver

    Stiver Партизан дзена

    Публикаций:
    0
    Регистрация:
    18 дек 2004
    Сообщения:
    812
    Адрес:
    Germany
    infern0

    Я не знаю td386 и никогда с ним не работал. Но поиском находится следующее:


    Команда Back Trace

    Если вы выполняете трассировку программы,то данная команда изменяет порядок выполнения на обратный.

    [...] отслеживаются только инструкции, ко-
    торые выполняются по команде Trace Into (Трассировка вглубь)
    или Instruction Trace (Трассировка инструкций).

    Обратную трассировку вызова прерывания выполнять нельзя. Обратная трассировка инструкций, работающих с портами, не
    действует [...]


    Ну и так далее.. То есть обрати внимание, что речь идет на самом деле всего лишь о пошаговой отмене результатов трассировки. И даже она не всегда возможна. Думаю, что при трассировке после каждой инструкции просто сохраняется снимок контекста (инкрементально) и при необходимости восстанавливается. К обратному выполнению программы эта функция не имеет естественно никакого отношения. Как уже несколько раз было замечено выше, обратное выполнение невозможно.
     
  9. nitrotoluol

    nitrotoluol New Member

    Публикаций:
    0
    Регистрация:
    5 сен 2006
    Сообщения:
    848
    infern0
    медетируем над фразой.
     
  10. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    nitrotoluol
    давайте определимся с определениями :)
    1) запоминание контекста(состояние регистров, памяти, портов тд) перед выполнением инструкции - это одно, вполне реально. при отладке может быть очень полезно
    2) нахождение и выполнение алгоритма обратного некоему алгоритму - ну бывает реально, бывает challenge, бывает невозможно теоретически. любимая таска кейгенов. частный случай - алгоритм обратный самому себе (например xor)
    3) выполнение программы "обратным образом". то есть вот она выполнялась-выполнялась, потом остановилась и "пошла назад" по шагам восстанавливая прошлое. Невозможно теоретически, инструкции без потери информации - скорее исключение чем правило. Да и не нужно такое наверное никому?
     
  11. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    infern0
    а расскажи кстати как оно работает и чем ограничено
    реально "выполняются назад" инструкции?
    я чеcтно говоря очень мало турбо-дебаггер мучал, мне больше нравился тогда QA
     
  12. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    да. Кстати было очень полезно когда при трассировке случайно вылетел за пределы цикла и не просек условие или данные. Отмотал на десяток инструкций назад - и вот оно.
     
  13. leo

    leo Active Member

    Публикаций:
    0
    Регистрация:
    4 авг 2004
    Сообщения:
    2.542
    Адрес:
    Russia
    Мда, нет слов. td386 это не сумасбродная игрушка, а отладчик, который позволяет именно отматывать\откатывать назад, т.е. получать точно такое же состояние регистров\памяти каким оно было до исполнения заданной инструкции. А это ес-но возможно только при трассировке с сохранением в логе изменений после каждой инструкции и обратном пошаговом восстановлении регистров\памяти без всякого исполнения. Козе понятно, чтобы откатить инструкцию add eax,ecx без сохранения лога нужно выполнить не ее саму, а обратную ей sub eax,ecx. Козе также понятно, что есть необратимые операции типа xor eax,eax, и т.д. и т.п. Но великий infern0 ес-но не коза, и ему как всем великим свойственно ошибаться и верить в чудеса ;)) (чур без обид ;)
     
  14. infern0

    infern0 New Member

    Публикаций:
    0
    Регистрация:
    7 окт 2003
    Сообщения:
    811
    Адрес:
    Russia
    именно так afaik оно и работает.
     
  15. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    Tid0Wlas

    А почему бы и нет. Только вот памяти для сохранения контекста нужно оочень много, но задравый смысл в этом есть, но для OS с несколькими уровнями привелегий будет проблематично, теоретически все реально...
     
  16. z0mailbox

    z0mailbox z0

    Публикаций:
    0
    Регистрация:
    3 фев 2005
    Сообщения:
    635
    Адрес:
    Russia СПБ
    Если бы этой записью контекста еще и управлять можно было бы
    ну что-то типа: "list cmp ?,? ; test ?,?" за последнюю минуту по всем потокам

    хочу!

    а размеры памяти и скорость выполнения - не пугают, на нас работают лучшие умы международных корпораций ;)))
     
  17. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    Вот вы говорите об обратном исполнении, пусть инструкции, которая обратима. Как мы узнаем операцию обратную данной? В таблице будем хранить соответствия? Кароч ИМХО, вполне очевидно, что обратное исполнение не только невозможно (из-за необратимых операций), но и нафик никому не нужно.
     
  18. MSoft

    MSoft New Member

    Публикаций:
    0
    Регистрация:
    16 дек 2006
    Сообщения:
    2.854
    Mental_Mirror
    Поддерживаю, ибо проблема не только в контексте. А если программа выделила память и изменила ее? А если программа работала с файлами? Сохранять после каждой ассемблерной инструкци дамп всей памяти и винта???

    Поддерживаю вопрос "зачем это нужно???"!
     
  19. PROFi

    PROFi New Member

    Публикаций:
    0
    Регистрация:
    13 июл 2003
    Сообщения:
    690
    MSoft

    Задача решаема только при полной эмуляции выпоняемой программы ...
     
  20. Mental_Mirror

    Mental_Mirror New Member

    Публикаций:
    0
    Регистрация:
    7 май 2007
    Сообщения:
    431
    PROFi
    Вы вообще о чем???? Я не понимаю. Подробнее....