Skip to content
KitploitKITPLOIT
أدواتعمليات الاستغلالالمدونة
Log in
إرسال
أدواتعمليات الاستغلالالمدونة
إرسال

أدوات الاختراق واختبار الاختراق والأمن السيبراني لترسانتك الأمنية!

Kitploit هو دليل لأدوات الاختراق والأمن السيبراني واختبار الاختراق. اكتشف آخر تحديثات المشاريع للعثور على الثغرات وتحليل الأنظمة وأتمتة الاختبارات وتعزيز أمنك.

الخلاصاتاتصالالخصوصية© 2026 Kitploit

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
pyvex — ارتباطات Python لـ VEX IR الخاص بـ Valgrind. | Kitploit
أدوات/GitHubGitHub/angr/pyvex
التحليل الثابتتحليل الثغرات الأمنيةتحليل الكودالهندسة العكسيةالأدوات والمكوناتتحليل الملفات الثنائيةالأوراق والأبحاث
GitHubangr/pyvex

pyvex

ارتباطات Python لـ VEX IR الخاص بـ Valgrind.

عرض المستودع
38012918منذ 4 أيامتمت المراجعة من قبل Kitploit

الأكثر شعبية

عرض الكل →

اكتشف الأدوات الأكثر استخدامًا من قبل مجتمعنا.

استكشف جميع الأدوات

تصفح مجموعتنا من الأدوات

عرض جميع الأدوات →
مشاركة

PyVEX

أحدث إصدار إصدار Python إحصائيات PyPI الترخيص

PyVEX هو ارتباطات Python لـ VEX IR.

روابط المشروع

مستودع المشروع: https://github.com/angr/pyvex

التوثيق: https://api.angr.io/projects/pyvex/en/latest/

تثبيت PyVEX

يمكن تثبيت PyVEX عبر pip:

pip install pyvex

استخدام PyVEX

import pyvex
import archinfo

# translate an AMD64 basic block (of nops) at 0x400400 into VEX
irsb = pyvex.lift(b"\x90\x90\x90\x90\x90", 0x400400, archinfo.ArchAMD64())

# pretty-print the basic block
irsb.pp()

# this is the IR Expression of the jump target of the unconditional exit at the end of the basic block
print(irsb.next)

# this is the type of the unconditional exit (i.e., a call, ret, syscall, etc)
print(irsb.jumpkind)

# you can also pretty-print it
irsb.next.pp()

# iterate through each statement and print all the statements
for stmt in irsb.statements:
    stmt.pp()

# pretty-print the IR expression representing the data, and the *type* of that IR expression written by every store statement
import pyvex
for stmt in irsb.statements:
    if isinstance(stmt, pyvex.IRStmt.Store):
        print("Data:", end="")
        stmt.data.pp()
        print("")

        print("Type:", end="")
        print(stmt.data.result_type)
        print("")

# pretty-print the condition and jump target of every conditional exit from the basic block
for stmt in irsb.statements:
    if isinstance(stmt, pyvex.IRStmt.Exit):
        print("Condition:", end="")
        stmt.guard.pp()
        print("")

        print("Target:", end="")
        stmt.dst.pp()
        print("")

# these are the types of every temp in the IRSB
print(irsb.tyenv.types)

# here is one way to get the type of temp 0
print(irsb.tyenv.types[0])

ضع في اعتبارك أن هذا تمثيل نحوي لكتلة أساسية. أي أنه سيخبرك بما تعنيه الكتلة، لكن ليس لديك أي سياق لتقول، على سبيل المثال، ما هي البيانات الفعلية التي تكتبها تعليمة تخزين.

التمثيل الوسيط VEX

