· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.RESEARCH —› Откуда Jump???

. 1 . 2 . >>

Посл.отвђт Сообщенiе


Дата: Апр 2, 2004 19:45:04

Предисловие: допустим, я имею информацию о том, что после определенных действий (неизвестно точно каких, т.к. бы не было вопроса) программа попадает на адрес ХХХ (и дальше выполняет что-то); так вот я ставлю на этот адрес «бряк». Стоит задача в изучении предыдущих действий. Далее два варианта:1) либо я возвращаюсь назад смотря на то что за адреса в стеке, или просто SoftIce->STACK (если переход был осуществлен ч/з push-ret?|call|iret?); 2) если переход ч/з JMP (или CS-новый дескриптор с подкорректированный базой)… - вот и сам вопрос: как вернуться назад, если переход был осуществлен по второму способу??? Ответа пока не нашел, но неужели неразрешимо???

И еще попутно: в ThreadContext содержится адрес следующей инструкции, которую выполнит Thread. Для работы с этой структурой есть свои API, но вот как быть если при изучении программы надо посмотреть адрес, а из SoftIce выходить низя??? Т.к. информация, полагаю, справочного х-ра, можно и ссылочкой обойтись.

Заранее благодарен. ---===ППС===---


Дата: Апр 2, 2004 20:34:26

PavPS
Единственное чего мы не знаем так это значения EIP(и CS) перед выполнением перехода. Поэтому самый простой вариант это проверить все ячейки памяти на предмет наличия там команды перехода на наш адрес.


Дата: Апр 2, 2004 20:57:46

Spасибо zа ответ!!! Так ведь не так всё просто!!! Ведь не посмотреть же все 2MB (или около того) на комманду JMP??? И кто застрахован от того что часть памяти ".code" будет содержать valid-ные комманды??? Дело в том, что программка то хитрая... половино кода перемешано с мусором, а половина закодилась... Вот ведь гадость то какая...
В основном, по-моему, надежда на (очень не уверен, но надеюсь в правильности мышления) какой-нибудь кэш комманд, чтобы сразу же узнать прошлую. НО!!! Но... Ну... короче низнаю. Можа кто исчо знает...


Дата: Апр 2, 2004 21:16:21

Единственный спосою - поставить бряк bpm. Поиск по памяти может дать ответ, но допустим найдёшь 50-70 таких jmp, это ещё в случае прямого перехода. А если это push XXXX/ret? Или jmp eax? Или что ещё лучше jmp [eax + ebx*4 + 1234h]. Так что только bpm и смотреть Last.....Ip или как его там.


Дата: Апр 2, 2004 21:21:05

dragon

Спасибо!

Пробуем..... . . . . . .


Дата: Апр 2, 2004 21:51:54

..... Попробовал...
Либо у меня крыша едет либо у SoftIce (второе маловероятно..) Короче, "BPM Address x" на эту комманду (т.е куда попадаем после какогго-то jump-а) не работат, хотя BPX пашет! На любые последующие комманды, ессно, BPM работат. Причина!???! т.е. низя узнать по Last.....Ip Кто знает почему? Please ответьте!!!


Дата: Апр 2, 2004 21:54:01

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


Дата: Апр 2, 2004 22:24:38

Всё то хорошо, но в посьавленной задаче стоит забыть про слово "ПЕРЕД", существует только после... Пока тут медитировал перед BSOD, вспомнил, что ведь не зря задал к вопросу маленький З.Ы.: если в прецессе вып-ся 1 нить (хотя пошевелив мозгами и вспомнив методы индукции можно распростронить на многие), то стоит поставить BPM на место в ThreadContext, куда при каждом усыплении нити планировщиком, кладется значение, к примеру EAX, т.е. гарантированно перезаписавыется перед дачей нити процессорного времени, и после этого бряка написать SoftIce-у условие IF {место в threadcontext, где сохранен EIP}==XXX then "бряк!". Так вот неплохо работать то будет, но вот еще лучше if вызывать бряк перед выполнением нитью каждой следующей комманды. Каша какая-то получилась, но, по-моему работать будет. Но ведь для выполнением нитью каждой следующей комманды не становиться же планировщиком??? If есть какие-то предложения пожалуйста ответьте. Неделю вокруг да около хожу, а поймать не могу. Хитрая штука, а надо-очень!!!


