
مصدر مفتوح لمواصفات C&C
مسودة: طلب مناقشة
توفر هذه الوثيقة نظرة عامة على الإصدار 1 من مواصفات OST C&C. يُقصد منها تقديم وصف تفصيلي للرسائل والحقول الموجودة داخل تلك الرسائل.
الدافع وراء هذه المواصفات هو توفير بروتوكول مراسلة للتحكم والقيادة (بما في ذلك تكليف المهام، والمخرجات المنظمة، والتوجيه من نظير إلى نظير) يمكن تنفيذه حرفيًا، أو ببساطة أن يكون مصدر إلهام لمطوري المشاريع. ليست هذه الوثيقة مخصصة لوصف ما هو C&C. من المفترض أن القارئ يفهم ما هو وما يُستخدم من أجله.
الكلمات المفتاحية "MUST"، "MUST NOT"، "REQUIRED"، "SHALL"، "SHALL NOT"، "SHOULD"، "SHOULD NOT"، "RECOMMENDED"، "MAY"، و"OPTIONAL" يجب تفسيرها كما هو موضح في [RFC2119].
تفترض هذه المواصفات ما يلي:
فيما يلي قائمة بالمصطلحات المستخدمة في هذه الوثيقة.
البيانات الوصفية للزرع: معلومات يبلغ بها الزرع عن نفسه إلى خادم الفريق.
طلب مهمة: مهمة تُعطى للزرع لتنفيذها.
استجابة مهمة: حالة المهمة ومخرجاتها (إن وجدت) لمهمة معينة.
مفتاح الجلسة: مفتاح تشفير فريد يستخدمه الزرع لتشفير رسائله.
يجب أن تحتوي كل رسالة طلب مهمة واستجابة على الترويسة التالية ذات الـ16 بايت.```text | Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | | -------------------------------------------------------------| | 0 | Type | Code | Flags | Label | | -------------------------------------------------------------| | 1 | Identifier | Length | | -------------------------------------------------------------|
- **Type**: عدد صحيح بطول 1 بايت. «نوع» هذه المهمة. انظر [[أنواع المهام ورموزها](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#task-types-and-codes)].
- **Code**: عدد صحيح بطول 1 بايت. «رمز فرعي» للنوع المحدد. انظر [[أنواع المهام ورموزها](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#task-types-and-codes)].
- **Flags**: عدد صحيح بطول 2 بايت. مجموعة من أعلام bitwise لوصف حالة الرسالة. انظر [[أعلام المهام](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#task-flags)].
- **Label**: عدد صحيح بطول 4 بايت. تسمية فريدة لربط رسائل متعددة متعلقة بنفس المهمة.
- **Identifier**: عدد صحيح بطول 4 بايت. معرّف تسلسلي يُستخدم لبناء الرسائل المجزّأة بالترتيب الصحيح.
- **Length**: عدد صحيح بطول 4 بايت. الطول الإجمالي لبيانات المهمة.
## أنواع المهام ورموزها```text
|------------------|--------------------------|
| Type | Code |
|------------------|--------------------------|
| 0 - NOP | 0 |
|------------------|--------------------------|
| 1 - Exit | 0 |
|------------------|--------------------------|
| 2 - Set | 0 - Sleep/Jitter |
| | 1 - SpawnTo |
| | 2 - BlockDLLs |
| | 3 - PPID |
|------------------|--------------------------|
| 3 - File | 0 - Copy |
| | 1 - Move |
| | 2 - Delete |
| | 3 - Upload |
| | 4 - Download |
|------------------|--------------------------|
| 4 - Directory | 0 - Print |
| | 1 - Change |
| | 2 - Create |
| | 3 - Copy |
| | 4 - Move |
| | 5 - List |
| | 6 - Delete |
|------------------|--------------------------|
| 5 - WhoAmI | 0 |
|------------------|--------------------------|
| 6 - Process | 0 - List |
| | 1 - Kill |
| | 2 - Inject Spawn |
| | 3 - Inject Explicit |
|------------------|--------------------------|
| 7 - Registry | 0 - Query |
| | 1 - Add |
| | 2 - Delete |
|------------------|--------------------------|
| 8 - RPortFwd | 0 - Start |
| | 1 - Data |
|------------------|--------------------------|
| 9 - Environment | 0 - Get |
| | 1 - Set |
|------------------|--------------------------|
| 10 - SOCKS | 0 - Connect |
| | 1 - Data |
| | 2 - Close |
|------------------|--------------------------|
| 11 - Tokens | 0 - List |
| | 1 - Make |
| | 2 - Steal |
| | 3 - Use |
| | 4 - Revert |
| | 5 - Delete |
| | 6 - Purge |
|------------------|--------------------------|
| 12 - Run | 0 |
|------------------|--------------------------|
| 13 - ItemStore | 0 - List |
| | 1 - Add |
| | 2 - Delete |
| | 3 - Purge |
|------------------|--------------------------|
| 14 - LocalExec | 0 - .NET |
| | 1 - BOF |
| | 2 - Managed PowerShell |
| | 3 - Unmanaged PowerShell |
|------------------|--------------------------|
| 15 - PrintScreen | 0 |
|------------------|--------------------------|
| 16 - RemoteExec | 0 - WinRM |
| | 1 - WMI |
| | 2 - PsExec |
| | 3 - SSH |
|------------------|--------------------------|
| 17 - Link | 1 - Link SMB |
| | 2 - Link TCP |
|------------------|--------------------------|
| 18 - Unlink | 0 |
|------------------|--------------------------|
| 19 - P2P | 0 - Acknowledge |
| | 1 - PassThru |
|------------------|--------------------------|
| 20 - Jobs | 0 - List |
| | 1 - Kill |
|---------------------------------------------|
بعض الأعلام متنافية ويجب ألا تُضبط معًا. إذا لم يتم ضبط أي أعلام، يُفترض أن المهمة قد اكتملت بنجاح وأن المخرجات المرتبطة بها (إن وجدت) غير مجزأة.```text
| Value | Description |
|---|---|
| 0 | No flags |
| 1 | Task Error |
| 2 | Task Running (as job) |
| 4 | Message is fragmented, more to follow |
| 8 | Message is fragmented, no more to follow |
## بيانات المهمة
تُلحق بيانات المهمة بالترويسة وتتكون من بنية ثنائية، اعتمادًا على نوع المهمة المحدد ورمزها. يتم تعريف كل نوع من أنواع رسائل طلب المهمة والاستجابة في [[تعريفات الرسائل](https://github.com/rasta-mouse/ost-c2-spec?tab=readme-ov-file#message-definitions)].
ليس من الإلزامي أن يحتوي طلب المهمة أو استجابتها على أي بيانات إذا لم تكن مطلوبة.
## رسالة المهمة المشفّرة
قبل الإرسال، يتم دمج ترويسة المهمة وبيانات المهمة معًا وتشفيرها بخوارزمية AES باستخدام مفتاح جلسة الـ implant.```text
| Byte | 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 |
| ------------------------------------ |
| 0 | Iv |
| 8 | |
| ------------------------------------ |
| 16 | Checksum |
| 24 | |
| 32 | |
| 40 | |
| ------------------------------------ |
| 48 | Data |
| .. | |
| ------------------------------------ |
يجب على الزرعة تسجيل نفسها لدى خادم الفريق قبل أن تتمكن من استلام أو إرسال أي بيانات مهام.
تنشئ الزرعة رسالة [IMPLANT-METADATA]، وتشفّرها باستخدام مفتاح RSA العام لخادم الفريق، ثم ترسلها إلى خادم الفريق.
يستخدم خادم الفريق مفتاح RSA الخاص به لفك تشفير رسالة [IMPLANT-METADATA] الخاصة بالزرعة، ويجب عليه تسجيلها كجلسة/استدعاء جديدة.
يجب على الزرعة أن "تسجّل وصولها" لدى خادم الفريق لتلقي أي بيانات مهام معلقة خاصة بها أو بزروعها الفرعية.
طريقة تسجيل الوصول خاصة بقناة C2 وغير مشمولة في هذه المواصفات. يجوز للزرعة المسجّلة إرسال معرّفها فقط لتسجيل الوصول. ومع ذلك، إذا غيّرت الزرعة منذ ذلك الحين مفتاح الجلسة أو إعدادات السكون (sleep) أو التشتت (jitter)، فيجب عليها أيضًا إعادة إرسال بياناتها الوصفية.
إذا لم تكن هناك مهام معلقة، يجوز لخادم الفريق الرد بدون بيانات، أو ببيانات وهمية في شكل رسالة [NOP] أو أكثر. وبخلاف ذلك، يجب عليه الرد بمجموعة من طلبات المهام المشفّرة باستخدام AES بمفتاح جلسة الزرعة.
يجب على الزرعة الفرعية كتابة بياناتها الوصفية إلى قناة P2P (مثل named pipe أو مقبس TCP) بمجرد إنشاء اتصال مع أصل جديد.
يجب على الأصل قراءة هذه البيانات الوصفية وإرسالها مرة أخرى إلى خادم الفريق في رسالة [LINK-REP].
يجب على خادم الفريق فك تشفير البيانات الوصفية للزرعة الفرعية وتسجيلها كجلسة/استدعاء جديدة، أو تحديث علاقات الأصل-الفرع الحالية في حالة فك الارتباط والربط (unlink & link).
يجب على خادم الفريق إرسال رسالة [LINK-ACK] إلى الأصل الجديد لتأكيد معرّف الفرع. وينبغي للأصل استخدام حقل Label في الرسالة لربط هذه العملية.
تُغلَّف مهام الزروع الفرعية في رسالة [LINK-PASS-THRU] أو أكثر. ستُشفَّر هذه الرسائل بمفتاح جلسة الأصل. عند الاستلام، يجب على الأصل فك تشفير الرسالة وإعادة توجيه البيانات المغلفة إلى الزرعة الفرعية المشار إليها بحقل child-id.
قد تكون البيانات المغلفة هي المهمة نفسها أو رسالة LINK-PASS-THRU أخرى إذا كان الفرع على مستوى آخر أسفل السلسلة.
تُرسل جميع حقول Timestamp كأعداد صحيحة موقعة بطول 64 بت (Int64) تمثل حقبة UNIX (عدد الثواني المنقضية منذ 1 يناير 1970).
لا تميز بعض اللغات بين القيمة المحذوفة والقيمة المرسلة التي تساوي صفرًا. لضمان الاتساق، يجب على التطبيقات إضافة بايت 1 أو 0 (أي TRUE أو FALSE) قبل الحقول الاختيارية للإشارة إلى ما إذا كانت القيمة موجودة أم لا.
ليس من الممكن دائمًا معرفة متى ينتهي حقل ويبدأ آخر عند قراءة البيانات من تيار ثنائي. تفرض هذه المواصفات استخدام بادئة قيمة طول لهذه الحقول، حتى تعرف التطبيقات عدد البايتات أو العناصر التي يحتويها الحقل. يجب أن تُسبَق أنواع البيانات التالية بقيمة طول:
يجوز للتطبيقات تضمين أنواع رسائل وأكواد تحكم وأعلام غير معرّفة في هذه المواصفات، وفقًا لتصميمها ووظائفها الفريدة. ومع ذلك، يُنصح باستخدام قيم في الطرف الأعلى من المجموعة غير المحجوزة لتقليل احتمال تخصيصها في مراجعة مستقبلية. يجب ألا تستخدم التطبيقات نوعًا أو كودًا أو علمًا معرّفًا لأي غرض آخر غير الغرض المقصود منه.
ينبغي للتطبيقات معالجة استلام رسالة تحتوي على حقول أو أعلام لا تعرفها بشكل سلس، وإرجاع رسالة خطأ مناسبة.
IMPLANT-METADATA { id [1] UInt32 session-key [2] SEQUENCE of Byte (32) sleep [3] UInt32 OPTIONAL jitter [4] UInt32 OPTIONAL username [5] String OPTIONAL host-id [6] String OPTIONAL hostname [7] String OPTIONAL domain [8] String OPTIONAL ipv4-ips [9] SEQUENCE of IPV4-ADDRESS OPTIONAL ipv6-ips [10] SEQUENCE of IPV6-ADDRESS OPTIONAL process-name [11] String OPTIONAL process-id [12] UInt32 OPTIONAL architecture [13] [Architecture] OPTIONAL platform [14] [Platform] OPTIONAL os-description [15] String OPTIONAL integrity [16] [Integrity] OPTIONAL }
### IPV4-ADDRESS```text
IPV4-ADDRESS {
address [1] SEQUENCE of Byte (4)
}
IPV6-ADDRESS { address [1] SEQUENCE of Byte (16) }
يجب نقل عناوين IP بترتيب بايت الشبكة.
### المنصة```text
Platform {
Linux = 0,
MacOS = 1,
Windows = 2
}
TASK-ERROR { error-code [1] UInt32 message [2] String OPTIONAL }
## تعريفات NOP
### NOP```text
NOP {
padding [1] SEQUENCE of Byte OPTIONAL
}
SET-SLEEP-REQ { interval [1] UInt32 jitter [2] Byte OPTIONAL }
### SET-SPAWNTO-REQ```text
SET-SPAWNTO-REQ {
spawnto [1] String OPTIONAL
}
إذا لم يتم تعيين حقل spawnto، يجب أن تعود الحمولة (implant) إلى تكوينها الافتراضي.
SET-BLOCKDLLS-REQ { blockdlls [1] Boolean OPTIONAL }
إذا لم يتم تعيين حقل `blockdlls`، فينبغي أن يعود البرنامج المدمج إلى تكوينه الافتراضي.
### SET-PPID-REQ```text
SET-PPID-REQ {
ppid [1] UInt32 OPTIONAL
}
إذا لم يتم تعيين حقل ppid، فيجب أن تعود الزرعة إلى تكوينها الافتراضي.
FILE-COPY-REQ { source [1] String destination [2] String force [3] Boolean OPTIONAL }
### FILE-MOVE-REQ```text
FILE-MOVE-REQ {
source [1] String
destination [2] String
}
FILE-DELETE-REQ { path [1] String }
### FILE-UPLOAD-REQ```text
FILE-UPLOAD-REQ {
destination [1] String
content [2] SEQUENCE of Byte
}
FILE-DOWNLOAD-REQ { path [1] String }
### FILE-DOWNLOAD-REP```text
FILE-DOWNLOAD-REP {
current-chuck [1] UInt16
total-chunks [2] UInt16
chunk-content [3] SEQUENCE of Byte
}
DIR-PRINT-REP { path [1] String }
### DIR-CHANGE-REQ```text
DIR-CHANGE-REQ {
path [1] String OPTIONAL
}
إذا كان حقل path غير معيّن، ينبغي للـ implant تغيير دليل العمل الخاص به إلى موقع 'افتراضي' (مثل دليل المستخدم الرئيسي).
DIR-CREATE-REQ { path [1] String }
### DIR-CREATE-REP```text
DIR-CREATE-REP {
entry [1] [FileSystemEntry]
}
DIR-COPY-REQ { source [1] String destination [2] String }
### DIR-MOVE-REQ```text
DIR-MOVE-REQ {
source [1] String
destination [2] String
}
DIR-LIST-REQ { path [1] String OPTIONAL access-control [2] Boolean OPTIONAL }
إذا كان حقل `path` *غير* معيّن، فينبغي على ال implant أن يعرض دليل العمل الحالي الخاص به.
### DIR-LIST-REP```text
DIR-LIST-REP {
entries [1] SEQUENCE of [FileSystemEntry]
}
DIR-DELETE-REQ { path [1] String recurse [2] Boolean OPTIONAL }
### FileSystemEntry```text
FileSystemEntry {
path [1] String
length [2] UInt32 OPTIONAL
attributes [3] [FileAttributes] OPTIONAL
owner [4] String OPTIONAL
created [5] Timestamp OPTIONAL
last-accessed [6] Timestamp OPTIONAL
last-written [7] Timestamp OPTIONAL
access-control [8] SEQUENCE of [FileSecurity] OPTIONAL
}
أعلام على مستوى البت.```text FileAttributes { Normal = 1, Archive = 2, Compressed = 4, ReadOnly = 8, Hidden = 16, Directory = 32, System = 64 }
### FileSecurity```text
FileSecurity {
identity [1] String
access-mask [2] Int32
inheritance [3] [Inheritance] OPTIONAL
propagation [4] [Propagation] OPTIONAL
}
أعلام بتية.```text Inheritance { None = 0, ContainerInherit = 1, ObjectInherit = 2, }
### الانتشار
أعلام بت.```text
Propagation {
None = 0,
NoPropagateInherit = 1,
InheritOnly = 2,
}
WHOAMI-REP { primary [1] String impersonation [2] String OPTIONAL }
## تعريفات العمليات
### PROC-LIST-REP```text
PROC-LIST-REP {
processes [1] SEQUENCE of [ProcessEntry]
}
PROC-KILL-REQ { process-id [1] UInt32 force [2] Boolean OPTIONAL }
### PROC-INJ-REQ```text
PROC-INJ-REQ {
shellcode [1] SEQUENCE of Byte
capability [2] SEQUENCE of Byte
process-id [3] UInt32 OPTIONAL
}
ProcessEntry { process-name [1] String process-id [2] UInt32 parent-process-id [3] UInt32 OPTIONAL session-id [4] Byte OPTIONAL owner [5] String OPTIONAL architecture [6] [Architecture] OPTIONAL integrity [7] [Integrity] OPTIONAL }
### البنية```text
Architecture {
X86 = 0, // 32-bit Intel
X64 = 1, // 64-bit Intel
Arm = 2, // 32-bit ARM
Arm64 = 3, // 64-bit ARM
Wasm = 4 // WebAssembly
}
Integrity { Untrusted = 0, Low = 1, Medium = 2, // user High = 3, // sudoers System = 4 // root }
## تعريفات السجل
### REG-QUERY-REQ```text
REG-QUERY-REQ {
hive [1] [RegistryHive]
key [2] String OPTIONAL
value [3] String OPTIONAL
access-control [4] Boolean OPTIONAL
}
REG-QUERY-REP { values [1] SEQUENCE of [RegistryValue] keys [2] SEQUENCE of [RegistryKey] }
### REG-ADD-REQ```text
REG-ADD-REQ {
hive [1] [RegistryHive]
key [2] String
name [3] String OPTIONAL
kind [4] [RegistryValueKind] OPTIONAL
value [5] SEQUENCE of Byte OPTIONAL
}
REG-DELETE-REQ { hive [1] [RegistryHive] key [2] String }
### RegistryHive```text
RegistryHive {
ClassesRoot = 0,
CurrentUser = 1,
LocalMachine = 2,
Users = 3,
CurrentConfig = 4
}
RegistryKey { name [1] String access-control [2] [RegistrySecurity] OPTIONAL }
### RegistryValue```text
RegistryValue {
name [1] String
type [2] [RegistryValueKind]
data [3] SEQUENCE of Byte
access-control [4] SEQUENCE of [RegistrySecurity] OPTIONAL
}
RegistryValueKind { None = 0, // REG_NONE String = 1, // REG_SZ ExpandString = 2, // REG_EXPAND_SZ Binary = 3, // REG_BINARY DWord = 4, // REG_DWORD MultiString = 5, // REG_MULTI_SZ Qword = 6 // REG_QWORD }
### RegistrySecurity```text
RegistrySecurity {
identity [1] String
access-mask [2] Int32
inheritance [3] [Inheritance] OPTIONAL
propagation [4] [Propagation] OPTIONAL
}
RPORTFWD-START { bind-port [1] UInt16 localhost-only [2] Boolean OPTIONAL forward-host [3] String forward-port [4] UInt16 }
### RPORTFWD-DATA```text
RPORTFWD-DATA {
data [1] SEQUENCE of Byte
}
ENV-GET-REQ { key [1] String }
### ENV-GET-REP```text
ENV-GET-REP {
value [1] String
}
ENV-SET-REQ { key [1] String value [2] String }
## تعريفات SOCKS
### SOCKS-CONNECT-REQ```text
SOCKS-CONNECT-REQ {
id [1] UInt32
target [2] SEQUENCE of Byte (4)
port [3] UInt16
}
SOCKS-DATA { id [1] UInt32 data [2] SEQUENCE of Byte }
### SOCKS-CLOSE-REQ```text
SOCKS-CLOSE-REQ {
id [1] UInt32
}
## Token Definitions
### TOKEN-LIST-REP
```text
TOKEN-LIST-REP {
tokens [1] SEQUENCE of [TokenEntry]
}```
### TOKEN-CREATE-REQ
```text
TOKEN-CREATE-REQ {
username [1] String
domain [2] String OPTIONAL
password [3] String OPTIONAL
}```
### TOKEN-STEAL-REQ
```text
TOKEN-STEAL-REQ {
process-id [1] UInt32
access-mask [2] UInt32 OPTIONAL
}```
### TOKEN-USE-REQ
```text
TOKEN-USE-REQ {
index [1] Byte
}```
### TOKEN-DELETE-REQ
```text
TOKEN-DELETE-REQ {
index [1] Byte
}```
### TokenEntry
```text
Token {
index [1] Byte
username [2] String
handle [3] String OPTIONAL
process-id [4] UInt32 OPTIONAL
}```
## Implant Store Definitions
### STORE-LIST-REP
```text
STORE-LIST-REP {
items [1] SEQUENCE of [StoreItem]
}```
### STORE-ADD-ITEM Definition
```text
STORE-ADD-ITEM-REQ {
item [1] SEQUENCE OF Byte
name [2] String
type [3] [StoreItemType]
}```
### STORE-DELETE-ITEM Definition
```text
STORE-DELETE-ITEM-REQ {
index [1] Byte
}```
### StoreItem
```text
StoreItem {
index [1] Byte
name [2] String
type [3] [StoreItemType]
}```
### StoreItemType
```text
StoreItemType {
Assembly = 0,
BOF = 1,
Script = 2,
Generic = 3
}```
## Local Execution Definitions
### RUN-REQ
```text
RUN-REQ {
program [1] String
arguments [2] String OPTIONAL
token [3] Byte OPTIONAL
}```
### RUN-REP
```text
RUN-REP {
output [1] String
}```
### EXEC-ASM-REQ
Either store-index or assembly MUST be provided.
```text
EXEC-ASM-REQ {
store-index [1] Byte OPTIONAL
assembly [2] SEQUENCE of Byte OPTIONAL
arguments [3] SEQUENCE of String OPTIONAL
bypass-amsi [4] Boolean OPTIONAL
bypass-etw [5] Boolean OPTIONAL
}```
### EXEC-ASM-REP
```text
EXEC-ASM-REP {
output [1] String
}```
### EXEC-BOF-REQ
Either store-index or bof MUST be provided.
```text
EXEC-BOF-REQ {
store-index [1] Byte OPTIONAL
bof [2] SEQUENCE of Byte OPTIONAL
arguments [3] SEQUENCE of Byte OPTIONAL
bypass-amsi [4] Boolean OPTIONAL
bypass-etw [5] Boolean OPTIONAL
}```
### EXEC-BOF-REP
```text
EXEC-BOF-REP {
output [1] String
}```
### EXEC-POSH-REQ
Either store-index or script MUST be provided.
```text
EXEC-POSH-REQ { cmdlet [1] String store-index [2] Byte OPTIONAL script [3] SEQUENCE of Byte OPTIONAL bypass-amsi [3] Boolean OPTIONAL bypass-etw [4] Boolean OPTIONAL }
### EXEC-POSH-REP
```text
EXEC-POSH-REP {
output [1] String
}```
## Screenshot Definitions
### SCRNSHOT-REP
```text
SCRNSHOT-REP {
data [1] SEQUENCE of Byte
}```
## Remote Execution Definitions
### WINRM-REQ
```text
```
WINRM-REQ {
target [1] String
program [2] String
arguments [3] String OPTIONAL
}
WMI-REQ {
target [1] String
program [2] String
arguments [3] String OPTIONAL
}```
### PSEXEC-REQ
```text
PSEXEC-REQ {
target [1] String
service-name [2] String
service-description [3] String OPTIONAL
bin-path [4] String
}```
## Peer-to-Peer Definitions
### LINK-SMB-REQ
```text
LINK-SMB-REQ { target [1] String pipename [2] String }
### LINK-TCP-REQ
```text
LINK-TCP-REQ {
target [1] String
port [2] UInt32
}```
### LINK-REP
```text
LINK-SMB-REP {
child-metadata [1] SEQUENCE of Byte
}```
### LINK-ACK
```text
LINK-ACK {
child-id [1] UInt32
}```
### LINK-PASS-THRU
```text
LINK-PASS-THRU {
child-id [1] UInt32
message [2] SEQUENCE of Byte
}```
## JOB Definitions
### JOB-LIST-REP
```text
jobs [1] Sequence of [JobEntry]```
### JOB-KILL-REQ
```text
index [1] UInt32```
### JobEntry
```text
index [1] UInt32
type [2] Byte
code [3] Byte```