eXeL@B —› Вопросы новичков —› Куда попадает исполнение программы во время сработки Event ? |
Посл.ответ | Сообщение |
|
Создано: 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" убивает программу. Извиняюсь, если непонятно написАл, спросите, попробую дообъяснить. |
|
Создано: 07 апреля 2016 07:51 · Поправил: Rainbow · Личное сообщение · #2 Event - это объект синхронизации, все правильно. Создается ф-ей CreateEvent, которая возвращает hEvent. SetEvent переводит объект в сигнальное состояние. Синхронизация по hEvent реализуется через функции WaitForSingleObject/WaitForMultipleObjects. hEvent обычно хранят в какой-нибудь глобальной переменной в памяти. Чтобы отследить, какой код синхронизируется через этот hEvent, можешь найти все места в программе, где идет обращение к этой переменной вышеупомянутыми функциями (выделяешь адрес hEvent, Find references to -> Address Constant). Ставишь бряки сразу после найденных WaitForSingleObject/WaitForMultipleObjects, их может быть несколько, брякаешься. И вперед - за знаниями ! |
|
Создано: 08 апреля 2016 10:36 · Личное сообщение · #3 Rainbow пишет: Чтобы отследить, какой код синхронизируется через этот hEvent, можешь найти все места в программе, где идет обращение к этой переменной вышеупомянутыми функциями hEvent может и в структуре аргументом треда передаваться. А может и не передаваться! Может быть именованный эвент, а в другом треде или даже процессе открываться по имени. ----- IZ.RU |
|
Создано: 08 апреля 2016 15:42 · Поправил: Kuzya69 · Личное сообщение · #4 То-есть я должен пред вызовом "call Sleep(0)" ставить ВР на функции WaitForSingleObject и WaitForMultipleObjects. Жмем F9, попадаем в "WaitFor....". Идем до Retn из "WaitFor....". Ну и выходим в наш искомый код. Я правильно понял "политику партии"? У меня виснет-валится такая конструкция в отладчике, может из-за Темиды, а может я чего-то недопонял. |
|
Создано: 08 апреля 2016 16:57 · Личное сообщение · #5 Перед вызовом SetEvent Добавлено спустя 2 минуты Kuzya69 пишет: ставить ВР на функции WaitForSingleObject и WaitForMultipleObjects WaitForSingleObject WaitForMultipleObjects WaitForSingleObjectEx WaitForSingleObjectsEx MsgWaitForMultipleObjects MsgWaitForMultipleObjectsEx Вам нужно поймать выход из одной из них Добавлено спустя 3 минуты В самом простом случае в незапротекченом коде можно найти вызовы этих функций и поставить бряки после них Добавлено спустя 14 минут Также не стоит забывать про ----- IZ.RU |
eXeL@B —› Вопросы новичков —› Куда попадает исполнение программы во время сработки Event ? |