للتعامل مع معماريات متنوعة على نطاق واسع، من المفيد إجراء التحليلات على تمثيل وسيط. يجرد التمثيل الوسيط (IR) عدة اختلافات في المعماريات عند التعامل مع معماريات مختلفة، مما يسمح بتشغيل تحليل واحد على جميعها:

  • أسماء السجلات. تختلف كمية وأسماء السجلات بين المعماريات، لكن تصاميم المعالجات الحديثة تلتزم بموضوع مشترك: كل معالج يحتوي على عدة سجلات للأغراض العامة، وسجل لحمل مؤشر المكدس، ومجموعة من السجلات لتخزين أعلام الحالة، وهكذا. يوفر التمثيل الوسيط واجهة متسقة ومجردة للسجلات على منصات مختلفة. تحديداً، يمثل VEX السجلات كمساحة ذاكرة منفصلة، مع إزاحات صحيحة (أي أن rax في AMD64 يُخزَّن بدءاً من العنوان 16 في مساحة الذاكرة هذه).
  • الوصول إلى الذاكرة. تصل المعماريات المختلفة إلى الذاكرة بطرق مختلفة. على سبيل المثال، يمكن لـ ARM الوصول إلى الذاكرة في وضعي little-endian و big-endian. يجب أن يجرد التمثيل الوسيط هذه الاختلافات.
  • تقسيم الذاكرة. تدعم بعض المعماريات، مثل x86، تقسيم الذاكرة من خلال استخدام سجلات مقاطع خاصة. يفهم التمثيل الوسيط آليات الوصول إلى الذاكرة هذه.
  • الآثار الجانبية للتعليمات. لمعظم التعليمات آثار جانبية. على سبيل المثال، معظم العمليات في وضع Thumb على ARM تحدّث أعلام الحالة، وتعليمات دفع/سحب المكدس تحدّث مؤشر المكدس. تتبع هذه الآثار الجانبية بطريقة مخصصة في التحليل سيكون جنوناً، لذا يجعل التمثيل الوسيط هذه الآثار صريحة.

هناك العديد من الخيارات للتمثيل الوسيط. نستخدم VEX، لأن رفع الكود الثنائي إلى VEX مدعوم جيداً. VEX هو تمثيل مستقل عن المعمارية وخالٍ من الآثار الجانبية لعدد من لغات الآلات المستهدفة. يجرد كود الآلة إلى تمثيل مصمم لتسهيل تحليل البرامج. يحتوي هذا التمثيل على خمس فئات رئيسية من الكائنات:

  • التعبيرات. تمثل تعبيرات التمثيل الوسيط قيمة محسوبة أو ثابتة. يشمل ذلك تحميلات الذاكرة، وقراءات السجلات، ونتائج العمليات الحسابية.
  • العمليات. تصف عمليات التمثيل الوسيط تعديلاً لتعبيرات التمثيل الوسيط. يشمل ذلك الحساب الصحيح، والحساب العشري، وعمليات البتات، وهكذا. تؤدي عملية التمثيل الوسيط المطبقة على تعبيرات التمثيل الوسيط إلى تعبير تمثيل وسيط كنتيجة.
  • المتغيرات المؤقتة. يستخدم VEX متغيرات مؤقتة كسجلات داخلية: تُخزَّن تعبيرات التمثيل الوسيط في متغيرات مؤقتة بين الاستخدامات. يمكن استرجاع محتوى متغير مؤقت باستخدام تعبير تمثيل وسيط. هذه المتغيرات المؤقتة مرقمة، بدءاً من t0. هذه المتغيرات المؤقتة ذات أنواع قوية (أي "عدد صحيح 64-بت" أو "عدد عشري 32-بت").
  • العبارات. تمثل عبارات التمثيل الوسيط التغييرات في حالة الآلة المستهدفة، مثل تأثير تخزينات الذاكرة وكتابات السجلات. تستخدم عبارات التمثيل الوسيط تعبيرات التمثيل الوسيط للقيم التي قد تحتاجها. على سبيل المثال، تستخدم عبارة التمثيل الوسيط لتخزين الذاكرة تعبير تمثيل وسيط للعنوان المستهدف للكتابة، وتعبير تمثيل وسيط آخر للمحتوى.
  • الكتل. كتلة التمثيل الوسيط هي مجموعة من عبارات التمثيل الوسيط، تمثل كتلة أساسية ممتدة (تسمى "IR Super Block" أو "IRSB") في المعمارية المستهدفة. يمكن أن تحتوي الكتلة على عدة مخارج. للمخارج الشرطية من منتصف كتلة أساسية، تُستخدم عبارة Exit خاصة من التمثيل الوسيط. يُستخدم تعبير تمثيل وسيط لتمثيل هدف المخرج غير الشرطي في نهاية الكتلة.

