
KeyPatch Enhanced — Keystone Engine द्वारा संचालित, symbol-aware x86/x64 assembly patching के लिए IDA Pro plugin। स्वचालित IDA symbol resolution, RIP-relative encoding, और _↔. name correction के साथ Keypatch का fork।
Keypatch (by Nguyen Anh Quynh & Thanh Nguyen) पर आधारित एक उन्नत शाखा, जिसे Euarno द्वारा संशोधित किया गया है।
मुख्य सुधार: x86/x64 असेंबली में सीधे IDA सिंबल नामों का उपयोग करें, प्लगइन स्वचालित रूप से पते को हल करता है और सही 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 पर जाने वाला एक जंप patch करना चाहते हैं:
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] की RIP-relative एड्रेसिंग सीमा ±2GB है। यदि सिंबल सीमा से बाहर है, तो प्लगइन त्रुटि संदेश देगा।push symbol के लिए, सिंबल पता ≤ 0x7FFFFFFF होना चाहिए (imm32 साइन एक्सटेंशन), अन्यथा चेतावनी दी जाएगी। lea reg, symbol + push reg का उपयोग करने की सलाह दी जाती है।lea rcx, sym; call func रूप के बहु-कथन सिंबल रिज़ॉल्यूशन का समर्थन अभी नहीं है। कृपया एक-एक करके patch करें।_ ↔ . नाम सुधार, x64 RIP-relative एन्कोडिंग समर्थन, उन्नत त्रुटि आउटपुटयह संशोधित संस्करण MIT लाइसेंस के अंतर्गत जारी किया गया है। विवरण के लिए LICENSE फ़ाइल देखें।
मूल Keypatch कोड का कॉपीराइट मूल लेखकों के पास है, जो GPL v2 के अंतर्गत जारी किया गया है।