On-line patching в секретах и советах Крис касперски Хакер, номер #093, стр. 093-080-6 Аппаратные точки останова Наилучший результат дают аппаратные точки останова, установленные на критические машинные команды/переменные защитного кода. Возвращаясь к листингу 1 — мы бы могли установить аппаратную точку по исполнению на адрес 04E59E2h (где расположена инструкция jz loc_4E5A37) и вместо того, чтобы модифицировать ее, просто изменить значение регистра EIP таким образом, чтобы он указывал на следующую машинную команду, как будто условный переход не выполнялся. Тоже самое и с переменной флагом регистрации. Установить точку останова по чтению/записи и… Тогда сторожевые псы, контролирующие целостность машинного кода, ничего не смогут обнаружить! Контрольная сумма образа файла не изменится, да и сам он останется в неприкосновенности (поэтому, за такой взлом юридически очень трудно привлечь к ответственности). Красота да и только! Подробнее о точках останова можно прочитать в руководстве Intel или в моей "технике и философии хакерских атак", копию которой можно бесплатно скачать с ftp://nezumi.org.ru. Однако, в работе с точками останова есть множество тонкостей, не отраженных в документации. Команда типа "mov Drx, eax" на прикладном режиме вызовет исключение, обвиняющее нас в попытке выполнить привилегированную инструкцию на ring 3. Но не спеши засаживаться за написание драйвера — отладочные регистры беспрепятственно меняются через контекст! Для этого даже необязательно обладать привилегиями администратора, а отлавливать отладочные исключения можно и через SEH. Как это осуществить на практике — смотри в файле Drx.c, выложенном на нашем DVD. Устанавливать точки останова можно как в своем, так и в чужом потоке, но в последнем случае исключение поймает чужой поток, а точнее его собственный фильтр структурных исключений, который может быть переустановлен в любой момент. Навряд ли он сумеет разобраться откуда взялось это исключение и что с ним делать, поэтому нашей первой задачей будет контроль за собственным SEH-обработчиком — если ломаемая программа устанавливает новый SEH-фильтр, мы должны перекидывать наш обработчик наверх. Сделать это достаточно просто. Указатель на текущий SEH-фрейм хранится по адресу FS:[0] и нам ничего не стоит установить сюда точку останова по записи. Следует только помнить, что у каждого потока имеется свой собственный SEH, а точек останова — всего четыре. С другой стороны, можно породить в отлаживаемом процессе своей поток (либо через CreateRemoteThread, вызванной из on-line patcher'а, либо с помощью CreateThread, вызванной из перехваченной API-функции). Как вариант, on-line patcher может запустить ломаемую программу как отладочный процесс, получая уведомления обо всех исключениях, но протекторы страшно не любят когда их отлаживают, да и точки останова они предпочитают затирать еще в зародыше, поэтому, устанавливать их следует только на чистом коде, свободном от мин, то есть в непосредственной близости от защитного механизма, подобраться к которому позволяет перехват API-функций. |