Дата: Апр 2, 2004 22:35:10

Здесь регистры DRx могут перезаписываться только в SEH. Отловить то создание треда можешь? Если можешь, то ставь векторный обработчик(VEH) и смотри, где исключения происходят(EIP в структуре CONTEXT), поймай момент перед переходом, затем после обработки исключения останови как-нибудь тред и ставь bpm, должно работать.


Дата: Апр 2, 2004 23:22:01

dragon, спасобо
Очень даже идейка!!! По хорошему, чуть доработыть, и какой там BPM, главное что я уже в прошлом (перед jmp) это исчо лучше! Чтож будем извращаться...


Дата: Апр 2, 2004 23:47:52

[ PavPS: но вот как быть если при изучении программы надо посмотреть адрес, а из SoftIce выходить низя???]

Можешь засуспендить прогу вручную через jmp $(EBh, FEh) или засуспендить с помощью IceExt..


Дата: Апр 3, 2004 00:10:14

Идея классная! Спасибо!
но по-моему успендить в цикле нехорошо (по крайней мере неудобно), т.к. у SoftIce-а глюк - не переключает контексты (ком. CONTEXT), и для перехода ставится бряк на любую ф-ю (API), и нырять в этот контекст. Я к тому, что пока прога циклица мы чё нибудь делаем, а потом поймать этот цикл и вернуть всё назад дело нудное.
Плохо-ли, хорошо-ли, но до этого догодался не я и =>судить не мне... Буду пользовать...


Дата: Апр 3, 2004 02:08:16

Так и не понял о чём это ты, чего там поймать нельзя, какой цикл..


Дата: Апр 3, 2004 14:03:06

[ PavPS: Стоит задача в изучении предыдущих действий. ]

Если те для дебага, то у айса есть такая фича как back trace buffer. Работает только под маздаем, к сожелению. См. доку.


[ PavPS: т.к. у SoftIce-а глюк - не переключает контексты ]

Очень даже легко - см. команду addr.


[ PavPS: На любые последующие комманды, ессно, BPM работат. Причина!???! т.е. низя узнать по Last.....Ip Кто знает почему? ]

У мя всё работает. Смотри...
0008:ed358b30  85c0                test      eax,eax
0008:ed358b32  7504                jnz       ed358b38
0008:ed358b34  33ff                xor       edi,edi
0008:ed358b36  eb47                jmp       ed358b7f
0008:ed358b38  6a0c                push      0c
0008:ed358b3a  33d2                xor       edx,edx


Имеем такой код. Ставим bpm на адрес ED358B38.
Break due to BP 02: BPMB #0010:ED358B38 X DR1  (ET=37.66 milliseconds)
  MSR LastBranchFromIp=ED358B32
    MSR LastBranchToIp=ED358B38


Видим, что LastBranchFromIp работает. Но если поставить bpm на адрес ED358B3A, то...
Break due to BP 00: BPMB #0010:ED358B3A X DR3  (ET=142.08 microseconds)
  MSR LastBranchFromIp=8054345F
    MSR LastBranchToIp=ED358B3A


Т.е. если предыдущая перед бряком инструкция была переходом, то это работает. Почему так, я не знаю. Надо интеловскую доку почитать. Кстати из MSR можно ещё тучу инфы вынимать.


Дата: Апр 3, 2004 17:05:56

PavPS
Воспользуйся ОllyDbg - запускаешь, ставишь бряку на jmp,
потом трейсишь TC EIP==JMP и идешь кофе пить, потом приходишь, и смотришь на лог. А там даже джамп увидишь. где программа с пути истинного свернула. Минус - при больших циклах тресинг может затянутся.

. 1 . 2 . >>


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.078