Skip to content
KitploitKITPLOIT
أدواتالمدونة
إرسال
أدواتالمدونة
إرسال

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

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

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

دليل الأدوات

الفئات

عرض جميع الفئات
Loading categories
fnprint — طابِق الدوال في الملفات الثنائية وفقًا لما تفعله، وليس وفقًا لشكل وحدات البايت فيها. بصمة سلوكية للدوال عبر التنفيذ المصغّر. | Kitploit
أدوات/GitHubGitHub/1rhino2/fnprint
تحليل الثغرات الأمنيةتحليل الشفرة الديناميكي (DAST)الهندسة العكسيةتحليل البرمجيات الخبيثةتحليل الملفات الثنائيةتحليل البرامج الثابتة
GitHub1rhino2/fnprint

fnprint

طابِق الدوال في الملفات الثنائية وفقًا لما تفعله، وليس وفقًا لشكل وحدات البايت فيها. بصمة سلوكية للدوال عبر التنفيذ المصغّر.

عرض المستودع
44437منذ 20س 37دلم تتم المراجعة بعد
الموقع الإلكتروني

الأكثر شعبية

عرض الكل →

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

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

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

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

fnprint

يطابق fnprint الدوال في الملفات التنفيذية بناءً على ما تفعله، وليس بناءً على شكل بايتاتها أو رسومها البيانية للتحكم في التدفق. يشغّل كل دالة في محاكي صغير بمدخلات مُختلقة، ويسجّل الآثار الجانبية التي تنتجها، ويحوّل هذا السلوك إلى بصمة عبر التجزئة. دالتان تتصرفان بالطريقة نفسها تحصلان على بصمات متشابهة، حتى لو بُنيتا بواسطة مترجم مختلف أو عند مستوى تحسين مختلف.

الهدف من فعل ذلك بهذه الطريقة: تواقيع البايتات (FLIRT، FunctionID) تنكسر في اللحظة التي يُعاد فيها ترجمة الكود، ومطابقات CFG (BinDiff، Diaphora) تصبح هشة عبر -O0 مقابل -O3. السلوك يصمد أمام كليهما بشكل أفضل بكثير.

x86-64 ELF فقط في الوقت الحالي. راجع الحدود قبل أن تثق به.

أرني

fnprint naming functions in a stripped, differently-compiled binary

وجّهه إلى ملف تنفيذي مجرّد من الرموز وإلى مجموعة من الأشياء التي لديك أسماء لها بالفعل:

root@kitploit:~
$ strip --strip-all mystery.so
$ nm mystery.so
nm: mystery.so: no symbols

$ fnprint index libz.so -o corpus.db          # a build you have symbols for
$ fnprint query mystery.so --corpus corpus.db
named 9 function(s):
  0x000022f9  100.0%  adler32_z
  0x00002a8d  100.0%  compress2
  0x0000ad5d  100.0%  inflateBackEnd
  0x0000adc4   86.7%  inflate_fast
  0x00002e67   80.5%  crc32_z
  ...

هذا التشغيل عبارة عن بناء -O0 مجرّد بالكامل من الرموز، تم تسميته من مجموعة -O2. مستوى تحسين مختلف، صفر رموز متبقية، والأسماء تعود صحيحة. يسمّي ما يثق به ويصمت عن الباقي.

الشيء الآخر الذي يفعله هو مقارنة بناءين وإخبارك بالدوال التي تغيّر سلوكها، وهذا مفيد عندما يطرح مورّد برنامجًا ثابتًا جديدًا وتريد معرفة ما الذي تحرّك فعلاً:

root@kitploit:~
$ fnprint match old.so new.so
compared 84 functions present in both
  unchanged:  53
  changed:    1
  low-signal: 31 (too small to judge)

changed behavior (lowest similarity first):
   61.7%  deflate_stored

للعمل الفعلي على الثغرات المعروفة (n-day) هناك triage. ابنِ مجموعة من النسخة المعروفة بأنها قابلة للاستغلال لدالة ما وأخرى من النسخة المُرقّعة، ثم رتّب بناءً مجهولاً مقابل كليهما. الدالة القريبة من الجانب القابل للاستغلال والمنفصلة بوضوح عن الجانب المُرقّع هي ما تريد وضعه أمام إنسان، وليس مجرد درجة تطابق واحدة عليك تفسيرها:

root@kitploit:~
$ fnprint index vuln.so    -o vuln.db
$ fnprint index patched.so -o patched.db
$ fnprint triage mystery.so --vuln vuln.db --patched patched.db
43 functions triaged: 1 look vulnerable, 0 patched, 42 inconclusive

review queue (vuln-leaning, strongest first):
   addr         vuln%  patched%  margin  matches
   0x000022f9  100.0     27.3   +72.7  adler32_z vs crc32_z

