Сейчас на форуме: cppasm, asfa (+6 невидимых)

 eXeL@B —› Вопросы новичков —› Куда попадает исполнение программы во время сработки Event ?
Посл.ответ Сообщение

Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 07 апреля 2016 02:48
· Личное сообщение · #1

Работаю в Олли.
В программе-жертве по очереди идут вызовы ф-ций АПИ:
call kernel32.SetEvent
call kernel32.Sleep
Останавливаюсь на "call kernel32.Sleep"
Ставлю брейкпоинт на следующей за "call kernel32.Sleep" команде, жму F9. Прога мгновенно перескакивает через эту АПИ и останавливается на моем брейкпоинте. Но за это время успевает изменить приличный кусок кода в программе жертве.
Вроде понятно, что текущий поток заснул, управление перешло к другому потоку. Тот, другой поток, изменил код и разбудил предыдущий поток, передав ему управление.
Когда вызывается "call kernel32.SetEvent", то туда передается только хэндл. Как подсмотреть, куда должно перейти управление, во время этого Event?
Нужно потрейсить тот поток, а то трейс с "call kernel32.Sleep" убивает программу.
Извиняюсь, если непонятно написАл, спросите, попробую дообъяснить.




Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 07 апреля 2016 07:51 · Поправил: Rainbow
· Личное сообщение · #2

Event - это объект синхронизации, все правильно. Создается ф-ей CreateEvent, которая возвращает hEvent. SetEvent переводит объект в сигнальное состояние. Синхронизация по hEvent реализуется через функции WaitForSingleObject/WaitForMultipleObjects. hEvent обычно хранят в какой-нибудь глобальной переменной в памяти. Чтобы отследить, какой код синхронизируется через этот hEvent, можешь найти все места в программе, где идет обращение к этой переменной вышеупомянутыми функциями (выделяешь адрес hEvent, Find references to -> Address Constant). Ставишь бряки сразу после найденных WaitForSingleObject/WaitForMultipleObjects, их может быть несколько, брякаешься. И вперед - за знаниями !




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 08 апреля 2016 10:36
· Личное сообщение · #3

Rainbow пишет:
Чтобы отследить, какой код синхронизируется через этот hEvent, можешь найти все места в программе, где идет обращение к этой переменной вышеупомянутыми функциями

hEvent может и в структуре аргументом треда передаваться. А может и не передаваться! Может быть именованный эвент, а в другом треде или даже процессе открываться по имени.

-----
IZ.RU




Ранг: 30.1 (посетитель)
Активность: 0.070
Статус: Участник

Создано: 08 апреля 2016 15:42 · Поправил: Kuzya69
· Личное сообщение · #4

То-есть я должен пред вызовом "call Sleep(0)" ставить ВР на функции WaitForSingleObject и WaitForMultipleObjects.
Жмем F9, попадаем в "WaitFor....".
Идем до Retn из "WaitFor....".
Ну и выходим в наш искомый код.
Я правильно понял "политику партии"?
У меня виснет-валится такая конструкция в отладчике, может из-за Темиды, а может я чего-то недопонял.




Ранг: 324.3 (мудрец), 222thx
Активность: 0.480.37
Статус: Участник

Создано: 08 апреля 2016 16:57
· Личное сообщение · #5

Перед вызовом SetEvent

Добавлено спустя 2 минуты
Kuzya69 пишет:
ставить ВР на функции WaitForSingleObject и WaitForMultipleObjects

WaitForSingleObject
WaitForMultipleObjects
WaitForSingleObjectEx
WaitForSingleObjectsEx
MsgWaitForMultipleObjects
MsgWaitForMultipleObjectsEx

Вам нужно поймать выход из одной из них

Добавлено спустя 3 минуты
В самом простом случае в незапротекченом коде можно найти вызовы этих функций и поставить бряки после них

Добавлено спустя 14 минут
Также не стоит забывать про RegisterWaitForSingleObject и её колбэк.

-----
IZ.RU



 eXeL@B —› Вопросы новичков —› Куда попадает исполнение программы во время сработки Event ?
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати