إطار عمل لمحاكاة الخصوم يعتمد على الكتيبات التشغيلية (playbooks) يقوم بتجميع مسارات الهجوم المُعرَّفة بصيغة JSON إلى حمولات شيلكود مستقلة عن الموقع من أجل التحقق من صحة أنظمة الكشف المتقدمة وعوامل التحقيق المعتمدة على الذكاء الاصطناعي.

SynthAPT هو إطار عمل لمحاكاة الخصوم يعتمد على السيناريوهات (playbooks) لتكرار مسارات الهجوم المعقدة. وهو مصمم للتحقق من صحة أنظمة الكشف المتقدمة وعوامل التحقيق القائمة على الذكاء الاصطناعي. الفكرة الأساسية هي أن سلوك البرامج الضارة يمكن التعبير عنه بصيغة JSON وتجميعه إلى برامج ضارة وظيفية، مما يتيح تطوير سيناريوهات واقعية بسرعة باستخدام نماذج اللغة الكبيرة (LLMs).

الزرع الأساسي (implant) هو حمولة من شيلكود (shellcode) يقودها مفسر سيناريو (playbook interpreter). يحدد السيناريو مسار الهجوم بالكامل مسبقًا، ويتبعه الزرع، متنقلًا في البيئة عبر حقن العمليات (process injection)، والحركة الجانبية (lateral movement)، وما إلى ذلك. كل زرع ينشأ كخيط مستقل (thread) مع مجموعة تعليمات خاصة به، لذلك يتم التعبير عن الهجمات متعددة المراحل (مثل الوصول الأولي → رفع الامتيازات → الحركة الجانبية → تسريب البيانات) كرسم بياني من الأزرع المتعاونة، وكلها محددة مسبقًا في السيناريو. هذا يوفر ثلاث مزايا رئيسية:

