
إضافات ونصوص IDA لتحليل إطار استخدام المسجلات

"""
ما هو استخدام هذا المُسجِّل؟
همم.. سأُعيد تسميته إلى veryuniquename، وأبحث نصيًا، وأجد كل المراجع!
حسنًا.. في انتظار انتهاء البحث.. في أي لحظة الآن.. تم!
الآن علي فقط فهم أي من نتائج البحث ذات صلة بإطار الاستخدام الحالي للمُسجِّل.
لا ينبغي أن يكون الأمر صعبًا جدًا، أليس كذلك؟
"""
إذا حدث لك هذا (ربما أكثر من مرة)، فأنت على موعد مع متعة!
فقط اضغط Shift-X، وستختفي مشاكلك!
يمكنك أيضًا إعادة تسمية المُسجِّل في إطار الاستخدام. فقط اضغط Shift-N، واتبع التعليمات!
أيضًا - بدلاً من تغيير أنواع جميع الاستخدامات إلى نوع معين، فقط اضغط Shift-T مرة واحدة.
وأخيرًا وليس آخرًا - إذا أردت تعيين إزاحة (مثل Ctrl-R) لجميع استخدامات هذا المُسجِّل، فقط اضغط Shift-R.
ملاحظة: أحيانًا يوجد إضافة أخرى تستخدم Shift-T. قم بإزالة تلك الإضافة - أنت لم تستخدمها من قبل على أي حال :-).
تستخدم هذه الإضافة sark للتفاعل مع نصوص IDA بطريقة مريحة، و cachetools لتخزين مسح الإطار مؤقتًا مما يجعله أسرع بكثير.
تدعم Oregami كلاً من IDA 7.x/8.x و IDA 9.0+.
إذا كنت تستخدم IDA 9، تأكد من أن لديك إصدارًا محدثًا من sark يدعم IDA 9.
ملاحظة: IDA 9 قدم وظيفة Shift-X الخاصة به. إذا كنت بحاجة إلى استخدام Shift-X المدمج في IDA بدلاً من وظيفة Oregami، فيجب عليك تغيير اختصار oregami في ملف الإضافة.
[لـ python3]
pip3 install sark
[لـ python2]
إذا كنت تستخدم إصدار python2 من IDA، فيجب عليك بدلاً من ذلك تشغيل:
pip2 install -U git+https://github.com/tmr232/[email protected]#egg=Sark
لاحظ أن python2 غير مدعوم بشكل نشط (حيث أن IDA انتقلت في الغالب إلى python3، وكذلك أنا)، لذلك قد لا يعمل هذا.
git clone https://github.com/shemesh999/oregami
يقدم كود sark العديد من الإضافات. واحد منها هو: https://github.com/tmr232/Sark/blob/master/plugins/plugin_loader.py
نوصي بنسخه إلى دليل الإضافات الخاص بك ثم تشغيل IDA مرة واحدة بصلاحيات المدير (حتى يتمكن من إنشاء ملفات plugins.list).
بعد القيام بذلك، يمكنك إضافة إضافات جديدة عن طريق إضافة المسار إليها في أحد ملفات plugins.list التي تم إنشاؤها (على سبيل المثال، يتم إنشاء واحد في مجلد cfg
في IDA)
الآن، أضف إلى أحد ملفات plugins.list:
FULLPATH\oregami\oregami_plugin.py
FULLPATH\oregami\regname_plugin.py
FULLPATH\oregami\typeregter_plugin.py
FULLPATH\oregami\offreg_plugin.py
أعد تشغيل IDA، وستعمل الإضافات.
بديل:
انسخ جميع الملفات (بما في ذلك المجلد الداخلي oregami، باستثناء setup.py) إلى دليل إضافات IDA.
بالإضافة إلى استخدامها كإضافات، يمكن استخدام oregami أيضًا لكتابة السكريبتات الخاصة بك!
لهذا، يجب عليك أولاً التثبيت باستخدام ملف setup.py المرفق. بمعنى أنه يجب عليك استدعاء:
'python setup.py develop'، ومن ثم يمكنك استخدام الفئات والوظائف الداخلية.
لاحظ أننا نوصي باستخدام 'develop' وليس 'install'، حتى إذا قمت بسحب إصدار جديد من oregami، فسيعمل مباشرة.
على سبيل المثال:
-- script.py --
def find_func_usage(func_ea, reg='r0'):
"""
البحث وطباعة جميع استخدامات المُسجِّل، بما في ذلك معلومات عن المعاملات المحددة
التي يوجد فيها، والعملية التي يقوم بها في المعامل.
"""
import oregami
rf = oregami.RegFrame(func_ea, reg)
for insn in rf.get_instructions():
print('Addr:{:x}'.format(insn.ea))
for opnd in insn.operands:
if opnd.uf_is_external:
continue
print('--opnd_idx:{} - {}'.format(opnd.n, oregami.UsageBits(opnd.op_flags)))
لنفترض التسلسل التالي من الرموز:
ROM:01000010 e_lis r10, 0x4004 # 0x40040000 # تحميل فوري منزاح
ROM:01000014 e_add16i r10, r10, 0x1337 # 0x40041337 # إضافة فورية
ROM:01000020 se_mr r30, r31 # نقل مُسجِّل
ROM:01000022 cmplw r11, r10 # مقارنة كلمة منطقية
ROM:01000026 se_bge loc_1000036 # فرع إذا كان أكبر من أو يساوي
ROM:01000028
ROM:01000028 loc_1000028: # مرجع كود XREF: sub_0100000+144↓j
ROM:01000028 e_stmw r30, 0(r11) # تخزين كلمات متعددة
ROM:0100002C e_add16i r11, r11, 8 # إضافة فورية
ROM:01000030 cmplw r11, r10 # مقارنة كلمة منطقية
ROM:01000034 se_blt loc_1000028 # فرع إذا كان أقل من
ROM:01000036
ROM:01000036 loc_1000036: # مرجع كود XREF: sub_0100000+136↑j
ROM:01000036 e_add16i r10, r10, 8 # إضافة فورية
ROM:0100003A e_li r11, 0 # تحميل فوري
إذا قمنا بمسح إطار استخدام المُسجِّل r10، بدءًا من العنوان 01000022، سنجد ثلاثة أنواع من الاستخدامات ضمن إطار الاستخدام.
سيشمل ذلك التعليمات التي تهيئ قيمة المُسجِّل.
قد نرغب في تضمين فقط آخر تعليمات غيرت قيمة المُسجِّل (العنوان 01000014 في المثال)، أو سلسلة من العمليات المستخدمة لتعيين القيمة الأولية للمُسجِّل (العناوين 01000010 و 01000014 في المثال).
يمكن تسمية سلسلة العمليات المستخدمة في تهيئة المُسجِّل بـ "مرحلة التهيئة".
يمكنك اختيار دعم مرحلة التهيئة أم لا، اعتمادًا على المعامل init_stage_bool في تهيئة RegFrame.
سيشمل ذلك التعليمات التي تستخدم قيمة المُسجِّل ولا تغيرها بأي شكل. هذه تتوافق مع السطرين 01000022 و 01000030 في المثال.
سيشمل ذلك التعليمات التي تستخدم قيمة المُسجِّل ولكنها تغير قيمته بعد ذلك. يمكن رؤية هذه التعليمات كجزء من إطارين استخدام متميزين - الإطار المؤدي إليهما، والإطار الناشئ عنهما.
هذا يتوافق مع السطر 01000036.
عند مسح إطار استخدام المُسجِّل، الوصول إلى عملية تهيئة أو عملية فاصل سيتسبب في إيقاف المسح في اتجاه معين.
ولكن، قد نوقف المسح أيضًا بسبب تعليمات خارج إطار الاستخدام.
على سبيل المثال، مسح إطار استخدام المُسجِّل r11 بدءًا من العنوان 01000030 سيتوقف عند السطر 0100003A.
هذه هي الفئة الأساسية المستخدمة في oregami. عن طريق تهيئتها على عنوان ومُسجِّل محدد، ستقوم بمسح إطار استخدام المُسجِّل، وستنشئ UFInstruction لجميع التعليمات ذات الصلة.
get_instruction - الحصول على التعليمات من العنوان المحدد
get_instructions - مولد، يعيد التعليمات الموجودة في إطار الاستخدام.
يمكنك أيضًا طلب مجموعات فرعية محددة من التعليمات المستخدمة:
get_init_instructions - الحصول فقط على تعليمات من نوع التهيئة
get_pure_instructions - الحصول فقط على تعليمات من نوع النقي
get_break_instructions - الحصول فقط على تعليمات من نوع الفاصل
get_nobreak_instructions - الحصول فقط على تعليمات ليست من نوع الفاصل (أي تهيئة + نقي)
get_noinit_instructions - الحصول فقط على تعليمات ليست من نوع التهيئة (أي نقي + فاصل)
get_outbreak_instructions - الحصول فقط على تعليمات من نوع الفاصل الخارجي
افتراضيًا، ستقوم هذه الفئة بتخزين نتائج المسح مؤقتًا، وتمنع إعادة مسح نفس إطار الاستخدام. هذا يعني أن طلب RegFrame لأي تعليمات كانت جزءًا من إطار الاستخدام (خاصة من أنواع التهيئة + النقي. وليس الفواصل، لأن بدء المسح عليها يجب أن يعيد إطار الاستخدام الناشئ عنها) سيعيد نفس مثيل RegFrame المحسوب مسبقًا. لإجبار إعادة المسح، استخدم علامة force عند تهيئة الفئة.
هذه هي الفئة التي يعيدها RegFrame، وتمثل تعليمة في إطار الاستخدام.
ترث هذه الفئة من فئة Instruction في sark، وبالتالي تدعم نفس الأساليب.
الفرق الرئيسي هو أنه بدلاً من احتواء مصفوفة من فئة Operand في sark، ستحتوي على مصفوفة من فئة UFOperand.
تحتوي هذه الفئة أيضًا على أساليب لفهم نوع التعليمة (تهيئة، نقي، فاصل، فاصل خارجي)، وبتات العمليات (قراءة، كتابة، صريح، وأنواع مختلفة من الضمني)
هذه هي الفئة الموجودة في مصفوفة المعاملات داخل UFInstruction معينة.
ترث هذه الفئة من فئة Instruction في sark، وبالتالي تدعم نفس الأساليب.
بالإضافة إلى عمليات sark، تحتوي على أساليب للحصول على بتات العملية (قراءة، كتابة، صريح، وأنواع مختلفة من الضمني)، ومعرفة ما إذا كان المعامل جزءًا فعليًا من إطار الاستخدام (مفيد لمعرفة أي معامل في تعليمة من نوع الفاصل هو جزء من إطار الاستخدام)
هذه فئة تُستخدم لتحليل تعليمة معينة، لمعرفة استخدامها فيما يتعلق بالمُسجِّلات.
تفعل ذلك باستخدام المعرفة من IDA، والتحليل النصي، وتفاصيل محددة خاصة بالمعالج.
سبب هذه الفئة هو أن التحليل الأساسي لـ IDA يميل إلى الكذب بشأن مجموعة المُسجِّلات المستخدمة، والطريقة التي تُستخدم بها في العديد من الرموز.
ترث هذه الفئة من فئة Instruction في sark، وبالتالي تدعم نفس الأساليب.
الفرق الرئيسي هو أنه بدلاً من احتواء مصفوفة من فئة Operand في sark، ستحتوي على مصفوفة من فئة RegOperand.
هذه فئة تُستخدم لتحليل معامل معين، لمعرفة استخدامه فيما يتعلق بالمُسجِّلات.
تفعل ذلك باستخدام المعرفة من IDA، والتحليل النصي، وتفاصيل محددة خاصة بالمعالج.
سبب هذه الفئة هو أن التحليل الأساسي لـ IDA يميل إلى الكذب بشأن مجموعة المُسجِّلات المستخدمة، والطريقة التي تُستخدم بها في العديد من الرموز.
ترث هذه الفئة من فئة Operand في sark، وبالتالي تدعم نفس الأساليب.