Miasm - Cheatsheet إطار عمل الهندسة العكسية
Miasm هو إطار عمل Python مجاني ومفتوح المصدر لتحليل وإنشاء ومعالجة الملفات الثنائية. يمكنه فك التجميع عبر معماريات عديدة (x86/x64 و ARM و MIPS و PPC وغيرها)، ورفع الكود إلى تمثيل وسيط (IR) خاص به، محاكاة التنفيذ مع JIT، والتنفيذ الرمزي لإزالة الالتباس وحل القيود. إنه مجموعة أدوات برمجية — تقودها من Python — مما يجعلها قوية لأتمتة الهندسة العكسية ومهام إلغاء الحماية التي لا تستطيع أدوات الواجهة الرسومية القيام بها بسهولة.
التثبيت
| الطريقة | الأمر |
|---|
| pip | pip install miasm |
| من المصدر | git clone https://github.com/cea-sec/miasm && cd miasm && pip install -e . |
| JIT اختياري (LLVM) | pip install llvmlite (محرك محاكاة أسرع) |
| Docker | docker build -t miasm . من المستودع |
| تحقق | python -c "import miasm; print('ok')" |
الوحدات الأساسية
| الوحدة | الغرض |
|---|
miasm.analysis.binary | تحميل حاوية ثنائية (ELF/PE/raw) |
miasm.analysis.machine | تجريد العمارة (Machine("x86_64")) |
miasm.core.locationdb | تتبع العناوين/الملصقات عبر التحليل |
miasm.ir | التمثيل الوسيط للتعليمات |
miasm.analysis.dse | محرك التنفيذ الرمزي الديناميكي |
miasm.jitter | محرك المحاكاة/JIT |
فك التجميع
from miasm.analysis.binary import Container
from miasm.analysis.machine import Machine
from miasm.core.locationdb import LocationDB
loc_db = LocationDB()
cont = Container.from_stream(open("target.bin", "rb"), loc_db)
machine = Machine(cont.arch)
mdis = machine.dis_engine(cont.bin_stream, loc_db=loc_db)
asmcfg = mdis.dis_multiblock(cont.entry_point) # فك التجميع العودي → CFG
for block in asmcfg.blocks:
print(block)
| اتصل | الوصف |
|---|
mdis.dis_block(addr) | فك تجميع كتلة أساسية واحدة |
mdis.dis_multiblock(addr) | فك التجميع العودي إلى CFG |
asmcfg.blocks | كتل أساسية متكررة |
asmcfg.dot() | تصدير رسم بياني تدفق التحكم إلى Graphviz |
التمثيل الوسيط (IR)
lifter = machine.lifter_model_call(mdis.loc_db)
ircfg = lifter.new_ircfg_from_asmcfg(asmcfg)
for lbl, irblock in ircfg.blocks.items():
print(irblock)
يقيس IR التعليمات الخاصة بالعمارة إلى لغة صغيرة من نوع محدد، وهذا بالضبط ما يجعل التحليل متعدد الهياكل والمنطق الرمزي ممكنًا.
المحاكاة (Jitter)
from miasm.analysis.machine import Machine
jitter = Machine("x86_64").jitter("llvm") # أو "python" أو "gcc"
jitter.init_stack()
# خريطة الكود وتعيين السجلات ثم:
jitter.run(0x401000)
| الخادم | المقايضة |
|---|
python | محمول وأبطأ |
gcc | أسرع ويتطلب المترجم |
llvm | الأسرع ويتطلب llvmlite |
| الميزة | الاستخدام |
|---|
add_breakpoint(addr, cb) | قم بتشغيل رد نداء Python بعنوان |
vm.set_mem(addr, data) | اكتب الذاكرة قبل التشغيل |
| استدعاءات النظام/واجهات برمجية مخصصة | استدعاء مكتبة hook أثناء المحاكاة |
التنفيذ الرمزي
from miasm.ir.symbexec import SymbolicExecutionEngine
sb = SymbolicExecutionEngine(lifter)
symbolic_pc = sb.run_at(ircfg, 0x401000)
print(sb.symbols) # حالة السجل/الذاكرة الرمزية
التنفيذ الرمزي هو أساس إزالة الالتباس وحل المدخلات وتبسيط الخردة/المسندات المعتمة.
سير العمل الشائع
| الهدف | النهج |
|---|
| تصدير CFG للعرض | asmcfg.dot() → العرض مع Graphviz |
| إلغاء الحماية/إزالة الالتباس | محاكاة مع jitter وتفريغ الذاكرة في OEP |
| حل للمدخل | التنفيذ الرمزي + حل SMT (z3) |
| التحليل متعدد الهياكل | رفع إلى IR وتشغيل نفس الممرات بغض النظر عن الهيكل |
Miasm مقابل أطر عمل RE الأخرى
| الجانب | Miasm | angr | Ghidra |
|---|
| اللغة | Python | Python | Java/GUI |
| IR | IR خاص | VEX | P-code |
| المحاكاة | JIT مدمج | Unicorn-based | API Emulator |
| التنفيذ الرمزي | نعم | نعم (نقطة قوة أساسية) | محدود |
| الأفضل لـ | التحليل المرتجل وإزالة الالتباس | الرمزي/CTF | RE التفاعلية |
الموارد