إذا كنت لا تريد استخدام الإصدار الجاهز (release)، يمكنك التجميع كالتالي:
بناء باستخدام cargo make:```bash
cargo make build
./target/release/synthapt
سيؤدي هذا إلى تجميع shellcode والمحرر.
تشغيل SynthAPT بدون أي أوامر سينقلك إلى المحرر. يمكنك تقديم مفتاح API لـ Claude وعرض التغييرات أثناء كتابة الأوامر النصية.```bash SynthAPT playbook editor and compiler
Usage: synthapt [COMMAND]
Commands: edit Open the TUI editor with a playbook loaded from PATH validate Validate a playbook JSON file and print any errors export-skill Export the agent system prompt as a Claude Code slash command skill compile Compile a playbook to a payload
إذا كنت ترغب في استخدام LLM آخر أو اشتراك، يمكنك تشغيل `synthapt export-skill` واستخدام ذلك مع أي إعداد برمجي لديك.
يجب أن يُخرج playbook بصيغة JSON. قم بتجميعه إلى payload باستخدام الأمر compile:```bash
Compile a playbook to a payload
Usage: synthapt compile [OPTIONS] <PLAYBOOK> [OUTPUT]
Arguments:
<PLAYBOOK> Path to the playbook JSON file
[OUTPUT] Output file path (default: payload.bin / payload.exe / payload.dll)
Options:
-e, --exe Compile to PE EXE
-d, --dll Compile to PE DLL
-b, --base <BASE> Override the embedded base shellcode with a custom binary
-h, --help Print help
يمكن تعريف الثوابت كسلاسل نصية، أو كائنات سداسية عشرية، أو كائنات base64:```json "constants": [ "c:\windows\temp\file.txt", { "hex": "deadbeef" }, { "base64": "SGVsbG8=" } ]
---
### end (0x00)
نهاية مجموعة المهام. يُضاف تلقائيًا بواسطة المترجم - لست بحاجة لإضافته.
---
### store_result (0x01)
تخزين نتيجة العملية الأخيرة في متغير.
| Field | Type | |
|-------|------|-|
| var | u16 | **مطلوب** |```json
{ "op": "store_result", "var": 0 }
أعد وحدات بايت الشيلكود الحالية مع معرف مهمة اختياري و/أو قيمة سحرية مدمجة.
| Field | Type | |
|---|---|---|
| task | u8 | اختياري |
| magic | u32 hex string or number | اختياري |
| { "op": "get_shellcode" } | ||
| { "op": "get_shellcode", "task": 5, "magic": "0x18181818" } |
---
### sleep (0x03)
النوم لعدد معين من المللي ثانية.
| Field | Type | |
|-------|------|-|
| ms | u32 | **مطلوب** |```json
{ "op": "sleep", "ms": 5000 }
تنفيذ أمر عبر cmd.exe.
| Field | Type | |
|---|---|---|
| command | string | مطلوب |
| { "op": "run_command", "command": "whoami /all" } |
---
### get_cwd (0x05)
احصل على دليل العمل الحالي. لا وسائط.```json
{ "op": "get_cwd" }
اقرأ ملفًا وأعد محتواه.
| الحقل | النوع | |
|---|---|---|
| path | string | مطلوب |
| { "op": "read_file", "path": "c:\users\public\data.txt" } | ||
| { "op": "read_file", "path": "%0" } |
---
### write_file (0x07)
كتابة بايتات إلى ملف.
| الحقل | النوع | |
|-------|------|-|
| path | string | **مطلوب** |
| content | bytes | *اختياري* (ملف فارغ إذا تم حذفه) |```json
{ "op": "write_file", "path": "c:\\temp\\out.txt", "content": "hello" }
{ "op": "write_file", "path": "%0", "content": "$1" }
اطبع رمز الحالة لمتغير (0 = نجاح، غير صفري = خطأ).
| حقل | نوع | |
|---|---|---|
| var | u16 | مطلوب |
| { "op": "check_error", "var": 0 } |
---
### شرطي (0x09)
التفرع إلى فهارس مهام مختلفة بناءً على حالة المتغير.
| الحقل | النوع | |
|-------|------|-|
| mode | `"data"` أو `"error"` | **مطلوب** |
| var1 | u16 | **مطلوب** |
| var2 | u16 | *اختياري* (مقارنة متغيرين بدلاً من فحص واحد) |
| true | u16 | **مطلوب** (فهرس المهمة إذا كان الشرط صحيحاً) |
| false | u16 | **مطلوب** (فهرس المهمة إذا كان الشرط خاطئاً) |
`true_target` و `false_target` يتم قبولها كأسماء مستعارة لـ `true` و `false`.
أوضاع المتغير الواحد:
- `"data"` — صحيح إذا كان var1 يحتوي على بيانات غير فارغة
- `"error"` — صحيح إذا كانت حالة var1 تساوي 0 (نجاح)
أوضاع المتغيرين (عند وجود var2):
- `"data"` — صحيح إذا كانت بيانات var1 تساوي بيانات var2
- `"error"` — صحيح إذا كان رمز خطأ var1 يساوي رمز خطأ var2```json
{ "op": "conditional", "mode": "error", "var1": 0, "true": 3, "false": 5 }
{ "op": "conditional", "mode": "data", "var1": 0, "var2": 1, "true": 3, "false": 5 }
تعيين متغير إلى قيمة حرفية.
| الحقل | النوع | |
|---|---|---|
| var | u16 | مطلوب |
| data | bytes | اختياري (فارغ إذا تم حذفه) |
يتم تخزين القيم الحرفية (literal strings) وقيم hex/base64 مع بادئة نتيجة طولها 5 بايت لتظهر كنتائج عمليات عادية عند قراءتها. يتم تمرير مراجع المتغيرات ($n) والثوابت (%n) كما هي.```json
{ "op": "set_var", "var": 0, "data": "hello world" }
{ "op": "set_var", "var": 1, "data": { "hex": "deadbeef" } }
---