الدوال الـ 42 المتطابقة في كلا النسختين تعود بنتيجة غير حاسمة عن قصد، فلا يمكن نسبها إلى أي من الجانبين ولا ينبغي الإشارة إليها. يتحكم --margin و--min-sim في مدى وجوب انفصال الجانبين قبل أن يبتّ.

كيف يعمل

لكل دالة:

  • يُخطّط الملف التنفيذي ويقفز إلى الدالة مع بيانات عشوائية في سجلات الوسائط.
  • أي قراءة من الذاكرة لم نُهيّئها تُعيد قيمة حتمية وتُخطّط الصفحة أثناء التنفيذ. المؤشرات الشاردة لا تُسقط التشغيل أبدًا، والمدخل نفسه يعطي دائمًا التتبع نفسه. هذه هي حيلة التنفيذ المصغّر (microexecution) لدى Godefroid.
  • الاستدعاءات لدوال أخرى تُستبدل (تُسجّل ثم تُتخطى) حتى لا نغوص في libc ويبقى التشغيل حول هذه الدالة.
  • نسجّل تدفقًا محايدًا تجاه المعمارية من الآثار: أي مخازن وسائط وحقول بنى يقرأها ويكتبها، وأي أصناف قيم يكتبها (نسخة من مدخل، ثابت صغير، مؤشر)، والاستدعاءات التي يجريها، والفروع التي يسلكها، وما يُعيده. تُطرح العناوين المطلقة جانبًا، ويُحتفظ فقط بالإزاحات والأشكال.
  • يُحوّل ذلك التدفق إلى shingles وتوقيع minhash. التشابه هو نسبة خانات minhash المتطابقة، وهو ما يقدّر مقدار تداخل سلوك دالتين. يحافظ فهرس نطاقات LSH على ألا تقارن الاستعلامات كل شيء بكل شيء.

لا بيانات تدريب، لا نموذج. الفكرة نفسها تظهر في الأدبيات باسم Blanket Execution (Egele وآخرون، USENIX Security 2014)؛ وfnprint هو تطبيق عملي ومُصان لها مع واجهة سطر أوامر يمكنك استخدامها فعلاً.

التثبيت

يحتاج إلى سلسلة أدوات rust ومكتبتي unicorn وcapstone.

root@kitploit:~
# debian/ubuntu/kali
sudo apt install libunicorn-dev libcapstone-dev

cargo install --path cli
# or just
cargo build --release   # binary at target/release/fnprint

الاستخدام

root@kitploit:~
fnprint index <binary> [-o out.db]      fingerprint every function, optionally to a db
fnprint match <a> <b>                   diff two binaries (or .db files) by behavior
fnprint query <target> --corpus <db>    name unknown functions from a corpus
fnprint triage <t> --vuln <db> --patched <db>   rank a build against vuln vs patched corpora
fnprint eval <a> <b>                     accuracy metrics using symbol names as truth
fnprint dump <binary> <func>            print the recorded effect trace (debugging)

يأخذ match وquery إما ملف ELF أو ملف .db بنيته بـ index، بحيث يمكنك أخذ بصمة مجموعة مرة واحدة وإعادة استخدامها.

مخرجات الآلة

كل أمر يأخذ --format عامًا:

root@kitploit:~
fnprint query mystery.so --corpus corpus.db --format json > names.json
fnprint query mystery.so --corpus corpus.db --format r2   > fnprint.r2

json مخطط مستقر للسكربتات (ونموذج الاستيراد Ghidra في contrib/)، وr2 يصدر أوامر إعادة تسمية afn تشغّلها داخل rizin/radare2 عبر . fnprint.r2. تُنقّى أسماء الرموز من الهدف قبل وصولها إلى أي منهما، بحيث لا يمكن لاسم مُصمّم أن يحقن أوامر r2. المخططات والإعداد في docs/integrations.md.

الفهرسة أحادية العملية افتراضيًا. FNPRINT_SHARDS=N fnprint index ... يوزّع فهرسًا كبيرًا على N من العمال المعزولين؛ وتكون المجموعة متطابقة بايتًا بأي قيمة لـ N. وهو يساعد فقط على الملفات التنفيذية الكبيرة الغنية بالدوال، لذا فهو معطّل ما لم تطلبه.

الدقة

دقة المرتبة الأولى هي: بالنسبة لدالة في البناء A، رتّب كل دالة في البناء B حسب التشابه، هل أفضل نتيجة هي الصحيحة. هذه بالضبط مهمة التسمية بعد تجريد الرموز. مقيسة على zlib 1.3.1 (84 دالة)، قابلة لإعادة الإنتاج عبر bench/run.sh:

