Метка: patch

Patch (патч кода): что это такое и как используется внедрение ASM-инструкций

Ключевая фраза: patch (патч кода)

Что такое patch (патч кода)

Patch (патч кода) — это изменение уже скомпилированного или выполняющегося кода без пересборки исходников. В контексте низкоуровневой разработки под patch обычно понимают внедрение или замену машинных (ASM) инструкций прямо в существующем бинарном коде.

В отличие от обычных исправлений через исходный код, здесь мы работаем уже на уровне:

  • байтов
  • инструкций процессора
  • адресов в памяти

Именно поэтому patch широко используется в системном программировании, reverse engineering и разработке прокси/перехватчиков.


Где применяется patch

Практическое применение patch встречается гораздо чаще, чем кажется:

1. Исправление ошибок без исходников

Если нет доступа к исходному коду (например, сторонняя библиотека), можно:

  • найти проблемное место
  • заменить инструкцию
  • изменить поведение функции

2. Перехват и модификация логики

Типичный пример — MITM или прокси:

  • подменить вызов функции
  • изменить параметры
  • внедрить дополнительную логику

3. Оптимизация горячих участков

Иногда проще заменить несколько инструкций, чем:

  • пересобирать проект
  • менять ABI
  • затрагивать зависимые модули

4. Временные фиксы (hot patching)

Используется в продакшене:

  • без перезапуска
  • без деплоя
  • прямо в памяти процесса

Как работает внедрение patch

На практике patch — это просто перезапись байтов по адресу.

Пример: замена инструкции

Допустим, есть код:

cmp eax, 0
jne short loc_continue

Можно заменить на:

nop
nop

Или даже:

jmp loc_continue

Фактически это означает:

  • мы меняем поведение программы
  • без изменения исходников
  • только через байты

Основные техники patch

Inline patch (вставка в тело функции)

Самый простой вариант:

  • перезаписать инструкции прямо в коде
  • например, заменить проверку или вызов

Jump patch (перенаправление)

Классика:

jmp my_handler

Дальше:

  • оригинальный код можно сохранить
  • или частично выполнить вручную

Trampoline

Более аккуратный вариант:

  1. Сохраняем оригинальные инструкции
  2. Прыгаем в свой код
  3. Возвращаемся обратно

Используется в:

  • хуках
  • профайлерах
  • логгерах

Важные ограничения и проблемы

1. Длина инструкций

Нельзя просто так заменить одну инструкцию на другую:

  • x86 — переменной длины
  • нужно учитывать точный размер

2. Выравнивание и границы

Если испортить границу инструкции:

  • код станет невалидным
  • приложение упадёт

3. Защита памяти

Перед patch нужно:

  • снять защиту (например, VirtualProtect)
  • потом вернуть обратно

4. Многопоточность

Если патчить код «на лету»:

  • другой поток может выполнить полубитый код
  • нужны синхронизация или safe-point

Patch vs Hook — в чем разница

Часто путают, но это не одно и то же:

  • Patch — это изменение кода
  • Hook — это способ перехвата (часто через patch)

То есть:

любой hook использует patch, но не каждый patch — это hook


Когда patch — это правильное решение

Patch оправдан, если:

  • нет доступа к исходникам
  • нужно быстрое исправление
  • требуется вмешательство на уровне бинарника
  • важна минимальная инвазивность

Но это не замена нормальной архитектуре.


Когда patch — плохая идея

Есть ситуации, где patch только навредит:

  • код часто меняется (адреса «поплывут»)
  • нет контроля версий бинарника
  • сложная логика → лучше переписать нормально

Patch — это инструмент, а не универсальное решение.


Итог

Patch (патч кода) — это мощная техника, позволяющая изменять поведение программы на уровне машинных инструкций без пересборки.

Она используется в:

  • системном программировании
  • reverse engineering
  • прокси и перехватчиках
  • отладке и hot-fix решениях

Но требует аккуратности, понимания архитектуры CPU и строгого контроля.

Исправление ошибки в поддержке асинхронного COM при запуске приложения

В статье Асинхронный COM под Windows Vista и Windows 7 была описана ошибка, которая появилась при выходе указанных операционных систем. Для разрабатываемого (а на тот момент уже и продававшегося) программного обеспечения надежная работа асинхронного COM была очень важна. Обращения в Microsoft с просьбой внести исправления ничем не закончились. Оставался только один вариант — самостоятельное исправление

Асинхронный COM под Windows Vista и Windows 7

Технология COM (Component Object Model) развивается уже почти двадцать лет. До сих пор на ней построена работа подавляющего числа компонентов системы. Думаю, что так и будет продолжаться в ближайшем будущем. Асинхронный COM — это вариант использования этой технологии. Некоторые приложения начала 2000-х использовали его для построения высоконагруженных серверов. Все не так безоблачно для Асинхронного COM.