Правильное применение сплайсинга при перехвате функций подготовленных к HotPatch
В прошлой статье я рассмотрел пять вариантов перехвата функций включая их вариации. Правда в ней я оставил не рассмотренными две неприятных ситуации: 1. Вызов перехваченной функции в тот момент, когда ловушка снята. 2. Одновременный вызов перехваченной функции из двух разных нитей. В первом случае программист, установивший перехватчик не будет видеть всю картину в целом, т.к. часть данных пройдет мимо него. Второй случай грозит более серьезными последствиями, вплоть до падения приложения, в котором установлен перехватчик. Обе этих ситуации могут быть только в случае применения сплайсинга. При перехвате через таблицы импорта/экспорта и т.п. модификации тела перехватываемой функции не происходит, поэтому данные варианты перехвата не требуют излишних телодвижений. В этой статье более подробно будет рассмотрен сплайсинг точки входа функции подготовленной к HopPatch, т.к. данные функции предоставляют нам способ ухода от вышеперечисленных ошибок. Перехват сплайсингом через JMP NEAR OFFSET или PUSH ADDR + RET (наиболее уязвимый к данным ошибкам) рассмотрен не будет, т.к. по хорошему, без реализации дизассемблера длин, заставить данный вариант перехвата работать как нужно не получится.Читать дальше →