Покорение вершин отладки Крис Касперски Хакер, номер #095, стр. 095-118-5 Обработка сигналов Сигналом называется асинхронное событие, происходящее в программе и чем-то напоминающее структурные исключения в Windows. Сигналы делятся на фатальные и нефатальные. Примером нефатального сигнала является SIGALRM, возбуждаемый при срабатывании интервального таймера. А вот при нарушении доступа к памяти генерируется сигнал SIGSEGV, завершающий программу в аварийной режиме, если только программист не предусмотрел специальный обработчик. Отладчик gdb перехватывает все сигналы и в зависимости от своей конфигурации либо передает сигнал программе, либо «поглощает» его, делая вид, что ничего интересного не происходит. Посмотреть текущую конфигурацию gdb можно с помощью команды info signals (она же info handle), а для изменения реакции gdb необходимо воспользоваться «handle сигнал поведение», где «сигнал» — название сигнала, например SIGSEGV, а «поведение» — реакция отладчика на возникновение сигнала, описываемая следующими ключевыми словами: nostop - при получении этого сигнала gdb не останавливает программу; stop - при получении этого сигнала gdb останавливает программу; print - при получении данного сигнала gdb выводит сообщение о нем на экран; noprint - gdb не замечает этот сигнал; pass - gdb позволяет программе увидеть этот сигнал; nopass - gdb маскирует этот сигнал, не позволяя программе увидеть его. Некоторые сигналы, например сигнал SIGTRAP, возникающий при достижении программной точки останова, отладчик резервирует для своих собственных нужд. Этим обстоятельством пользуются многие защищенные программы, определяющие, находятся ли они под отладкой или нет (трюк проделывается за счет установки своего собственного обработчика SIGTRAP и последующего выполнения инструкции INT 03h). При выполнении без gdb управление получает обработчик, в противном случае сигнал поглощается отладчиком и обработчик уже не получает управление. Файлы, упакованные протектором burneye, содержат следующий код: Дизассемблерный фрагмент файла, защищенного протектором burneye 0x053714b1: mov $0x30,%edx 0x053714b6: mov %edx,%eax 0x053714b8: int $0x80 0x053714ba: add $0x5375a00,%esi 0x053714c0: mov %esi,0xfffffd24(%ebp) 0x053714c6: int3 0x053714c7: cmpl $0x0,0x5375748 0x053714ce: jne 0x53714e2 ... 0x05371a0c: push %ebp 0x05371a0d: mov %esp,%ebp 0x05371a0f: incl 0x5375748 0x05371a15: leave 0x05371a16: ret Попытка отладки программы в нормальном режиме приводит к ее краху (см. рис.), если, конечно, в момент возбуждения сигнала не увеличить содержимое ячейки 5375748h на единицу. Но существует гораздо более простой и элегантный путь. Дождавшись «ругательства» отладчика по поводу поимки сигнала SIGTRAP, мы даем команду handle SIGTRAP pass и передаем программе управление командой continue. И все будет работать, как часы! |