REx@Skill - مهارة تنفيذ الهندسة العكسية الوكيلية لاكتشاف الثغرات في الملفات الثنائية
Ghidra · radare2 · rizin · qemu-user · angr · z3 · AFL++ · valgrind · capa · Unicorn · Triton · Frida · semgrep · clang · Python · Nix
جميعها مثبَّتة، جميعها قابلة لإعادة الإنتاج
1 · Claude Code — تخطَّ هذه الخطوة إذا كان لديك بالفعل.```bash curl -fsSL https://claude.ai/install.sh | bash
**2 · REx@Skill** — مهارة واحدة، 12 مرجعًا، **7 وكلاء فرعيين**، **33 برنامجًا نصيًا**.```bash
curl -fsSL https://raw.githubusercontent.com/tihanyin/REx-skill/main/install.sh | sh
3 · تحليل ملف ثنائي.```bash claude
/re-analyze path/to/binary # one target /re-analyze path/to/directory/ # a whole corpus, evidence gathered in parallel
<div align="center">
<sub><code>install.sh</code> يكتب فقط إلى <code>~/.claude/</code> — المهارة وسكربتات خط الأنابيب الـ 33 الخاصة بها، والوكلاء الـ 7، و<code>/re-analyze</code>.<br>لا يقوم أبدًا بتثبيت Claude Code نيابةً عنك؛ بل يُنشئ نسخة احتياطية من أي شيء قد يستبدله، و<code>--uninstall</code> يزيله بشكل نظيف.</sub>
</div>
<br>
<details>
<summary><b>تفضّل الاستنساخ؟</b> · <i>أو التثبيت في مكان آخر، أو إزالته</i></summary>```bash
git clone https://github.com/tihanyin/REx-skill && cd REx-skill
./install.sh # into ~/.claude
./install.sh --prefix ~/.config/claude # somewhere else
./install.sh --uninstall # take it back out
![]()
Ghidra · radare2 · rizin · qemu-user · angr · z3 · AFL++ · valgrind · capa
![]()
Unicorn · Triton · Frida · semgrep · clang · Python · Nix · Linux · Claude
REx@Skill يستخدم أدوات متطورة جمعها خبراء الهندسة العكسية. كل أداة موجودة في المجموعة لأنها تستحق مكانها بناءً على معايير معروفة وتحديات تحليل ثنائيات حقيقية — وليس لأن تثبيتها كان مريحًا. لا شيء هنا معاد تنفيذه؛ مهمة المهارة نفسها هي معرفة الأداة التي تجيب على السؤال المطروح أمامها، وما قيمة إجابتها.
| الأداة | ما تفعله |
|---|---|
| Ghidra | تحوّل ثنائيًا مُجمَّعًا مرة أخرى إلى لغة C قابلة للقراءة |
| radare2 / rizin | مفكك تجميع ثانٍ، يُستخدم للتحقق المتقاطع من الأول |
| qemu-user | يشغّل ثنائيات ARM وMIPS وPowerPC وRISC-V على جهاز x86 عادي |
| z3 | حلّال رياضيات — يثبت ما إذا كان يمكن لمؤشر أن يخرج من مخزنه، أو لمقسوم عليه أن يكون صفرًا |
| angr | يحدد المدخل الذي سيصل إلى سطر معين من الكود |
| AFL++ | يرمي ملايين المدخلات المولّدة على البرنامج ليتسبب في انهياره |
| valgrind | يلتقط أخطاء الذاكرة التي لا تسبب خطأً مرئيًا بخلاف ذلك |
| libdislocator | يجعل قراءة بايت واحد بعد المخزن تؤدي إلى انهيار فوري |
| capa | يسرد ما يمكن للثنائي فعله: التشفير، فتح المنافذ، الحقن في العمليات |
| floss | يجد النصوص المخفية التي تفوتها strings العادية |
| Unicorn | يشغّل دالة واحدة على مدخلات تختارها، دون تشغيل البرنامج |
| Triton | يتتبع أين تنتقل البيانات التي يتحكم بها المهاجم أثناء التشغيل |
| Frida | يراقب برنامجًا ويغيّره أثناء تشغيله |
| semgrep / cppcheck | يفحصان لغة C المفككة بحثًا عن أنماط سيئة معروفة |
| pwntools | مكتبة مساعدة للإزاحات وتحليل ELF وأعمال الاستغلال |
هذه هي الإصدارات الدقيقة التي بُني وقيس بها:
Ghidra 12.1.2 · radare2 6.2.0 · rizin 0.9.1 · qemu-user 11.1.0 + 9 cross-sysroots · angr 9.2.154 · z3 4.16.0 · AFL++ 5.00c · valgrind 3.27.1 · capa 9.4.0 · Unicorn 2.1.4 · Triton 3.7.0 · Frida 17.17.0 · clang 21.1.8 · semgrep 1.172.0 · floss 3.1.1 · yara 4.5.7 · binwalk 3.1.0 · pwntools 4.15.0 · cppcheck 2.21.1
كل واحدة منها اختيارية. يبلّغ scripts/capabilities.sh عمّا تملكه هذه الآلة،
ويسمّي كل سكربت الأداة التي لا يجدها، وتؤدي الأداة المفقودة إلى تضييق التحليل
إلى limitations بدلًا من الفشل بصمت.
ثلاثة أوامر وكل أداة أعلاه على PATH الخاص بك، بهذه الإصدارات بالضبط —
لا شيء للبحث عنه، ولا شيء متروك نصف مُهيّأ.```bash
git clone https://github.com/tihanyin/REx-skill 2>/dev/null || git -C REx-skill pull
cd REx-skill
curl --proto '=https' --tlsv1.2 -sSf -L https://install.determinate.systems/nix | sh -s -- install --no-confirm
nix develop ./devshell
scripts/capabilities.sh
| | |
|---|---|
| **0** | يستنسخ المستودع، أو يحدّثه إذا كان لديك واحد بالفعل — مثبّت المهارة ذو السطر الواحد أعلاه **لا** يترك نسخة مستنسخة خلفه، فهو يعمل من نسخة مؤقتة ثم يحذفها، لذا تحتاج سلسلة الأدوات والسكربتات إلى نسخة خاصة بهما |
| **1** | يثبّت Nix، مدير الحزم الذي يقوم بالتثبيت — ثم **افتح طرفية جديدة**. *هل لديك Nix بالفعل؟ تخطَّ هذه الخطوة.* إعادة تشغيل المثبّت فوق تثبيت موجود تفشل مع `Found existing plan in /nix/receipt.json`، وهو رفضه للمس ما لديك بالفعل، وليس خطأً يحتاج إلى إصلاح |
| **2** | يدخل إلى الصدفة، من جذر المستودع حتى يبقى `scripts/` في متناول اليد. المرة الأولى تنزّل الكثير؛ وكل مرة بعدها تستغرق ثوانٍ |
| **3** | يؤكّده: `ghidra pyghidra r2 rizin`، `qemu-user architectures: 7`، `angr`، `z3`، `afl` — بدلاً من أسطر `MISS` التي يعطيها جهاز مجرّد |
`exit` يعيد `PATH` الخاص بك تماماً كما كان. *تم الاختبار على Ubuntu 22.04.5 LTS
(x86-64)، Determinate Nix 3.22.4.*
<details>
<summary><b>لماذا تثبيت سلسلة الأدوات أصلاً؟</b></summary>
- **تشغيلات قابلة للمقارنة.** مخرجات المفكّك *هي* مدخلات المحلّل. شخصان
على إصدارين مختلفين من Ghidra لا يجريان التجربة نفسها، ولا يستطيع أيٌّ منهما
التحقق من نتيجة الآخر.
- **لا شيء مثبّت على جهازك.** يحتفظ Nix بكل حزمة تحت تجزئة (hash) لما بنَاها،
لذا فإن دخول الصدفة يغيّر `PATH` ولا شيء غيره. اخرج من الصدفة وسيعود نظامك
تماماً كما كان.
- **لا يزال يعمل بعد خمس سنوات.** ثلاث مراجعات مثبّتة تعيد بناء سلسلة الأدوات
بالكامل، وهذا ما يجعل رقماً منشوراً قابلاً لإعادة التحقق لاحقاً.
ثلاث مراجعات تعيد بناء سلسلة الأدوات بالكامل، على أي جهاز، وفي أي وقت في
المستقبل:```
nixpkgs ffb3c9b700e759be2ef13237c9d8f953b32a1e46
nixpkgs-angr ac62194c3917d5f474c1a844b6fd6da2db95077d
capa-rules v9.4.0
devshell/flake.lock هو المرجع؛ devshell/DEVSHELL.md
يسرد كل أداة مع إصدارها والغرض منها.
REx@Skill هي طريقة لتحديد ما إذا كان الملف الثنائي يحتوي على عيب — وإثبات ذلك. سبعة وكلاء فرعيين ينفذونها، متشاركين دليل أدلة واحد.
وكيل واحد يحوّل الملف الثنائي إلى أدلة: كود C مفكوك، تفكيك، سلاسل نصية، خريطة لأي كود يصل إلى أي شيء، وما يحدث عند تشغيله فعليًا. ثم يقرأ خمسة وكلاء تلك الأدلة في الوقت نفسه، كل واحد يطارد نوعًا مختلفًا من العيوب، ولا يمكن لأي منهم رؤية ما وجده الآخرون — خمسة قراء يتشاركون مفككًا واحدًا يرتكبون الأخطاء نفسها، لذا فإن إبقاءهم منفصلين يمنح خمس قراءات مستقلة بدلًا من رأي واحد مكرر خمس مرات. ويقرأ السابع الكود أولًا، ثم نتائجهم، ويقرر أيها يصمد.
لا يُبلَّغ عن شيء كخطأ برمجي إلا إذا تم تسمية أربعة أشياء وتحديد موقعها في الملف الثنائي: أين تدخل البيانات التي يتحكم بها المهاجم (المصدر)، والعملية التي يمكن أن يكسرها (المصب)، والفحص الذي كان ينبغي أن يوقفه (الحارس المعطوب)، ومن يتضرر (الجهة المتأثرة). إذا فاتك واحد منها، يخرج كخيط غير مُثبت، وليس كاكتشاف.
كل تشغيل يقدّم الأشياء الثلاثة نفسها: الاكتشافات، وما تم استبعاده ولماذا، وما تعذّر تشغيله على المضيف.
تم اختبار مجموعة المهارات عبر عشر معماريات — x86-64، وi686، وARM، وAArch64، وMIPS وMIPS64 بترتيبي البايتات، وPowerPC 32-بت، وRISC-V، وApple arm64 — على ELF وPE وMach-O، والبرامج الثابتة والكتل الخام. لا شيء يحدّها عند هذا الحد: أي معمارية يستطيع مفككك رفعها هي ضمن النطاق.
| الوكيل | يعمل | في سطر واحد | |
|---|---|---|---|
| 01 | re-recon | أولًا، بمفرده | يستخرج الأدلة. لا يطارد الأخطاء — اكتشاف واثق هنا هو نمط الفشل. |
| 02 | re-bughunt | دائمًا | يبني أقوى حجة صادقة على وجود عيب. يعدّد كل مصب. |
| 03 | re-safety | دائمًا | يحاول إثبات سلامته، ويبلّغ عن كل التزام لا يستطيع الوفاء به. |
| 04 | re-arithmetic | إذا كان يفهرس أو يحدد أحجامًا | الحجم والفهرس والعرض والإشارة عبر حدود الاستدعاء — يُنجَز بواسطة محلّل، لا في رأس أحدهم. |
| 05 | re-lifecycle | إذا كان يخصص | التخصيص، والتحرير، والملكية، والتهيئة، ومسارات الأخطاء. مسار الخطأ هو الذي لم يختبره أحد. |
| 06 | re-logic | إذا كان يصادق | التخويل، وآلات الحالة، والتشفير، والتحقق هنا والاستخدام هناك. لا توقيع للبحث عنه. |
| 07 | re-reconcile | أخيرًا، بمفرده | يقرأ الكود قبل أن يقرأ استنتاجات أي أحد، ثم يحكم ويبلّغ. |
دليل واحد لكل ملف ثنائي، مسمّى <filename>-<first 8 hex of its SHA-256>:```
results/
├── index.json every sha256 analysed -> its directory
└── httpd-4f2a9c1e/ <- "httpd", sha256 4f2a9c1e...
├── decomp/ decompiled C ├── reach/ source -> sink paths
├── disasm/ disassembly, real VAs ├── bounds/ arithmetic to discharge
├── meta/ function map + base ├── sanitize/ hostile-allocator runs
├── strings/ inventory, by family ├── fuzz/ coverage-guided search
├── dynamic/ crafted-input battery ├── quarantine/ text aimed at YOU
└── notes/ the threat model └── pipeline.json what ran, what did not
**لماذا التجزئة في الاسم.** نسختان مبنيتان من برنامج تشتركان في اسم الملف لكن ليس في
SHA-256، لذا لا يمكن للدليل والملف الثنائي أن ينفصلا بصمت: أعد ترجمة الهدف وستحصل
على دليل جديد بدلاً من دليل ملوّث.
يقوم `pipeline_status.py` بتدقيق تلك الشجرة ويبلّغ عن المراحل التي لم تُنفَّذ قط — لأن
المرحلة التي لم تُنفَّذ لا تترك خلفها خطأً، بل دليلاً غائباً فقط، وهو ما يُقرأ تماماً
كما لو أنه "نُفِّذ، ولم يجد شيئاً".
</details>
---
## 4. جرد الأدوات — أي سكربت يستدعي ماذا
#### فك الترجمة والقراءة
| الأداة | الإصدار | تُستخدم بواسطة | لأجل |
|---|---|---|---|
| **Ghidra** | 12.1.2 | `ghidra_export.py` `batch_decompile.sh` `decompile_addr.py` | المفكِّك — الأداة الأساسية |
| **pyghidra** | 3.1.0 | الثلاثة نفسها | تشغيله بلا واجهة |
| radare2 | 6.2.0 | `run_tools.sh` `strings_report.py` `brief.py` | مخرجات JSON من كل أمر |
| rizin | 0.9.1 | `capabilities.sh` `preflight.sh` | مفكِّك **ثانٍ** — للتحقق المتقاطع |
| binutils | 2.46 | `triage.py` `inventory.py` `run_tools.sh` | readelf، objdump، nm، strings، size |
| file | 5.48 | كل نقطة دخول | الأمر الأول، في كل مرة |
#### الفرز — ما هو، وما يمكنه فعله
| الأداة | الإصدار | تُستخدم بواسطة | لأجل |
|---|---|---|---|
| **capa** | 9.4.0 | `run_tools.sh` `brief.py` | القدرات من القواعد، مع العناوين |
| **floss** | 3.1.1 | `strings_report.py` | السلاسل النصية التي لا يراها `strings` |
| yara | 4.5.7 | `run_tools.sh` `analyze.sh` | المُحزِّمات، ثوابت التشفير، إصدارات المكتبات |
| detect-it-easy | 3.21 | `run_tools.sh` | تحديد المُحزِّم والمترجم |
| checksec | pwntools | `triage.py` `brief.py` | NX / RELRO / canary / PIE |
#### التنفيذ — أكبر رافعة منفردة
| الأداة | الإصدار | تُستخدم بواسطة | لأجل |
|---|---|---|---|
| **qemu-user** | 11.1.0 | `dynamic_probe.py` `quick_dynamic.sh` | تشغيل ملفات ثنائية بمعمارية أجنبية |
| **9 cross-sysroots** | glibc | `setup_sysroots.sh` | بدونها لا يستطيع qemu حتى تحميل ملف ثنائي ديناميكي أجنبي |
| gdb / ltrace / strace | 17.2 | `capabilities.sh` يبلّغ عنها | التتبعات؛ `ltrace` هي الأداة الأكثر إهمالاً هنا |
> في مقارنة مقيسة واحدة، سجّل النموذج نفسه نحو **3× من الاستدعاء** مع توفر
> التنفيذ مقارنةً بغيابه. هذا الصف هو سبب شحن الـ sysroots مع الـ flake.
#### اجعل الأخطاء الصامتة صاخبة
| الأداة | الإصدار | تُستخدم بواسطة | لأجل |
|---|---|---|---|
| **valgrind** | 3.27.1 | `sanitize_run.sh` | أقرب شيء إلى ASan لملف ثنائي لا يمكنك إعادة بنائه |
| **AFL++** | 5.00c | `fuzz_target.sh` `quick_dynamic.sh` | التشويش الموجَّه بالتغطية، وضع QEMU |
| libdislocator | مع AFL++ | `sanitize_run.sh` `quick_dynamic.sh` | صفحة لكل تخصيص — يحوّل قراءة OOB صامتة إلى خطأ |
| clang | 21.1.8 | `triage.py` | `-fsanitize=...` على الكود المرفوع |
#### الحل والمحاكاة
| الأداة | الإصدار | تُستخدم بواسطة | لأجل |
|---|---|---|---|
| **z3** | 4.16.0 | `check_bound.py` | يُبرئ ادعاء الحدود — 9 أنماط بالإضافة إلى مخرج عام |
| **angr** | 9.2.154 | `symfn.py` | حاضنة رمزية لكل دالة: اختطاف، كتابة OOB، قسمة على صفر |
| **unicorn** | 2.1.4 | `emulate.py` | تشغيل دالة واحدة بمعزل على مدخلات تختارها |
| triton | 3.7.0 | متاحة | التنفيذ الكونكوليكي والتلويث عبر تتبع ملموس |
| pwntools | 4.15.0 | `brief.py` `run_tools.sh` | إزاحات `cyclic()`، تحليل ELF/GOT |
#### التحليل الساكن على C المفكَّكة
| الأداة | الإصدار | تُستخدم بواسطة | لأجل |
|---|---|---|---|
| cppcheck | 2.21.1 | `run_tools.sh` `analyze.sh` | يتحمّل الكود الذي لا يُترجم — ومخرجات المفكِّك لا تُترجم |
| semgrep | 1.172.0 | `run_tools.sh` `analyze.sh` | قواعد أنماط، بلا حاجة للبناء |
| flawfinder | 2.0.20 | `capabilities.sh` | معجمي؛ grep له آراء |
<details>
<summary><b>أيضاً في الصدفة</b> — البرامج الثابتة، الصيغ، قابلية الاستغلال</summary>
`binwalk` 3.1.0 · `unsquashfs` · `sasquatch` · `jefferson` · `ubi_reader` ·
`kaitai-struct-compiler` 0.11 · `tshark` 4.6.8 · `hexyl` · `pev` 0.81 ·
`osslsigncode` · `diffoscope` 328 · `patchelf` 0.15.2 · `ROPgadget` 7.7 ·
`one_gadget` 1.9.0 · `honggfuzz` · `radamsa` 0.7 · `bitwuzla` 0.9.1 · `rr` 5.9.0 ·
`bpftrace` 0.26.0 · `upx` 5.2.0
الجرد الكامل مع كل إصدار: [`devshell/DEVSHELL.md`](https://github.com/tihanyin/rex-skill/blob/main/devshell/DEVSHELL.md)
</details>
---
## 5. استخدمه مع شيء غير Claude
`general-skill/SKILL-RE.md` هو **ملف واحد مكتفٍ بذاته** — 3 750 سطراً من
Markdown عادي مع frontmatter يحتوي `name`/`description`. كل ما تحتويه حزمة Claude،
في قطعة واحدة: نفس معيار الأدلة، نفس خط الأنابيب، نفس القواعد بشأن
تشويش معمارية أجنبية. استنسخ المستودع بحيث يجلس `scripts/` بجانبه، ثم:
| المشغِّل | الكيفية |
|---|---|
| **Codex** | وجّه `AGENTS.md` إليه، أو الصقه كموجّه النظام |
| **opencode** | `{"instructions": ["SKILL-RE.md"]}` في `opencode.json` |
| **Cursor / Windsurf** | أضفه كقاعدة مشروع |
| **حلقة API عادية** | إنه مجرد Markdown — ضعه في المقدمة |
| **إنسان** | يُقرأ ككتاب دراسي؛ كان ذلك هو المقصد |
> **لماذا شكلان؟** حزمة Claude هي نواة بحجم 16 KB بالإضافة إلى اثني عشر ملف مرجعي
> تُحمَّل عند الطلب — سياق صغير حتى يحتاج سؤال محدد إلى فصل محدد. Claude Code وحده
> يتبع تلك المؤشرات، لذا يحصل كل مشغِّل آخر على الملف الواحد بدلاً من ذلك.
---
---
## 6. ما بالداخل```
.
├── claude-skill/ the Claude Code form
│ ├── skills/reverse-engineering/
│ │ ├── SKILL.md 16 KB core, loaded on every trigger
│ │ └── references/ 12 files, pulled in on demand
│ ├── agents/ 7 subagents
│ └── commands/ /re-analyze — orchestrates all three phases
│
├── general-skill/ the portable form
│ ├── SKILL-RE.md the whole methodology, one file, 32 sections
│ └── AGENTS.md points any agent at it
│
├── scripts/ 32 tools — the pipeline and its parts
├── devshell/ flake.nix + flake.lock + DEVSHELL.md
├── images/ logo and figures
└── install.sh one command into ~/.claude
المهارة تعمل في أي مكان يعمل فيه Claude Code — Linux وmacOS وWSL. إنها markdown:
النواة، و12 مرجعاً، و7 وكلاء فرعيين، و/re-analyze. لا شيء فيها مرتبط بمنصة
معينة، والسكربتات هي Python وbash محمولة. ما يتغير هو الأدوات التي تحتها.
بيئة DEVSHELL مبنية ومختبرة على Linux — x86-64 (Ubuntu 22.04.5 LTS) و aarch64. macOS هو حيث تتراجع، لأن إحدى عشرة أداة غير موجودة على Darwin إطلاقاً:
qemu-user يترجم استدعاءات نظام Linux، لذا فهو Linux بحكم التعريف، ومعه
تذهب جذور النظام التسعة متعددة المعماريات.
ما يتبقى على Mac. كل المراحل الساكنة: تفكيك Ghidra، وradare2 وrizin، وangr وz3، والمحللات الساكنة، والفرز، والسلاسل النصية وقابلية الوصول. ما تخسره هو التنفيذ — المسبار الديناميكي، وتشغيلات المُخصّصات، والتشويش، وأي ثنائي بمعمارية أجنبية. هذه خسارة حقيقية: الانهيار هو أقوى دليل تملكه هذه المنهجية، ولا شيء ساكن يعوّض عنه.
لا شيء يتظاهر بغير ذلك. scripts/capabilities.sh يبلّغ عمّا يمكن للمضيف
فعله بالفعل، وscripts/pipeline_status.py يعلّم المرحلة كغائبة، والتكلفة
تقع في limitations في التقرير. المرحلة التي لم تُنفّذ لا يُبلّغ عنها أبداً
كمرحلة نُفّذت ولم تجد شيئاً — انظر §9.1 من المهارة.
باختصار: حلّل على Linux. اقرأ وخطط واكتب التقرير في أي مكان.
Norbert Tihanyi · x.com/@TihanyiNorbert
اكتشاف = مصدر · حوض · حارس مكسور · أصل متأثر.
أي شيء أقل من ذلك هو فرضية.
capabilities.sh | ما يمكن لهذا المضيف فعله بالفعل — تحقق قبل التخطيط |
analyze.sh | خط الأنابيب كاملاً بالترتيب، الخطوات 0-5، ثم يسلّم المهمة |
batch_analyze.sh | نفس خط الأنابيب عبر دليل من الأهداف |
pipeline_status.py | تدقيق شجرة الأدلة: أي المراحل نُفّذت، وما تكلفة كل غياب |
overview.py | شكل البرنامج: الأعداد، شجرة الاستدعاء، الأحواض، المصادر |
brief.py | مخرجات كل أداة لهدف واحد، موحّدة، والثغرات مُسمّاة |
fn.py | اقرأ دالة واحدة بدلاً من كامل التفكيك |
reach.py | مسارات المصدر → الحوض عبر رسم الاستدعاء البياني |
bounds_worklist.py | الادعاءات الحسابية التي تحتاج إثباتاً، في ثلاث طبقات |
check_bound.py | أثبت واحداً باستخدام z3 — 9 أنماط بالإضافة إلى مخرج عام |
symfn.py | حزمة رمزية لدالة واحدة |
emulate.py | شغّل دالة واحدة بمعزل على مدخلات تختارها |
quick_dynamic.sh | شغّله فقط: بدون مدخلات، ثم مدخلات تكسر معظم الأشياء |
fuzz_target.sh | اختبار تشويش موجّه نحو القناة التي يقرأها البرنامج فعلاً |
sanitize_run.sh | مُخصّصات ذاكرة عدائية — اجعل خطأ كومة صامتاً يتحول إلى انهيار |
sanitize.py | اعزل النص الموجّه من النموذج قبل أن يقرأه أي شيء |
| غائبة على macOS | qemu-user · gdb · gef · ltrace · strace · valgrind · AFL++ · honggfuzz · frida · bpftrace · rr |
| أيضاً | بناء capa المثبّت لا يجتاز مجموعة اختباراته الخاصة على Darwin |
| و | اختبار تشويش argv يعترض __libc_start_main، وهو glibc — لا يوجد مكافئ على macOS |