
KeyPatch Enhanced — إضافة IDA Pro لترقيع لغة التجميع x86/x64 الواعي بالرموز، مدعومة بمحرك Keystone. تفرّع من 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 فحسب.
لنفترض أنك تريد patch قفزة إلى rc4_crypt عند العنوان 0x140001966:
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] هو ±2GB. إذا تجاوز الرمز النطاق، ستعرض الإضافة رسالة خطأ.push symbol ضمن x64، يجب أن يكون عنوان الرمز ≤ 0x7FFFFFFF (توسيع إشارة imm32)، وإلا سيظهر تحذير. يُنصح باستخدام lea reg, symbol + push reg بدلًا من ذلك.lea rcx, sym; call func. يرجى عمل patch لكل تعليمة على حدة._ ↔ .، دعم ترميز x64 RIP-relative، إخراج أخطاء محسّنتُنشر هذه النسخة المعدّلة تحت رخصة MIT. راجع ملف LICENSE للتفاصيل.
حقوق النشر الخاصة بكود Keypatch الأصلي تعود للمؤلف الأصلي، ويُنشر تحت رخصة GPL v2.