pairrank-1precision
gcc O0 -> O197.1%93.8%
gcc O0 -> O293.1%83.3%
gcc O0 -> O391.3%100.0%
gcc/clang O097.7%97.1%
gcc O2 -> O356.5%66.7%
gcc/clang O259.1%50.0%

الجدول الكامل بالإضافة إلى مكتبة ثانية (lua) في bench/NUMBERS.md.

يُبلّغ eval أيضًا عن recall@3 / recall@5 ومعدل الامتناع، لأن المرتبة الأولى وحدها تخفي الكثير. على gcc O0 -> O2 تكون أفضل نتيجة صحيحة 93% من الوقت لكن الدالة الصحيحة تكون ضمن أفضل 5 بنسبة 96.6% من الوقت، لذا تُغلق ميزانية مراجعة صغيرة معظم الفجوة. كما يمتنع (يرفض إصدار حكم "متطابق" واثق) عن الأزواج التي ليس متأكدًا منها بدلاً من التخمين، ولهذا تبقى الدقة عالية بينما يكون الاستدعاء عند العتبة نفسها منخفضًا.

القراءة الصادقة: عندما يكون لدى أحد الجانبين على الأقل بعض الثراء السلوكي (أي شيء بـ -O0/-O1، أو زوج عبر مترجمين عند -O0) فإنه يقع في نطاق 80-98%. عندما يكون الجانبان محسّنين بكثافة يصبح السلوك الذي يمكننا ملاحظته رقيقًا ويهبط نحو رمي العملة. هذه هي الحدود الصعبة لمطابق واحد بلا تدريب، وهذا لا يدّعي خلاف ذلك.

ما هو سيئ فيه

  • الدوال الصغيرة. الـ thunks والـ accessors ذات السطر الواحد لا تفعل ما يكفي لأخذ بصمة، لذا يحجبها (وهذا هو عدد "low-signal" و"with enough signal").
  • الحساب البحت. مجموعتا تحقق تقرآن مخزنًا وتُعيدان رقمًا تبدوان متشابهتين، لأنهما من الخارج متشابهتان تقريبًا.
  • المنطق العميق خلف شرط مسبق حقيقي. التنفيذ المصغّر بمدخلات عشوائية يمارس سلوك مدخل الدالة. تغيير مدفون في حالة لا نصل إليها أبدًا بمدخلات عشوائية لن يظهر في match. يلتقط التغييرات البنيوية وتغييرات المسار المبكر، وليس كل تعديل عميق.
  • التحسين الكثيف على كلا الجانبين، كما تُظهر الأرقام أعلاه.
  • التشويش الكثيف (القائم على الآلة الافتراضية خاصةً) سيدمّره.

الأعمال السابقة، وأين يقع هذا

  • FLIRT / FunctionID / Lumina: تواقيع بايتات. دقيقة، سريعة، تنكسر عند إعادة الترجمة.
  • BinDiff / Diaphora: بنية الرسم البياني. جيدة، لكنها هشة عبر التحسين والمعمارية.
  • Ghidra BSim: متجهات سمات المفكك. أقرب في الروح، أحادية المعمارية تقريبًا.
  • Asm2Vec / SAFE / jTrans: تضمينات متعلَّمة. قوية، لكنها تحتاج تدريبًا ولا تُعمّم على معماريات لم يتدرب عليها أحد.
  • التنفيذ المصغّر (Godefroid، 2014) وBlanket Execution (Egele وآخرون، 2014): الجذور الأكاديمية لهذا النهج. لم تُطلق أداة مُصانة تطبّقه.

fnprint هو الخيار بلا تدريب، السلوك أولاً. نموذج الآثار محايد تجاه المعمارية بالفعل، وهو الأساس للمطابقة عبر وحدات المعالجة المركزية.

خارطة الطريق

  • arm64 وmips، بحيث يمكنك أخذ بصمة دالة على x86 وإيجادها في برنامج ثابت لموجّه مجرّد من الرموز. نموذج الآثار محايد تجاه المعمارية بالفعل، وهذا في الغالب سباكة محاكي لكل معمارية.
  • تغطية مسارات أذكى. قلب الفروع الساذج موجود في الكود (explore_depth، معطّل افتراضيًا) لكنه يضيف ضوضاء خاصة بالبناء على مسارات مستحيلة وأضرّ بدقة المطابقة عبر البناء في الاختبار، لذا يحتاج إلى مرشّح اتساق مسارات قبل أن يستحق مكانه.
  • محمّلات pe وmach-o.
  • تصدير rizin/radare2 يُطلق الآن (--format r2)؛ وإضافة ghidra حقيقية هي التالية. يوجد نموذج استيراد jython تجريبي في contrib/ في هذه الأثناء.

الترخيص

MIT. راجع LICENSE.

تنزيل الأداة