
KeyPatch Enhanced — плагин для IDA Pro для символо-ориентированного патчинга ассемблера x86/x64 на базе Keystone Engine. Форк Keypatch с автоматическим разрешением символов IDA, RIP-относительным кодированием и исправлением имён _↔.
Улучшенная ветка на основе Keypatch (от Nguyen Anh Quynh & Thanh Nguyen), модифицированная Euarno.
Ключевое улучшение: прямое использование имён символов IDA в ассемблере x86/x64 — плагин автоматически разрешает адреса и генерирует корректную RIP-relative / rel32-кодировку.
В диалоговом окне Keypatch можно напрямую вводить инструкции с именами символов, без ручного вычисления адресов и смещений:
call rc4_crypt ; автоматический расчёт относительного смещения rel32
jmp main ; аналогично
lea rcx, enc_0 ; x64: автоматически генерируется lea rcx, [rip + disp32]
lea rax, Format ; аналогично
_ ↔ .)IDA иногда отображает . из базы данных как _ (например, enc.0 отображается как enc_0). Плагин автоматически пытается найти вариант с заменой _ → ., так что о внутреннем формате хранения IDA можно не беспокоиться.
| Тип | Пример | Обработка |
|---|---|---|
| CALL / JMP / Jcc | call func_name | Символ → абсолютный адрес, Keystone вычисляет rel32 |
| LEA (голый символ) | lea rcx, symbol | x64: → lea rcx, [rip + disp32]x86: → lea ecx, [addr] |
| LEA (составной операнд) | lea rcx, [rbp+0x120+Str] | Заменяется только символ на значение адреса, структура выражения сохраняется |
| MOV offset | mov rax, offset symbol | x64: преобразуется в lea rax, [rip + disp32]при выходе за диапазон используется mov rax, imm64 |
Обращение к памяти [symbol] | mov rax, qword ptr [symbol] | [symbol] → [0xADDR], Keystone кодирует автоматически |
| Символ-непосредственное значение | push symbol | Символ → 0xADDR |
При неудачном ассемблировании в окне вывода отображается:
Keypatch: Keystone error: Invalid operand (KS_ERR_ASM_INVALIDOPERAND)
Keypatch: input asm : lea rcx, [rip + 0x176E3]
Keypatch: fixed asm : LEA RCX, [RIP + 0x176E3]
Keypatch: address : 0x140001966
pip install keystone-engine
Скопируйте keypatch.py в каталог плагинов IDA:
| Система | Путь |
|---|---|
| Windows | %APPDATA%\Hex-Rays\IDA Pro\plugins\ или <каталог установки IDA>\plugins\ |
| macOS | ~/.idapro/plugins/ или <каталог установки IDA>/plugins/ |
| Linux | ~/.idapro/plugins/ или <каталог установки IDA>/plugins/ |
Перезапустите IDA.
Предположим, вы хотите пропатчить по адресу 0x140001966 переход на rc4_crypt:
Assembly: call rc4_crypt
Плагин автоматически разрешает адрес rc4_crypt, вычисляет смещение rel32 и генерирует корректную кодировку E8 xx xx xx xx.
Assembly: lea rcx, enc_0
Плагин автоматически:
enc_0 (внутреннее имя может быть enc.0) → адрес 0x140013050disp32 = 0x140013050 - (0x140001966 + 7)lea rcx, [rip + 0x176E3]nop) — весь диапазон будет заполнен автоматическиlea и [symbol] составляет ±2 ГБ. Если символ выходит за пределы диапазона, плагин выдаст ошибку.push symbol в x64 адрес символа должен быть ≤ 0x7FFFFFFF (знаковое расширение imm32), иначе будет предупреждение. Рекомендуется использовать lea reg, symbol + push reg.lea rcx, sym; call func пока не поддерживается. Патчите по одной инструкции._ ↔ ., поддержка RIP-relative кодировки в x64, улучшенный вывод ошибокДанная модифицированная версия распространяется под лицензией MIT. Подробности см. в файле LICENSE.
Авторские права на оригинальный код Keypatch принадлежат авторам оригинала; он распространяется под GPL v2.