[Win32] Проблемы сплайсинга
Висела как-то у меня в фоне утилитка нашей разработки, в которой перехват API-функций осуществляется методом сплайсинга… тестировал, в общем. И понадобилось мне поставить MetaSploit Framework (с DNS-cache poisoning-ом поэкспериментировать хотел). Запускаю приложение - БАЦ - упало… Повторяю попытки - аналогично… Долго не мог ничего понять, пока не осенило выключить нашу тулзу. Без нее все заработало! Начал копать дальше. Обнаружилось, что если запустить 2 копии нашей штуковины - “захученные” приложения падают.
После небольших тестовых отключений лишнего кода выяснилось, что проблема именно в установке сплайсинг-хука. Первый экземпляр работает отлично, но когда второй пытается встрять в цепочку - происходит что-то нехорошее. Анализ кода глазами ничего не дал. Никак я не мог я придумать причину, по которой проблема бы проявлялась только при двойной установке хука. Пришлось вспоминать молодость и ставить SoftIce.
С установкой Driver Studio на WinXp под VMWARE пришлось помучаться. Точнее, с отображением окна. Да и многое уже подзабылось, пришлось освежать память. Но все было не зря. Все-таки, SoftIce - сильная штука. Сразу определил, что на втором экземпляре DLL-ки передача управления осуществляется в невалидные адреса. То бишь JMP в небо. И наступило прозрение.
В коде сплайсинга не было предусмотрено пересчета смещений в командах с относительно адресацией (условные и безусловные переходы, call, loop и т.д..). Т.е. при переносе нескольких ассемблерных инструкций в другую область памяти обязательно нужно делать пересчет смещения.
Это все исправимо, зато пришло осознание другого момента. Если сплайсинг-хук установят приложения П1 и П2 по очереди, но П1 раньше сделает “анхук” - автоматически отключается хук в П2. То есть, с установкой нет никаких проблем. Приложений в цепочке может быть сколько угодно, и все будет отлично работать. Но вот если какое-то из них делает откат - автоматически отключаются все переходы, установленные позже. Такие вот дела…
Сентябрь 28th 2008 in Безопасность, Обо всем
Комментариев: 12 к записи “[Win32] Проблемы сплайсинга”
Сплайсинг, перехват API функций - пересчет относительных смещений
Прогулка по Москве, фото: красная площадь, московский кремль, ночная москва.
Случайные записи: поисковая оптимизация WordPress , щенки лабрадора
Werden сказал 28 Сен 2008 at 23:44 #
а я вот ничего не понял из этого:)….
слова знакомые, а вот смысл не уловил….
сказал 29 Сен 2008 at 00:22 #
Не представив в голове как детально как сплайсинг работает вряд ли получится уловить смысл текста, конечно. Если что - поиск по кейворду
“API сплайсинг -белков -рнк”
сказал 29 Сен 2008 at 00:50 #
Дополнение. Команды вроде LOOP, LOOPZ и JZ, JB и т.п. - двухбайтовые. Макс. значение перехода - +- 128 байт. Соответственно, переместить эти инструкции (оторвать от части кода) куда-то далеко не выйдет…
Skull сказал 29 Сен 2008 at 15:39 #
еще лет 5 и я пойму что-то кроме комманд.
и того что смещение 4х-байтное, о чем я и не слышал… отстал от жизни видимо…
сказал 29 Сен 2008 at 22:40 #
Дополнение к последнему абзацу. Кроме анхука будет еще другая беда. Когда мы выгрузим и П2, оно запишет в ориг. функцию джамп на код из П1, который уже выгружен. И будет креш.
Отсюда вопрос… Как бы корректей это разрулить? Может проверять ЧТО там по этому адресу записано?
Или перед перезаписью оригинальных инструкций проверить стоит ли там джамп на нашу функцию? Если нет (т.е. нам его кто-то сбил) - при анхуке ничего не трогать.
Eduard сказал 02 Окт 2008 at 19:12 #
Сначала всегда все кажется таким сложным. Я например с программированием 2 месяца сидел, пока хоть что-то начал понимать.
spomoni сказал 09 Окт 2008 at 19:51 #
ака “Кореляция релитивистских мурзиков”, но все равно кайфово
Яна сказал 16 Окт 2008 at 20:47 #
Помоему если речь идео об откате своего приложения - проще за собой оставить немного мусора но сохранить цепочку.
Или, как вариант, при откате проверять текущее значение адреса перехода и сравнивать со своим.
А для чужих “поделок” всеравно неполучится ничего сделать - как обваливали систему - так и будут
сказал 17 Окт 2008 at 00:15 #
Ага, только варианты. Панацеи нет, к сожалению. Значит надо минимизировать использование сплайсинга. Т.е. только в случае многопоточности использовать. В остальных - стандартный перехват функций. А еще хочется все-таки с драйвера попробовать поработать, благо примеров куча… Но что-то вот все эти годы сдерживало.
Ильдар сказал 07 Ноя 2008 at 15:29 #
А как при откате проверять текущее значение адреса перехода и сравнивать со своим??????
kipish сказал 08 Янв 2009 at 00:45 #
А вы праздновали день программиста?
Dmitrii сказал 17 Апр 2009 at 20:43 #
А вы праздновали день программиста?