تمثيل VEX IR موثق جيداً في ملف libvex_ir.h (https://github.com/angr/vex/blob/dev/pub/libvex_ir.h) في مستودع VEX. للكسالى، سنفصّل بعض أجزاء VEX التي من المحتمل أن تتفاعل معها بشكل متكرر. للبدء، إليك بعض تعبيرات التمثيل الوسيط:

تعبير التمثيل الوسيطالقيمة المُقيَّمةمثال مخرجات VEX
Constantقيمة ثابتة.0x4:I32
Read Tempالقيمة المخزنة في متغير مؤقت VEX.RdTmp(t10)
Get Registerالقيمة المخزنة في سجل.GET:I32(16)
Load Memoryالقيمة المخزنة في عنوان ذاكرة، مع تحديد العنوان بتعبير تمثيل وسيط آخر.LDle:I32 / LDbe:I64
Operationنتيجة عملية تمثيل وسيط محددة، مطبقة على وسائط تعبير تمثيل وسيط محددة.Add32
If-Then-Elseإذا قُيِّم تعبير تمثيل وسيط معين إلى 0، أعد تعبير تمثيل وسيط واحد. وإلا، أعد آخر.ITE
Helper Functionيستخدم VEX دوال مساعدة بلغة C لعمليات معينة، مثل حساب سجلات الأعلام الشرطية لمعماريات معينة. تعيد هذه الدوال تعبيرات التمثيل الوسيط.function_name()

ثم تُستخدم هذه التعبيرات، بدورها، في عبارات التمثيل الوسيط. إليك بعض العبارات الشائعة:

عبارة التمثيل الوسيطالمعنىمثال مخرجات VEX
Write Tempاضبط متغيراً مؤقتاً في VEX على قيمة تعبير التمثيل الوسيط المعطى.WrTmp(t1) = (IR Expression)
Put Registerحدّث سجلاً بقيمة تعبير التمثيل الوسيط المعطى.PUT(16) = (IR Expression)
Store Memoryحدّث موقعاً في الذاكرة، معطى كتعبير تمثيل وسيط، بقيمة، معطاة أيضاً كتعبير تمثيل وسيط.STle(0x1000) = (IR Expression)
Exitمخرج شرطي من كتلة أساسية، مع تحديد هدف القفز بتعبير تمثيل وسيط. يُحدَّد الشرط بتعبير تمثيل وسيط.if (condition) goto (Boring) 0x4000A00:I32

يُنتَج مثال لترجمة تمثيل وسيط، على ARM، أدناه. في المثال، تُترجم عملية الطرح إلى كتلة تمثيل وسيط واحدة تتألف من 5 عبارات تمثيل وسيط، كل منها يحتوي على تعبير تمثيل وسيط واحد على الأقل (على الرغم من أن كتلة التمثيل الوسيط في الواقع العملي تتكون عادةً من أكثر من تعليمة واحدة). تُترجم أسماء السجلات إلى فهارس رقمية تُعطى لتعبير GET وعبارة PUT. سيلاحظ القارئ الذكي أن الطرح الفعلي يُنمذَج بواسطة أول 4 عبارات تمثيل وسيط في الكتلة، وأن زيادة عداد البرنامج للإشارة إلى التعليمة التالية (التي تقع، في هذه الحالة، عند 0x59FC8) تُنمذَج بواسطة العبارة الأخيرة.

التعليمة ARM التالية:

subs R2, R2, #8

تصبح تمثيل VEX IR هذا:

t0 = GET:I32(16)
t1 = 0x8:I32
t3 = Sub32(t0,t1)
PUT(16) = t3
PUT(68) = 0x59FC8:I32

أشياء رائعة!

الاستشهاد بـ PyVEX

إذا استخدمت PyVEX في عمل أكاديمي، يرجى الاستشهاد بالورقة البحثية التي طُوِّر من أجلها:

تنزيل الأداة