
Python से बाइनरी पैचिंग
एक या अधिक सरल पायथन स्क्रिप्ट का उपयोग करके एक ELF बाइनरी को पैच करता है।
उपयोग:
patch <binary> <patchdir|file> [patchdir|file...]
इसमें एक या अधिक पायथन पैच फ़ाइलें होती हैं, जिन्हें एक बाइनरी के विरुद्ध वर्णमाला क्रम में निष्पादित किया जाएगा।
एक पते को NOP करना, एक असेंबली फ़ंक्शन इंजेक्ट करना, और एंट्री पॉइंट को हुक करना:
def simple_patch(pt):
# एंट्री पॉइंट पर एक जंप को NOP करें
pt.patch(pt.entry, hex='90' * 5)
# बाइनरी में असेंबली इंजेक्ट करें और पता लौटाएं
addr = pt.inject(asm='mov eax, 1; ret')
# एंट्री पॉइंट को हुक करें ताकि यह addr को कॉल करे (ret मूल एंट्री पॉइंट को चलाएगा)
pt.hook(pt.entry, addr)
एक C फ़ंक्शन को बदलना:
def replace_free(pt):
# मान लें कि free() इस पते पर है:
old_free = 0x804fc4
# free() को बदलने के लिए एक फ़ंक्शन इंजेक्ट करें
new_free = pt.inject(c=r'''
void free_stub(void *addr) {
printf("stubbed free(%p)\n", addr);
}
''')
# free() की शुरुआत को हमारे नए फ़ंक्शन पर जंप करने के लिए पैच करें
pt.patch(old_free, jmp=new_free)
addr = search(data)
hook(addr, new_addr)
patch(addr, *compile arg*)
addr = inject(*compile arg*)
*compile arg* निम्नलिखित में से कोई भी है:
raw='data'
hex='0bfe'
asm='nop'
jmp=0xaddr
c='void func() { int a; a = 1; }' (केवल inject पर समर्थित, patch पर नहीं)
कुछ स्क्रिप्ट ida/ पथ में रहती हैं। इन्हें इस तरह चलाएं:
/Applications/IDA\ Pro\ 6.8/idaq.app/Contents/MacOS/idaq64 -A -Sida/allfuncs.py a.out
इस प्रकार लागू करने पर, allfuncs.py a.out.funcs उत्पन्न करेगा जिसका उपयोग हार्डनिंग स्क्रिप्ट द्वारा किया जाता है।
ये अभी कुछ हद तक CGC और x86-विशिष्ट हैं, लेकिन भविष्य में सामान्य उपयोग के लिए पोर्ट किए जाएंगे।
./deps.sh चलाएं।