Win32 - Проблемы сплайсинга

Висела как-то у меня в фоне утилитка нашей разработки, в которой перехват API-функций осуществляется методом сплайсинга… тестировал, в общем. И понадобилось мне поставить MetaSploit Framework (с DNS-cache poisoning-ом поэкспериментировать хотел). Запускаю приложение - БАЦ - упало… Повторяю попытки - аналогично… Долго не мог ничего понять, пока не осенило выключить нашу тулзу. Без нее все заработало! Начал копать дальше. Обнаружилось, что если запустить 2 копии нашей штуковины - “захученные” приложения падают.

После небольших тестовых отключений лишнего кода выяснилось, что проблема именно в установке сплайсинг-хука. Первый экземпляр работает отлично, но когда второй пытается встрять в цепочку - происходит что-то нехорошее. Анализ кода глазами ничего не дал. Никак я не мог я придумать причину, по которой проблема бы проявлялась только при двойной установке хука. Пришлось вспоминать молодость и ставить SoftIce. :)

Opera + SoftIce - WSASend под сплайсинг-прицелом

С установкой Driver Studio на WinXp под VMWARE пришлось помучаться. Точнее, с отображением окна. Да и многое уже подзабылось, пришлось освежать память. Но все было не зря. Все-таки, SoftIce - сильная штука. Сразу определил, что на втором экземпляре DLL-ки передача управления осуществляется в невалидные адреса. То бишь JMP в небо. И наступило прозрение.

В коде сплайсинга не было предусмотрено пересчета смещений в командах с относительно адресацией (условные и безусловные переходы, call, loop и т.д..). Т.е. при переносе нескольких ассемблерных инструкций в другую область памяти обязательно нужно делать пересчет смещения.

Это все исправимо, зато пришло осознание другого момента. Если сплайсинг-хук установят приложения П1 и П2 по очереди, но П1 раньше сделает “анхук” - автоматически отключается хук в П2. То есть, с установкой нет никаких проблем. Приложений в цепочке может быть сколько угодно, и все будет отлично работать. Но вот если какое-то из них делает откат - автоматически отключаются все переходы, установленные позже. Такие вот дела…