
P4wnP1 A.L.O.A. by MaMe82 هو إطار عمل يحول Raspberry Pi Zero W إلى منصة مرنة ومنخفضة التكلفة لاختبار الاختراق، والعمل مع الفرق الحمراء، والهندسة الفيزيائية... أو إلى "A Little Offensive Appliance".
P4wnP1 A.L.O.A. من MaMe82 هو إطار عمل يحول Raspberry Pi Zero W إلى منصة منخفضة التكلفة ومرنة للاختبارات الاختراقية، والفرق الحمراء، والاشتباكات الفيزيائية... أو إلى "جهاز هجومي صغير".
يمكن العثور على أحدث صورة تحت علامة التبويب "Releases".
أسهل طريقة للوصول إلى تثبيت جديد لـ P4wnP1 A.L.O.A. هي استخدام عميل الويب عبر شبكة WiFi المنشأة (مفتاح PSK هو MaMe82-P4wnP1، وعنوان URL هو http://172.24.0.1:8000) أو SSH (كلمة المرور الافتراضية هي toor).
Math لحسابات الفأرة، إلخ.)ليس هناك الكثير لنقوله هنا، P4wnP1 A.L.O.A. مدعوم من KALI Linux، لذا كل شيء يجب أن يكون في متناول يديك (أو يمكن تثبيته باستخدام apt)
لذا إذا كنت ترغب في استخدام ملف دفعي يعمل على مضيف Windows بعيد لتكوين P4wnP1... لا مشكلة:
host إلى أوامر العميلعلى الرغم من أنه لم يكن مخططًا له في البداية، يمكن تكوين P4wnP1 A.L.O.A. باستخدام عميل ويب. على الرغم من أن العميل لم يكن مخططًا له، إلا أنه تطور ليصبح قطعة برمجية جميلة. في الواقع، انتهى به الأمر كأداة التكوين الرئيسية لـ P4wnP1 A.L.O.A. يحتوي عميل الويب على إمكانيات لا يمكن الوصول إليها من CLI (تخزين القوالب، إنشاء "TriggerActions").
الميزات الأساسية:
CTRL+SPACE)لم يعد نهج الأتمتة في إصدار P4wnP1 القديم (البرامج النصية الثابتة bash) قابلاً للاستخدام.
كان على نهج الأتمتة لـ P4wnP1 A.L.O.A. أن يفي بهذه المتطلبات:
مع تقديم ما يسمى بـ "TriggerActions" ودمجها مع نظام القوالب (تخزين الإعدادات المستمر لجميع الأنظمة الفرعية) يمكن تلبية جميع المتطلبات. يمكن العثور على تفاصيل حول TriggerActions في قسم WorkFlow.
P4wnP1 A.L.O.A. لا يستخدم مفاهيم مثل التكوين الثابت أو الحمولات. في الواقع، ليس لديه سير عمل ثابت على الإطلاق.
P4wnP1 A.L.O.A. مصمم ليكون مرنًا قدر الإمكان، للسماح باستخدامه في جميع السيناريوهات الممكنة (بما في ذلك تلك التي لم أتمكن من التفكير فيها أثناء إنشاء P4wnP1 A.L.O.A.).
ولكن هناك بعض المفاهيم الأساسية التي أود المرور عليها في هذا القسم. نظرًا لأنه من الصعب شرح كل شيء دون إنشاء وثائق (فيديو) مناسبة، سأستعرض بعض حالات الاستخدام والأمثلة الشائعة لشرح ما يحتاج إلى شرح.
ومع ذلك، من غير المحتمل أن يكون لدي الوقت لتقديم وثائق كاملة. لذا أشجع الجميع على دعمي بالدروس والأفكار التي يمكن ربطها مرة أخرى في هذا README
الآن لنبدأ بأحد المهام الأساسية:
الحد الأدنى من متطلبات التكوين لتحقيق هذا الهدف هو:
التكوين الافتراضي لـ P4wnP1 (الصورة غير المعدلة) يفي بالفعل بهذه المتطلبات:
MaMe82-P4wnP1172.24.0.1172.16.0.1P4wnP11337172.26.0.1root، كلمة المرور الافتراضية هي toorملاحظة: نشر اتصال HTTPS ليس ضمن نطاق المشروع حاليًا. لذا يرجى وضع ذلك في الاعتبار إذا كنت تتعامل مع بيانات حساسة، مثل بيانات اعتماد WiFi، في عميل الويب. المشروع بأكمله لم يُبنَ مع مراعاة الأمان (ومن غير المرجح أن يصبح ذلك مطلبًا أبدًا). لذا يرجى نشر التدابير المناسبة (على سبيل المثال، تقييد الوصول إلى عميل الويب باستخدام iptables إذا تم تكوين نقطة الوصول بمصادقة مفتوحة؛ لا تترك قابلية اكتشاف Bluetooth والاتصال ممكّنة بدون حماية PIN، إلخ.)
في هذه المرحلة، أفترض:
لتشغيل عميل CLI من جلسة SSH، أصدر الأمر التالي:``` root@kali:~# P4wnP1_cli The CLI client tool could be used to configure P4wnP1 A.L.O.A. from the command line. The tool relies on RPC so it could be used remotely.
Version: v0.1.0-alpha1
Usage: P4wnP1_cli [command]
Available Commands: db Database backup and restore evt Receive P4wnP1 service events help Help about any command hid Use keyboard or mouse functionality led Set or Get LED state of P4wnP1 net Configure Network settings of ethernet interfaces (including USB ethernet if enabled) system system commands template Deploy and list templates trigger Fire a group send action or wait for a group receive trigger usb USB gadget settings wifi Configure WiFi (spawn Access Point or join WiFi networks)
Flags: -h, --help help for P4wnP1_cli --host string The host with the listening P4wnP1 RPC server (default "localhost") --port string The port on which the P4wnP1 RPC server is listening (default "50051")
Use "P4wnP1_cli [command] --help" for more information about a command.
تعرض شاشة المساعدة بالفعل أن عميل CLI يستخدم أوامر مختلفة للتفاعل مع الأنظمة الفرعية المختلفة لـ
P4wnP1 A.L.O.A. معظم هذه الأوامر لها أوامر فرعية خاصة بها أيضًا. يمكن الوصول إلى المساعدة لكل أمر أو أمر فرعي
عن طريق إلحاق `-h` بأمر CLI:```
root@kali:~# P4wnP1_cli hid run -h
Run script provided from standard input, commandline parameter or by path to script file on P4wnP1
Usage:
P4wnP1_cli hid run [flags]
Flags:
-c, --commands string HIDScript commands to run, given as string
-h, --help help for run
-r, --server-path string Load HIDScript from given path on P4wnP1 server
-t, --timeout uint32 Interrupt HIDScript after this timeout (seconds)
Global Flags:
--host string The host with the listening P4wnP1 RPC server (default "localhost")
--port string The port on which the P4wnP1 RPC server is listening (default "50051")
الآن، من أجل كتابة "Hello world" إلى مضيف USB، يمكن استخدام أمر CLI التالي:
P4wnP1_cli hid run -c 'type("Hello world")'
يجب أن يبدو إخراج النتيجة في جلسة SSH مشابهًا لهذا:``` TempFile created: /tmp/HIDscript295065725 Start appending to 'HIDscript295065725' in folder 'TMP' Result: null
على مضيف USB، يجب أن تكون "Hello World" قد تم كتابتها في التطبيق الذي يحمل تركيز لوحة المفاتيح.
*إذا كان عميل SSH الخاص بك يعمل على مضيف USB نفسه، فإن "Hello world" المكتوبة ستنتهي في مكان ما بين المخرجات الناتجة
لأمر CLI (لا تنتمي إلى المخرجات، ولكنها كُتبت في المنتصف).*
**تحقيق الهدف. قمنا بحقن ضغطات المفاتيح في الهدف.**
قراءة كثيرة لمهمة بسيطة مثل حقن ضغطات المفاتيح، ولكن مرة أخرى، هذا القسم يهدف إلى شرح المفاهيم الأساسية.
### 2.2 الانتقال إلى ميزات لغة أكثر تطورًا في HIDScript
إذا تمكنت من تشغيل حقن ضغطات المفاتيح "Hello world"، فهذه نقطة جيدة لاستكشاف بعض ميزات HIDScript الإضافية.
نحن نعرف بالفعل أمر `type`، لكن دعنا نحاول مناقشة بعض أوامر HIDScript الأكثر تطورًا:
#### الضغط على المفاتيح الخاصة والتركيبات
يدعم أمر `type` الضغط على مفتاح الإرجاع، عن طريق ترميز حرف "سطر جديد" في سلسلة الإدخال، مثل هذا:```
P4wnP1_cli hid run -c 'type("line 1\nline 2\nline 3 followed by pressing RETURN three times\n\n\n")'
لكن ماذا عن المفاتيح الخاصة أو مجموعات المفاتيح؟
يأتي الأمر press للمساعدة!
لنستخدم press لإرسال CTRL+ALT+DELETE إلى مضيف USB:```
P4wnP1_cli hid run -c 'press("CTRL ALT DELETE")'
*ملاحظة: اثنان من المفاتيح كانا معدِّلين (CTRL و ALT) وواحد فقط كان مفتاحاً فعلياً (DELETE)*
لنضغط على المفتاح 'A' بدون أي مفتاح معدِّل:```
P4wnP1_cli hid run -c 'press("A")'
يجب أن يكون الناتج الناتج هو حرف 'a' صغير، لأن press("A") يفسر 'A' كمفتاح. أما الأمر type("A")، من ناحية أخرى، فيحاول الضغط على مجموعة مفاتيح يجب أن تؤدي إلى حرف 'A' كبير كناتج.
دعنا نجمع بين مفتاح تعديل ومفتاح غير تعديل، وذلك لإنتاج حرف 'A' كبير كناتج (محاكاة سلوك type("A"):```
P4wnP1_cli hid run -c 'press("SHIFT A")'
كان من المفترض أن ينتج هذا حرف A كبير.
من المهم أن نفهم أن `press` يفسر وسائط المفاتيح المعطاة له كمفاتيح، بينما يحاول `type` إيجاد
مجموعات المفاتيح المناسبة لإنتاج الأحرف المطلوبة.
في المثال الأخير، دعنا نجمع بين `press` و `type`.```
P4wnP1_cli hid run -c 'type("before caps\n"); press("CAPS"); type("after caps\n"); press("CAPS");'
آخر أمر تم كتابته كتب سلسلة، وبدّل حالة CAPSLOCK، وكتب سلسلة أخرى وبدّل حالة CAPSLOCK مرة أخرى. نتيجة لذلك، يجب أن تكون CAPSLOCK في حالتها الأولية (تم التبديل مرتين)، ولكن إحدى السلاسل تُكتب بأحرف كبيرة، والأخرى بأحرف صغيرة على الرغم من أن كلتا السلسلتين تم إدخالهما بأحرف صغيرة.
ملاحظات إضافية حول ضغطات المفاتيح باستخدام press:
لا أرغب في الخوض في أعماق آلية عمل تقارير لوحة المفاتيح USB، ولكن بعض الأمور تستحق الذكر لتوضيح
حدود وإمكانيات أمر press (الذي يعمل بدوره بناءً على تقارير لوحة المفاتيح الخام):
press ما يصل إلى ستة مفاتيح عادية أو خاصة
press("Z") ينتج USB_KEY_Z لتخطيط لوحة مفاتيح EN_US، ولكنه ينتج
USB_KEY_Y لتخطيط ألماني. وهذا يتوافق مع الضغط على المفتاح الفعلي 'Z' على لوحة مفاتيح ألمانية، والذي سينتج
أيضاً USB_KEY_Y.)/usr/local/P4wnP1/keymaps/common.json على خريطة مفاتيح JSON منسقة بجميع المفاتيح الممكنة (كن حذراً من
تغيير الملف)press واحد لا ينتج تسلسل مفاتيح. جميع المفاتيح المقدمة تُضغط
في نفس الوقت وتُرفع في نفس الوقت.press بتحرير المفاتيح تلقائياً، مما يعني أن تسلسلاً مثل "اضغط مع الاستمرار على ALT، اضغط TAB، اضغط TAB، حرّر ALT"
غير ممكن حالياًأمر HIDScript لتغيير تخطيط لوحة المفاتيح هو layout(<اسم خريطة اللغة>).
المثال التالي يبدّل تخطيط لوحة المفاتيح إلى 'US'، يكتب شيئاً، ثم يبدّل التخطيط إلى 'German' قبل أن يستمر في الكتابة:``` P4wnP1_cli hid run -c 'layout("us"); type("Typing with EN_US layout\n");layout("de"); type("Typing with German layout supporting special chars üäö\n");'
نتيجة الإخراج للأمر المذكور أعلاه تعتمد على تخطيط الهدف المستخدم بواسطة مضيف USB.
على مضيف بتخطيط لوحة مفاتيح ألمانية، تبدو النتيجة كالتالي:```
Tzping with EN?US lazout
Typing with German layout supporting special chars üäö
على مضيف بتخطيط لوحة مفاتيح أمريكية، يبدو الأمر كالتالي:``` Typing with EN_US layout Tzping with German lazout supporting special chars [';
يرجى ملاحظة أن النتيجة المقصودة لا تتحقق إلا إذا توافق تخطيط لوحة مفاتيح P4wnP1 مع تخطيط لوحة المفاتيح المستخدم فعليًا بواسطة مضيف USB.
يتيح الأمر `layout` محاذاة التخطيط الداخلي لـ P4wwP1 مع تخطيط مضيف USB الهدف.
قد تكون القدرة على تغيير التخطيط في منتصف تشغيل HIDScript مفيدة: من يدري، ربما ترغب في اختبار تخطيط لوحة مفاتيح المضيف الهدف بالقوة الغاشمة عن طريق إصدار أوامر بتخطيطات متغيرة حتى يحقق أحد الأوامر المكتوبة التأثير المطلوب.
**هام:** التخطيط له تأثير عام. وهذا يعني أنه إذا تم تشغيل عدة نصوص HIDScript في وقت واحد وقام أحد النصوص بتعيين تخطيط جديد، فإن جميع النصوص الأخرى تتأثر فورًا أيضًا.
#### سرعة الكتابة
بشكل افتراضي، يقوم P4wnP1 بحقن ضغطات المفاتيح بأسرع ما يمكن. اعتمادًا على هدفك، قد يكون هذا أكثر من اللازم (فكر في الإجراءات المضادة التي تمنع حقن ضغطات المفاتيح بناءً على تحليل سلوك سرعة الكتابة). يدعم HIDScript أمرًا لتغيير هذا السلوك.
`typingSpeed(delayMillis, jitterMillis)`
الوسيطة الأولى للأمر `typingSpeed` تمثل تأخيرًا ثابتًا بالمللي ثانية، يتم تطبيقه بين ضغطتي مفتاح. الوسيطة الثانية هي تموج إضافي بالمللي ثانية. يضيف تأخيرًا عشوائيًا إضافيًا، يتراوح بين 0 والتموج المعطى بالمللي ثانية، إلى التأخير الثابت المقدم مع الوسيطة الأولى.
لنجرب استخدام `typingSpeed` لإبطاء الكتابة:```
P4wnP1_cli hid run -c 'typingSpeed(100,0); type("Hello world")'
بعد ذلك، بدلاً من تأخير ثابت، نحاول استخدام تشويش عشوائي:``` P4wnP1_cli hid run -c 'typingSpeed(0,500); type("Writing with random jitter up to 500 milliseconds")'
أخيرًا، من خلال الجمع بين القيمتين وضبطهما، يمكننا محاكاة سرعة الطباعة الطبيعية:```
P4wnP1_cli hid run -c 'typingSpeed(100,150); type("Writing with more natural speed")'
مهم: سرعة الكتابة لها تأثير عالمي. هذا يعني أنه إذا تم تشغيل عدة نصوص HIDScript في وقت واحد وقام أحد النصوص بتعيين سرعة كتابة جديدة، فإن جميع النصوص الأخرى تتأثر فورًا أيضًا.
انتظار تقرير LED، أو بشكل أدق تغييرات حالة LED، هي إحدى ميزات لوحة المفاتيح الأكثر تطورًا في HIDScript. يمكن أن تكون قوية جدًا ولكنها تحتاج إلى بعض الشرح.
ربما لاحظت أن (اعتمادًا على نظام تشغيل المضيف USB) تُشارك معدِّلات حالة لوحة المفاتيح (NUM LOCK، SCROLL LOCK، CAPS LOCK) عبر لوحات مفاتيح متعددة متصلة. على سبيل المثال، إذا قمت بتوصيل لوحتي مفاتيح بمضيف Windows، وقمت بتبديل CAPS LOCK على إحداهما، يتغير LED الخاص بـ CAPS LOCK على كلتا لوحتي المفاتيح.
يمكن استخدام هذا الاختبار بالضبط لتحديد ما إذا كانت معدِّلات حالة لوحة المفاتيح مشتركة عبر جميع لوحات المفاتيح لنظام تشغيل معين.
في حالة دعم مضيف USB لهذا النوع من مشاركة الحالة (على سبيل المثال، يدعم Windows ذلك)، يمكن للغة HIDScript في P4wnP1 الاستفادة منه.
تخيل السيناريو التالي:
P4wnP1 متصلة بمضيف USB وتريد تطبيق حقن ضغطات المفاتيح، لكنك لا تريد أن يقوم نص HIDScript بتشغيل ضغطات المفاتيح فورًا. بدلاً من ذلك، يجب أن ينتظر نص HIDScript حتى تضغط على NUMLOCK أو CAPSLOCK أو SCROLLLOCK على لوحة المفاتيح الحقيقية للمضيف. لماذا؟ ربما تكون مشاركًا في عملية اختبار، ودخل شخص ما ولا تريد أن يرى هذا "الشخص" بالضبط كيف يتم كتابة عدد هائل من الأحرف بطريقة سحرية في نافذة وحدة تحكم ظهرت فجأة. لذا تنتظر حتى يخرج "الشخص" ما، تضغط NUM LOCK، وفي النهاية تظهر نافذة وحدة تحكم ويتم كتابة عدد هائل من الأحرف بطريقة سحرية... أعتقد أنك فهمت الفكرة.
يمكن تحقيق السلوك الموصوف على النحو التالي:``` P4wnP1_cli hid run -c 'waitLED(NUM); type("A huge amount of characters\n")'
إذا اختبرت الأمر أعلاه، يجب أن تبدأ الكتابة فقط إذا كان زر NUM LUSH مضغوطًا على لوحة مفاتيح الأجهزة الخاصة بالمضيف USB،
لكن قد تواجه حالات يتم فيها إصدار ضغطات المفاتيح فورًا، حتى لو لم يتم الضغط على NUM LOCK (ولم يتغير حالة LED الخاصة بلوحة المفاتيح).
هذا سلوك مقصود والسبب في ذلك هو حالة استخدام أخرى لأمر `waitLED`:
ربما قد استخدمت سابقًا لغات برمجة نصوص لوحة المفاتيح الأخرى وأجهزة USB أخرى قادرة على حقن ضغطات المفاتيح.
معظم هذه الأجهزة تشترك في مشكلة شائعة: أنت لا تعرف متى تبدأ الكتابة!
إذا بدأت الكتابة فورًا بعد تشغيل جهاز USB، فمن المحتمل أن المضيف USB لم يكمل بعد تعداد الجهاز وبالتالي لم يتمكن من تشغيل برامج تشغيل لوحة المفاتيح. وفي النهاية، ستضيع ضغطات المفاتيح الخاصة بك.
للتغلب على هذا، يمكنك إضافة تأخير قبل بدء حقن ضغطات المفاتيح. ولكن كم يجب أن يكون هذا التأخير؟ خمس
ثوانٍ، 10 ثوانٍ، 30 ثانية؟
الإجابة هي: يعتمد الأمر! يعتمد على مدى سرعة المضيف في تعداد الجهاز وتشغيل برنامج تشغيل لوحة المفاتيح.
في الواقع، لا يمكنك معرفة المدة التي يستغرقها ذلك دون اختبار الجهاز الفعلي المستهدف.
ولكن كما تعلمنا بالفعل، أنظمة التشغيل مثل Windows تشارك حالة LED عبر لوحات مفاتيح متعددة.
هذا يعني أنه إذا تم ضبط LED الخاص بـ NUMLOCK للوحة المفاتيح المضيفة على ON قبل توصيل لوحة مفاتيح ثانية، فيجب ضبط LED الخاص بـ NUMLOCK على هذه اللوحة الجديدة على ON أيضًا، بمجرد توصيلها. إذا كان قد تم ضبط LED الخاص بـ NUM LOCK على OFF، فعلى أي حال، تتلقى لوحة المفاتيح الموصلة حديثًا حالة LED (جميع LEDs متوقفة في هذه الحالة). الشيء المثير للاهتمام في هذا هو
أن "تحديث LED" هذا لا يمكن إرساله إلا من مضيف USB إلى لوحة المفاتيح الموصلة، إذا كان برنامج تشغيل لوحة المفاتيح قد أنهى التحميل (لن يكون إرسال حالة LED ممكنًا بخلاف ذلك).
أليس هذا جميلًا؟ يخبرنا مضيف USB: "أنا جاهز لاستقبال ضغطات المفاتيح". لا حاجة للتلاعب بالتأخيرات الابتدائية.
ولكن هناك مشكلة أخرى: افترض أننا قمنا بتوصيل P4wnP1 بمضيف USB. نقوم بتشغيل HIDScript يبدأ بـ `waitLED` بدلاً من تأخير مصمم يدويًا. تبدأ الكتابة بعد `waitLED`، لكن لا يحدث شيء - ضغطات المفاتيح تضيع على أي حال! لماذا؟
لأنه من المحتمل أننا فاتنا تحديث حالة LED، حيث وصل قبل أن نبدأ حتى تشغيل HIDScript الخاص بنا.
بالضبط "حالة السباق" هذه هي السبب وراء احتفاظ P4wnP1 بجميع تغييرات حالة LED التي تم التعرف عليها، إلا إذا استهلكها على الأقل HIDScript واحد عن طريق استدعاء `waitLED` (أو `waitLEDRepeat`). قد يؤدي هذا إلى السلوك الموصوف سابقًا، حيث يعود `waitLED` فورًا، حتى لو لم يحدث أي تغيير في LED. نحن الآن نعلم: تغيير LED حدث بالفعل، ولكن قد يكون قد حدث في وقت أبكر بكثير (قبل أن نبدأ حتى تشغيل HIDScript)، لأن تغيير الحالة تم الحفاظ عليه. نعلم أيضًا أن هذا السلوك ضروري لتجنب فقدان تغييرات حالة LED، في حالة استخدام `waitLED` لاختبار "جاهزية برنامج تشغيل لوحة المفاتيح للمضيف USB".
*ملاحظة: من الجدير بالذكر أن `waitLED` يعود فقط إذا كانت حالة LED المستلمة تختلف عن الحالة الداخلية لـ P4wnP1.
هذا يعني، حتى لو استمعنا إلى تغيير في أي LED باستخدام `waitLED(ANY)`، لا يزال من الممكن أن نتلقى حالة LED أولية من مضيف USB لا تختلف عن الحالة الداخلية لـ P4wnP1. في هذه الحالة، سيتم حظر `waitLED(ANY)` إلى الأبد (أو حتى يحدث تغيير حقيقي في LED).
يمكن معالجة هذه الحالة الخاصة عن طريق استدعاء `waitLED(ANY_OR_NONE)`، الذي يعود بمجرد وصول حالة LED جديدة، حتى لو لم ينتج عنها تغيير.*
**شرح كافٍ، دعنا ننتقل إلى الجانب العملي ... قبل أن نفعل ذلك، يجب تغيير إعدادات الأجهزة قليلاً:**
قم بتوصيل مصدر طاقة خارجي بمنفذ USB الثاني لـ Raspberry Pi Zero (المنفذ الخارجي). يضمن هذا أن
P4wnP1 لا يفقد الطاقة عند فصله عن مضيف USB، لأنه لم يعد يعتمد على طاقة الناقل. منفذ USB الذي يجب استخدامه لتوصيل P4wnP1 بمضيف USB الهدف هو الأعمق من بين المنفذين.
الآن قم بتشغيل HIDScript التالي```
P4wnP1_cli hid run -c 'while (true) {waitLED(ANY);type("Attached\n");}'
افصل P4wnP1 عن مضيف USB (وتأكد من بقائه مشغلاً)! أعد توصيله بمضيف USB ... في كل مرة تعيد فيها توصيل P4wnP1 بالمضيف، يجب أن يتم كتابة "Attached" على المضيف.
هذا علمنا 3 حقائق:
waitLED كأمر أولي في السكريبتات، لبدء الكتابة بمجرد أن يكون برنامج تشغيل لوحة المفاتيح جاهزًاwaitLED ليس الخيار المثالي لإيقاف سكريبتات HID مؤقتًا حتى يتم الضغط على مفتاح يؤدي إلى تغيير LED على مضيف USB، لأن تغييرات الحالة المحفوظة قد تفتح الأمر بطريقة غير مقصودةبما أننا لم ننتهِ بعد من أمر waitLED، فلنهتم الآن بالحقيقة الثالثة. دعنا نترك CLI.
http://172.24.0.1:8000)ms_snake.js مثال جيد جدًا لقوة المشغلات المعتمدة على LED)استبدل السكريبت في نافذة المحرر بالسكريبت التالي:``` return waitLED(ANY);
بعد الضغط على زر التشغيل، يجب أن يظهر في الجانب الأيمن من النافذة مهمة HID جديدة قيد التشغيل. إذا ضغطت على زر
"info" الصغير الموجود على يمين مهمة HIDScript، يمكنك رؤية التفاصيل، مثل حالتها (يجب أن تكون قيد التشغيل)، ومعرف المهمة
ومعرف VM (هذا هو رقم جهاز JavaScript VM الافتراضي الذي يشغل هذه المهمة. يوجد 8 من أجهزة VM هذه، لذا يمكن تشغيل 8 نصوص HIDScript
بالتوازي).
الآن، في حالة حدوث أي تغيير في مصباح LED من مضيف USB (عن طريق تبديل NUM أو CAPS أو SCROLL)، يجب أن تنتهي مهمة HIDScript.
ولا يزال من الممكن العثور عليها ضمن المهام "الناجحة".
إذا ضغطت على زر "info" الصغير مرة أخرى، يجب أن تكون هناك معلومات حول قيمة النتيجة (مشفرة بتنسيق JSON)،
والتي تبدو شيئًا كهذا:```
{"ERROR":false,"ERRORTEXT":"","TIMEOUT":false,"NUM":true,"CAPS":false,"SCROLL":false,"COMPOSE":false,"KANA":false}
إذًا الأمر waitLED يُعيد كائن JavaScript يبدو هكذا:```
{
ERROR: false, // gets true if an error occurred (f.e. HIDScript was aborted, before waitLED could return)
ERRORTEXT: "", // corresponding error string
TIMEOUT: false, // gets true if waitLED timed out (more on this in a minute)
NUM: true, // gets true if NUM LED had changed before waitLED returned
CAPS: false, // gets true if CAPS LED had changed before waitLED returned
SCROLL: false, // gets true if SCROLL LED had changed before waitLED returned
COMPOSE: false, // gets true if COMPOSE LED had changed before waitLED returned (uncommon)
KANA: false // gets true if KANA LED had changed before waitLED returned (uncommon)
}
في حالتي، أصبح `NUM` صحيحًا. في حالتك ربما كان `CAPS`. لا يهم أي مصباح LED كان. ما يهم حقًا هو حقيقة أن القيمة المُرجَعة تُتيح فرصة فحص تغيير LED الذي يجعل الأمر يعود، وبالتالي يمكن استخدامه لاتخاذ قرارات تشعبية في HIDScript الخاص بك (استنادًا إلى تغييرات حالة LED الصادرة عن لوحة المفاتيح الحقيقية للمضيف USB).
دعنا نجرب مثالاً:```
while (true) {
result = waitLED(ANY);
if (result.NUM) {
type("NUM has been toggled\n");
}
if (result.SCROLL) {
type("SCROLL has been toggled\n");
}
if (result.CAPS) {
break; //exit loop
}
}
بافتراض أن السكربت المذكور يعمل بالفعل، فإن الضغط على NUM على مضيف USB يجب أن يؤدي إلى كتابة "NUM has been toggled"، بينما الضغط على SCROLL LOCK يؤدي إلى كتابة النص "SCROLL has been toggled". يتكرر هذا السلوك حتى يتم الضغط على CAPS LOCK ويؤدي تغيير LED الناتج إلى إحباط الحلقة وإنهاء HIDScript.
Puhhh ... الكثير من النص حول هذا الأمر لأمر HIDScript واحد، ولكن لا يزال هناك بعض الأشياء.
قدمنا وسائط مثل NUM و ANY و ANY_OR_NONE لأمر waitLED دون شرح إضافي.
يقبل أمر waitLED ما يصل إلى وسيطتين:
الوسيطة الأولى، كما قد تكون خمنت، هي مرشح قائمة بيضاء لمصابيح LED التي يجب مراقبتها. الوسائط الصالحة هي:
ANY (التفاعل مع أي تغيير في أي من مصابيح LED)ANY_OR_NONE (التفاعل مع كل حالة جديدة لـ LED، حتى لو لم يكن هناك تغيير)NUM (تجاهل جميع تغييرات LED، باستثناء تغيير LED الخاص بـ NUM)CAPS (تجاهل جميع تغييرات LED، باستثناء تغيير LED الخاص بـ NUM CAPS)SCROLL (تجاهل جميع تغييرات LED، باستثناء تغيير LED الخاص بـ NUM SCROLL)CAPS | NUM, NUM | SCROLLالوسيطة الثانية، التي لم نستخدمها حتى الآن، هي مدة المهلة الزمنية بالميلي ثانية. إذا لم يحدث أي تغيير في LED خلال هذه المدة، فإن waitLED يعود ويكون TIMEOUT: true مضبوطًا في الكائن الناتج (بالإضافة إلى ذلك، يتم ضبط ERROR على true ويشير ERRORTEXT إلى انتهاء المهلة).
الأمر التالي سينتظر تغييرًا على LED الخاص بـ NUM، لكنه يقطع الانتظار بعد 5 ثوانٍ:``` waitLED(NUM,5000)
على الرغم من أن `waitLED` هو أمر قوي جداً إذا تم استخدامه بشكل صحيح، إلا أنه لم يساعد في التعامل مع مهمتنا السهلة المتمثلة في إيقاف HIDScript بشكل قوي حتى يتم الضغط على مفتاح تعديل الحالة على مضيف USB الهدف (تذكر: أردنا إيقاف التنفيذ لضمان خروج الشخص غير المرغوب فيه قبل بدء الكتابة، لكن `waitLED` كان يعود أحياناً مبكراً بسبب التغييرات المحفوظة في حالة LED).
هنا يأتي دور `waitLEDRepeat` لإنقاذ الموقف.
الصق النص البرمجي التالي في المحرر وحاول جعل الأمر يعود. افحص نتائج HIDScript بعد ذلك.```
return waitLEDRepeat(ANY)
يجب أن تلاحظ بسرعة، أن نفس مصباح LED يجب تغييره عدة مرات بشكل متكرر، لكي يعود الأمر waitLEDRepeat. الأمر waitLEDRepeat لن يعود إذا تغيرت مصابيح LED مختلفة أو إذا كان تغير مصباح LED واحد يحدث ببطء شديد.
الوسيطة المقدمة إلى waitLEDRepeat (وهي ANY في المثال) تخدم نفس الغرض تمامًا كما في waitLED. إنها مرشح قائمة بيضاء. على سبيل المثال waitLEDRepeat(NUM) سيعود فقط لتغييرات مصباح NUM LOCK - بغض النظر عن مدى سرعة وتكرار الضغط على مفتاح CAPS LOCK، فإنه لن يعود ما لم يتم الضغط على NUM LOCK بشكل متكرر.
بشكل افتراضي، يجب أن يتغير أحد مصابيح LED في القائمة البيضاء 3 مرات وألا تتجاوز المدة بين تغيرين متتاليين 800 مللي ثانية لكي يعود waitLEDRepeat. يمكن ضبط هذا السلوك، من خلال توفير وسيطات إضافية كما هو موضح في هذا المثال:```
filter = ANY; // same filters as for waitLED
num_changes = 5; // how often the SAME LED has to change, in order to return from waitLEDRepeat
max_delay = 800; // the maximum duration between two LED changes, which should be taken into acccount (milliseconds)
timeout = 10000; // timeout in milliseconds
waitLEDRepeat(filter, num_changes, max_delay); //wait till a LED frequently changed 5 times, no timeout waitLEDRepeat(filter, num_changes, max_delay, timeout); //wait till a LED frequently changed 5 times, abort after 10 seconds
إذًا هذه هي كيفية التفاعل مع تقارير LED من مضيف USB في HIDScript.
*ملاحظة: `waitLEDRepeat` لا يختلف عن `waitLED` فيما يتعلق باستهلاك تغييرات حالة LED المحفوظة.
على أي حال، من الصعب جدًا تشغيله عن غير قصد.*
لذا فإن `waitLEDRepeat` هو الخيار الصحيح إذا كانت المهمة هي إيقاف HIDScripts مؤقتًا حتى يحدث تفاعل بشري. بالطبع يمكن استخدامه أيضًا للتفرع، لأنه يوفر نفس الكائن المرتجع الذي يوفره `waitLED`.
حتى هذه النقطة، اكتسبنا قدرًا جيدًا من المعرفة حول HIDScript (بالطبع ليس كل شيء، لم ننظر حتى في إمكانيات التحكم بالماوس في لغة البرمجة النصية هذه). على أي حال، هذا البرنامج التعليمي يدور حول سير عمل P4wnP1 A.L.O.A. والمفاهيم الأساسية. لذلك لن ننظر في ميزات HIDScript الأخرى الآن، وسنمضي قدمًا.
دعونا نلخص ما تعلمناه عن سير عمل P4wnP1 ومفاهيمها حتى الآن:
- يمكننا بدء إجراءات مثل حقن ضغطات المفاتيح من عميل CLI، عند الطلب
- يمكننا استخدام عميل الويب لتحقيق نفس الشيء، مع تحكم إضافي في وظائف HIDScript
- إذا قمنا بتوصيل مصدر طاقة خارجي بـ P4wnP1 A.L.O.A.، فإننا نعلق/نفصل عن مضيفي USB مختلفين وتبقى نصوص HIDScript التي بدأت بالفعل تعمل بسلاسة
- يمكننا تهيئة مكدس USB بالضبط وفقًا لاحتياجاتنا (وتغيير تكوينه في وقت التشغيل دون إعادة تشغيل P4wnP1)
- يمكننا كتابة نصوص HIDScript متعددة الأغراض، مع منطق معقد يعتمد على JavaScript (مع دعم للدوال، الحلقات، التفرع، إلخ.)
### 3. سير العمل الجزء 2 - Templating و TriggerActions
قبل المتابعة مع المفاهيم الرئيسية الأخرى لـ P4wnP1 A.L.O.A.، دعنا ننقّح هدفنا الأول، الذي كان "تشغيل حقن ضغطات المفاتيح ضد مضيف USB":
- الهدف الجديد هو كتابة "Hello world" في محرر مضيف Windows USB (notepad.exe).
- يجب أن يتم فتح المحرر بواسطة P4wnP1 (وليس يدويًا من قبل المستخدم).
- يجب إغلاق المحرر تلقائيًا عند تبديل أي من مؤشرات LED للوحة المفاتيح الخاصة بمضيف USB.
- في كل مرة يتم فيها توصيل P4wnP1 بمضيف USB، يجب تكرار هذا السلوك (مع مصدر طاقة خارجي، دون إعادة تشغيل P4wnP1).
- يجب أن تعمل العملية *مرة واحدة فقط*، ما لم يتم إعادة توصيل P4wnP1 بمضيف USB، حتى إذا حدثت تغييرات متتالية في مؤشرات LED بعد بدء تشغيل HIDScript.
- حتى إذا تم إعادة تشغيل P4wnP1، يجب أن يكون من الممكن استعادة نفس السلوك دون إعادة إنشاء تفاصيل الإعداد من الصفر مرة أخرى.
يمكن القيام ببدء تشغيل notepad، وكتابة "Hello world"، وإغلاق notepad بعد تغيير LED باستخدام ما تعلمناه حتى الآن. قد تبدو HIDScript المناسبة شيئًا كهذا:```
// Starting notepad
press("WIN R"); // Windows key + R, to open run dialog
delay(500); // wait 500ms for the dialog to open
type("notepad.exe\n"); // type 'notepad.exe' to the run dialog, append a RETURN press
delay(2000); // wait 2 seconds for notepad to come up
// Type the message
type("Hello world") // Type "Hello world" to notepad
// close notepad after LED change
waitLED(ANY); // wait for a single LED change
press("ALT F4"); // ALT+F4 shortcut to close notepad
//as we changed content, there will be a confirmation dialog before notepad exits
delay(500); // wait for the confirmation dialog
press("RIGHT"); // move focus to next button (don't save) with RIGHT ARROW
press("SPACEBAR"); // confirm dialog with space
الجديد الوحيد في هذا السكريبت هو الأمر delay، والذي لا يحتاج إلى شرح كبير. فهو يؤخر التنفيذ للمقدار المحدد من المللي ثانية.
يمكن لصق السكريبت في محرر HIDScript في عميل الويب وتشغيله بأمر "run" لاختباره.
يجب أن يعمل كما هو مقصود، لذا نحن على وشك الانتهاء. لكي نتمكن من إعادة استخدام السكريبت حتى بعد إعادة التشغيل، نقوم بتخزينه بشكل دائم. يمكن تحقيق ذلك بالضغط على زر "store" في علامة تبويب HIDScript في عميل الويب. بعد إدخال اسم (نستخدم tutorial1 الآن) وتأكيد الحوار، يجب أن يتم تخزين HIDScript. يمكننا التحقق من ذلك بالضغط على زر "Load & Replace" في عميل الويب. يجب أن يظهر السكريبت المخزن في قائمة السكريبتات المخزنة باسم tutorial1.js (يتم إضافة الامتداد .js تلقائيًا إذا لم يتم توفيره بالفعل في حوار "store").
تحذير: إذا تم استخدام اسم ملف موجود بالفعل في حوار التخزين، فسيتم استبدال الملف المعني دون طلب تأكيد إضافي.
دعنا نحاول تشغيل السكريبت المخزن باستخدام عميل CLI من جلسة SSH، كما يلي:``` P4wnP1_cli hid run tutorial1.js
كان ينبغي أن يعمل هذا. هذا يعني أنه من الممكن بدء HIDScripts المخزنة من جميع التطبيقات التي تدعم أوامر shell
أو من سكريبت bash بسيط، باستخدام عميل CLI لـ P4wnP1 A.L.O.A.
سيكون من الممكن حتى بدء السكريبت عن بُعد من عميل CLI مُجمَّع لنظام Windows. بافتراض أن مضيف Windows
قادر على الوصول إلى P4wnP1 A.L.O.A. عبر WiFi وأن عنوان IP لـ P4wnP1 مضبوط على `172.24.0.1` فسيبدو الأمر المناسب مثل
هذا:```
P4wnP1_cli.exe --host 172.24.0.1 hid run tutorial1.js
ملاحظة: في وقت كتابة هذا النص، لم أقرر بعد ما إذا كانت P4wnP1 A.L.O.A. تُوفر ملف CLI ثنائي لكل منصة وبنية ممكنة. ولكن من المرجح أن يتم توفير إصدارات مُجمعة مسبقًا للمنصات الرئيسية. إذا لم يكن الأمر كذلك - فهذه ليست مشكلة كبيرة، لأن التجميع المشترك لشفرة Go الخاصة بعميل CLI يستغرق أقل من دقيقة.
الخطوة التالية هي السماح للنص البرمجي بالعمل مرة أخرى، في كل مرة يتم فيها إعادة توصيل P4wnP1 بمضيف USB. النهج الذي استخدمناه بالفعل لتحقيق هذا السلوك كان هو تغليف كل شيء في حلقة وإضافة waitLED(ANY_OR_NONE) في البداية. يضمن waitLED(ANY_OR_NONE) أن الحلقة تستمر فقط إذا أشار مضيف USB الهدف إلى أن برنامج تشغيل لوحة المفاتيح جاهز لاستقبال الإدخال عن طريق إرسال تحديث لحالة أضواء LED العالمية للوحة المفاتيح. النص البرمجي المعدل وفقًا لذلك قد يبدو هكذا:```
while (true) {
waitLED(ANY_OR_NONE); // wait till keyboard driver sends the initial LED state
// Starting notepad press("WIN R"); // Windows key + R, to open run dialog delay(500); // wait 500ms for the dialog to open type("notepad.exe\n"); // type 'notepad.exe' to the run dialog, append a RETURN press delay(2000); // wait 2 seconds for notepad to come up
// Type the message type("Hello world") // Type "Hello world" to notepad
// close notepad after LED change waitLED(ANY); // wait for a single LED change press("ALT F4"); // ALT+F4 shortcut to close notepad
//as we changed content, there will be a confirmation dialog before notepad exits delay(500); // wait for the confirmation dialog press("RIGHT"); // move focus to next button (don't save) with RIGHT ARROW press("SPACEBAR"); // confirm dialog with space }
النص البرمجي المذكور أعلاه، بالفعل، سيتم تشغيله في كل مرة يتم فيها توصيل P4wnP1 بمضيف USB. لكن النص ليس قويًا جدًا، لأن هناك `waitLED` ثانية متضمنة، تنتظر حتى يتم إغلاق notepad.exe مرة أخرى.
القيام بذلك بهذه الطريقة ينطوي على عدة مشكلات. على سبيل المثال، إذا تم فصل P4wnP1 قبل كتابة "Hello world"، فإن `waitLED` المحظورة الآن ستكون تلك التي تسبق `press("ALT F4")` وسيستمر التنفيذ بالضبط عند هذه النقطة من HIDScript بمجرد إعادة توصيل P4wnP1 بمضيف (ربما مختلف) USB مرة أخرى.
معيار قتل نهائي للنهج المختار هو المشكلة التالية: لا يمكن تحقيق شرط تشغيل النص البرمجي مرة واحدة فقط بعد توصيل P4wnP1 بمضيف USB، لأن الضغط على NUM LOCK عدة مرات من شأنه إعادة تشغيل النص البرمجي مرارًا وتكرارًا.
إذن كيف نحل هذا؟
#### دعنا نقدم TriggerActions
الحل للمشكلة هو ما يسمى بـ "TriggerActions". كما يوحي الاسم، فإن مفهوم سير العمل P4wnP1 A.L.O.A. هذا يقوم بتشغيل إجراءات بناءً على مشغلات محددة مسبقًا.
للحصول على فكرة عما أتحدث عنه، توجه إلى علامة التبويب "TRIGGER ACTIONS" في واجهة الويب. اعتمادًا على الإعداد الحالي، قد تكون هناك بالفعل TriggerActions موجودة. لا نهتم بـ TriggerActions الموجودة الآن.
اضغط على زر "ADD ONE" وستتم إضافة TriggerActions جديدة وفتحها فورًا في وضع التحرير. تكون TriggerAction الجديدة معطلة افتراضيًا ويجب تمكينها لجعلها قابلة للتحرير. لذا نقوم بتبديل مفتاح التمكين.
الآن من القائمة المنسدلة المسماة "Trigger" يجب تحديد الخيار "USB gadget connected to host". يجب أن يكون للإجراء إعداد مسبق لـ "write log entry" محدد. نتركه هكذا ونضغط على زر "Update".
يجب أن تكون TriggerAction المضافة حديثًا مرئية الآن في نظرة عامة على TriggerActions (التي تحتوي على أعلى معرف) وتعرض ملخصًا للمشغل والإجراء المحددين بشكل قابل للقراءة.
لاختبار ما إذا كانت TriggerAction المحددة حديثًا تعمل، انتقل إلى علامة التبويب "Event Log" في واجهة الويب. تأكد من فتح واجهة الويب عبر WiFi (وليس USB ethernet). قم بتطبيق طاقة خارجية على P4wnP1، وافصله عن مضيف USB وأعد توصيله مرة أخرى. يجب دفع رسالة سجل إلى العميل في كل مرة يتم فيها توصيل P4wnP1 بمضيف USB، على الفور.
إذا كررت هذا عدة مرات، فقد لاحظت أن مشغل "USB gadget connected to host" يعمل بسرعة كبيرة (أو في مرحلة مبكرة من مرحلة تعداد USB). لكي نكون أكثر دقة: عندما يعمل هذا المشغل، من المعروف أن P4wnP1 تم توصيله بمضيف USB، ولكن لا يوجد ضمان بأن مضيف USB تمكن من تحميل جميع برامج تشغيل أجهزة USB اللازمة. **في الواقع، من غير المحتمل جدًا أن يكون برنامج تشغيل لوحة مفاتيح USB قد تم تحميله عند تشغيل المشغل. يجب أن نضع هذا في الاعتبار.**
قبل أن نمضي قدمًا في مهمتنا، نقوم بإجراء اختبار إضافي. بالعودة إلى علامة التبويب "TriggerAction" ونضغط على الزر الأزرق الصغير الذي يشبه القلم المخصص لـ TriggerAction التي أنشأناها حديثًا. ننتهي في وضع التحرير مرة أخرى.
هذه المرة، نقوم بتمكين خيار `One shot`. بعد ذلك، عد إلى "Event Log"، ومرة أخرى، افصل وأعد توصيل P4wnP1 من مضيف USB. هذه المرة يجب أن تعمل TriggerAction مرة واحدة فقط. بغض النظر عن عدد مرات إعادة توصيل P4wnP1 بمضيف USB بعد ذلك، لا ينبغي إنشاء أي رسالة سجل جديدة تشير إلى اتصال USB.
من الجدير بالذكر أن TriggerAction ذات "One shot" لا يتم حذفها بعد تشغيل المشغل. بدلاً من ذلك، يتم تعطيل TriggerAction مرة أخرى. إعادة التمكين يسمح بإعادة استخدام TriggerAction دون إعادة تعريفها. لا يتم فقدان أي شيء حتى يتم الضغط على زر "سلة المهملات" الأحمر على TriggerAction، والذي سيؤدي إلى حذف TriggerAction المعنية.
**تحذير: إذا تم النقر على زر الحذف لـ TriggerAction، فسيتم حذف TriggerAction بشكل دائم دون مزيد من التأكيد.**
في هذه المرحلة، دعنا نفعل الأمر الواضح. نقوم بتحرير TriggerAction التي تم إنشاؤها وتحديد "start a HIDScript" بدلاً من "write log entry" للإجراء الذي سيتم تنفيذه. بالإضافة إلى ذلك، نقوم بتعطيل "one-shot" مرة أخرى. يظهر حقل إدخال جديد يسمى "script name". يؤدي النقر على حقل الإدخال هذا إلى إظهار مربع حوار اختيار لجميع HIDScripts المخزنة، بما في ذلك HIDScript الذي أنشأناه سابقًا `tutorial1.js`.
*قبل أن نختبر ما إذا كان هذا يعمل، دعني أدلي بملاحظة سريعة حول إجراء "write log entry": P4wnP1 A.L.O.A. لا يتتبع المشغلات التي تم تشغيلها بالفعل. هذا يعني أن إدخالات السجل التي تم إنشاؤها بواسطة إجراء "write log entry" يتم تسليمها إلى جميع العملاء المستمعين، ولكن لا يتم تخزينها بواسطة خدمة P4wnP1 (لأسباب مختلفة). من ناحية أخرى، تقوم واجهة الويب بتخزين إدخال السجل حتى يتم إعادة تحميل واجهة الويب نفسها. وينطبق الشيء نفسه على الأحداث المتعلقة بمهام HIDScript. إذا انتهى HIDScript (بنجاح أو خطأ)، يتم دفع حدث إلى جميع واجهات الويب المفتوحة حاليًا. باختصار، كل واجهة ويب لها حالة وقت التشغيل، والتي تحتوي على معلومات أكثر من الخدمة الأساسية نفسها. إذا أصبحت حالة وقت التشغيل لواجهة الويب كبيرة جدًا (استخدام ذاكرة كبير جدًا)، يحتاج المرء فقط إلى إعادة تحميل العميل لمسح معلومات الحالة "التاريخية". إذا تصرفت الخدمة الأساسية بنفس الطريقة وخزنت كل المعلومات التاريخية، فسوف تنفد مواردها قريبًا جدًا. وبالتالي ينطبق هذا المفهوم على معظم الأنظمة الفرعية لـ P4wnP1 A.L.O.A.*
الآن عد إلى مهمتنا. لدينا TriggerAction جاهزة، والتي يجب أن تشغل HIDScript الخاص بنا في كل مرة يتم فيها توصيل P4wnP1 بمضيف USB.
اعتمادًا على مضيف USB الهدف، يعمل هذا بشكل موثوق بدرجة أكبر أو أقل. في إعداد الاختبار الخاص بي، لم يعمل على الإطلاق وهناك سبب:
دعنا نراجع الأسطر القليلة الأولى من HIDScript الخاص بنا:```
// Starting notepad
press("WIN R"); // Windows key + R, to open run dialog
delay(500); // wait 500ms for the dialog to open
type("notepad.exe\n"); // type 'notepad.exe' to the run dialog, append a RETURN press
... snip ...
مع العلم أن مشغل "اتصال الأداة المساعدة USB" ينشط في مرحلة مبكرة من تعداد USB وأن برنامج تشغيل لوحة المفاتيح لمضيف USB لم يتم تحميله بالضرورة، تصبح المشكلة واضحة. يجب علينا إضافة نوع من التأخير إلى البرنامج النصي لضمان تحميل برنامج تشغيل لوحة المفاتيح (وإلا فإن ضغطات المفاتيح لدينا ستنتهي في العدم).
نظرًا لأننا نعلم بالفعل أنه من غير الممكن توقع التأخير الأمثل، فإننا نستخدم نهج waitLED(ANY_OR_NONE) الذي تم شرحه سابقًا. البرنامج النصي الجديد يبدو كالتالي:```
waitLED(ANY_OR_NONE); //assure keyboard driver is ready
// Starting notepad press("WIN R"); // Windows key + R, to open run dialog delay(500); // wait 500ms for the dialog to open type("notepad.exe\n"); // type 'notepad.exe' to the run dialog, append a RETURN press delay(2000); // wait 2 seconds for notepad to come up
// Type the message type("Hello world") // Type "Hello world" to notepad
// close notepad after LED change waitLEDRepeat(ANY); // wait for a single LED change press("ALT F4"); // ALT+F4 shortcut to close notepad
//as we changed content, there will be a confirmation dialog before notepad exits delay(500); // wait for the confirmation dialog press("RIGHT"); // move focus to next button (don't save) with RIGHT ARROW press("SPACEBAR"); // confirm dialog with space
تخزين النص المعدل تحت نفس الاسم بالضبط (`tutorial1`) يستبدل HIDScript السابق دون تأكيد إضافي، كما ذكرنا سابقًا. وبالتالي لا حاجة لتعديل TriggerAction الخاص بنا، لأن اسم HIDScript الذي يشير إليه TriggerAction لم يتغير.
مع هذا التغيير البسيط، يجب أن يعمل كل شيء كما هو مقصود، ويجب أن يتم تشغيل النص البرمجي في كل مرة نتصل فيها بمضيف USB، ولكن فقط مرة واحدة.
الآن، إذا تم إعادة تشغيل P4wnP1 أو فقد الطاقة، فسيظل HIDScript الخاص بنا موجودًا، لأننا قمنا بتخزينه بشكل دائم، ولكن TriggerAction سيختفي. وغني عن القول أنه يمكن أيضًا تخزين TriggerActions بشكل دائم.
يعمل زر "store" في علامة التبويب "TriggerAction" تمامًا مثل الزر الموجود في محرر HIDScript. تجدر الإشارة إلى أنه *سيتم تخزين جميع TriggerActions النشطة حاليًا* إذا تم تأكيد مربع حوار "store" (بما في ذلك المعطلة منها).
أفضل الممارسات هي حذف جميع TriggerActions التي لا تنتمي إلى المهمة في النطاق الحالي قبل التخزين (يجب أن تكون قد خُزنت مسبقًا، إذا لزم الأمر) وتخزين المجموعة الصغيرة فقط من TriggerActions ذات الصلة بالمهمة الحالية، باستخدام اسم مناسب. هناك خياران لتحميل TriggerActions المخزنة مرة أخرى إلى النشطة:
- "load & replace" يمسح جميع TriggerActions النشطة ويحمل فقط المخزنة
- "load & add" يحافظ على TriggerActions النشطة بالفعل ويضيف المخزنة. وبالتالي يمكن استخدام "load & add" لبناء مجموعة معقدة من TriggerActions من مجموعات أصغر. يمكن بعد ذلك تخزين المجموعة الناتجة مرة أخرى.
في الوقت الحالي، يجب علينا فقط تخزين TriggerAction الوحيد الخاص بنا، والذي يبدأ HIDScript الخاص بنا. الاسم الذي نستخدمه للتخزين هو `tutorial1` مرة أخرى ولن يتعارض مع HIDScript المسمى `tutorial1`.
تأكد من نجاح التخزين بالضغط على زر "load&replace" في علامة التبويب "TriggerAction". يجب أن تظهر مجموعة TriggerAction المخزنة في القائمة وتسمى `tutorial1`.
**تحذير: تسمح مربعات حوار "load" الخاصة بـ TriggerAction بحذف TriggerActions المخزنة بالضغط على زر "trash" الأحمر بجوار كل إجراء. يؤدي الضغط على الزر إلى حذف مجموعة TriggerAction المقابلة بشكل دائم، دون تأكيد إضافي**
في هذه المرحلة، يمكننا حذف TriggerAction الخاص بنا بأمان من علامة التبويب "TriggerActions" (!!ليس باستخدام زر سلة المهملات من أحد مربعات حوار التحميل!!).
مع حذف TriggerAction من النشطة، لن يحدث شيء إذا قمنا بفصل وإعادة توصيل P4wnP1 من مضيف USB.
على أي حال، فإن مجموعة TriggerAction المخزنة `tutorial1` ستبقى بعد إعادة التشغيل ويمكن إعادة تحميلها في أي وقت.
بدلاً من إعادة تحميل مجموعة TriggerAction من خلال عميل الويب، نحاول تحقيق ذلك باستخدام عميل CLI.
دعنا نلقي نظرة سريعة على شاشة المساعدة للأمر الفرعي `template deploy`:```
root@kali:~# P4wnP1_cli template deploy -h
Deploy given gadget settings
Usage:
P4wnP1_cli template deploy [flags]
Flags:
-b, --bluetooth string Deploy Bluetooth template
-f, --full string Deploy full settings template
-h, --help help for deploy
-n, --network string Deploy network settings template
-t, --trigger-actions string Deploy trigger action template
-u, --usb string Deploy USB settings template
-w, --wifi string Deploy WiFi settings templates
Global Flags:
--host string The host with the listening P4wnP1 RPC server (default "localhost")
--port string The port on which the P4wnP1 RPC server is listening (default "50051")
تظهر شاشة الاستخدام أنه يمكن نشر قوالب TriggerAction باستخدام العلم -t. نقوم بتشغيل الأمر التالي لاستعادة مجموعة TriggerAction المخزنة:```
P4wnP1_cli template deploy -t tutorial1
تم الآن تحميل TriggerAction الذي يقوم بتشغيل HIDScript عند اتصال مضيف USB، ويجب أن يظهر في علامة التبويب TriggerActions في عميل الويب. في حالة توصيل P4wnP1 A.L.O.A. بمضيف USB، يجب أن يعمل البرنامج النصي مرة أخرى.
يعد تخزين وتحميل ونشر القوالب أحد المفهومين الرئيسيين لسير عمل الأتمتة في P4wnP1، والمفهوم الآخر هو TriggerActions المعروفة بالفعل. يجدر بالذكر أنه ليس فقط مجموعات TriggerAction يمكن تخزينها وتحميلها كقوالب بحد ذاتها، بل يمكن استخدام TriggerActions لنشر القوالب المخزنة بالفعل، إذا كان ذلك منطقيًا.
بالعودة إلى مهامنا، يبدو أن جميع المتطلبات المحددة قد تحققت الآن:
- كتبنا "Hello world" في محرر مضيف Windows USB
- تم فتح المحرر بواسطة P4wnP1، وليس يدويًا من قبل المستخدم
- يتم إغلاق المحرر تلقائيًا عند تبديل أحد مصابيح لوحة المفاتيح مرة واحدة
- في كل مرة يتم فيها توصيل P4wnP1 بمضيف USB، يتكرر هذا السلوك
- يعمل HIDScript مرة واحدة فقط، ما لم يتم إعادة توصيل P4wnP1 بمضيف USB، حتى في حالة حدوث تغييرات متتالية في مصابيح لوحة المفاتيح
- إذا تم إعادة تشغيل P4wnP1، يمكن استعادة نفس السلوك عن طريق تحميل مجموعة TriggerAction المخزنة (والتي تشير مرة أخرى إلى HIDScript المخزن). يمكن تحقيق ذلك إما بأمر CLI واحد أو بعملية "load&add" أو "load&replace" بسيطة من علامة تبويب Trigger Action في عميل الويب.
مرة أخرى، دعنا نضيف أهدافًا إضافية:
- يجب التأكد من أن تكوين USB يحتوي على وظيفة لوحة المفاتيح ممكّنة (الإعداد الحالي لا يفعل ذلك ولن يتمكن TriggerAction من بدء HIDScript في حالة تعطيل لوحة مفاتيح USB)
- يجب تطبيق الإعداد الذي تم إنشاؤه عند بدء تشغيل P4wnP1 A.L.O.A.، دون الحاجة إلى تحميل مجموعة TriggerAction يدويًا. يجب أن يتحمل الإعداد إعادة تشغيل P4wnP1.
لتحقيق الهدفين الإضافيين، علينا التعمق في موضوع جديد و...
#### تقديم القوالب الرئيسية (Master Templates) وقالب بدء التشغيل الرئيسي (Startup Master Template)
قبل أن ننظر إلى القوالب الرئيسية، سنقوم بشيء لم نفعله بعد، لأن كل شيء كان يعمل كما هو مقصود حتى الآن: نحدد تكوين USB صالحًا يتوافق مع مهمتنا!
- الرقم التسلسلي للجهاز: 123456789
- اسم منتج الجهاز: Auto Writer
- الشركة المصنعة للجهاز: The Creator
- معرف المنتج: 0x9876
- معرف البائع: 0x1D6B
- وظائف USB الممكّنة
- لوحة مفاتيح HID
- ماوس HID
دعنا نلقي نظرة على شاشة الاستخدام الخاصة بأمر CLI، الذي يمكن استخدامه لنشر هذه الإعدادات، أولاً:```
root@kali:~# P4wnP1_cli usb set -h
set USB Gadget settings
Usage:
P4wnP1_cli usb set [flags]
Flags:
-e, --cdc-ecm Use the CDC ECM gadget function
-n, --disable If this flag is set, the gadget stays inactive after deployment (not bound to UDC)
-h, --help help for set
-k, --hid-keyboard Use the HID KEYBOARD gadget function
-m, --hid-mouse Use the HID MOUSE gadget function
-g, --hid-raw Use the HID RAW gadget function
-f, --manufacturer string Manufacturer string (default "MaMe82")
-p, --pid string Product ID (format '0x1347') (default "0x1347")
-o, --product string Product name string (default "P4wnP1 by MaMe82")
-r, --rndis Use the RNDIS gadget function
-s, --serial Use the SERIAL gadget function
-x, --sn string Serial number (alpha numeric) (default "deadbeef1337")
-u, --ums Use the USB Mass Storage gadget function
--ums-cdrom If this flag is set, UMS emulates a CD-Rom instead of a flashdrive (ignored, if UMS disabled)
--ums-file string Path to the image or block device backing UMS (ignored, if UMS disabled)
-v, --vid string Vendor ID (format '0x1d6b') (default "0x1d6b")
Global Flags:
--host string The host with the listening P4wnP1 RPC server (default "localhost")
--json Output results as JSON if applicable
--port string The port on which the P4wnP1 RPC server is listening (default "50051")
يحتوي الأمر على مجموعة من العلامات، ولكن هناك أيضًا مجموعة من إعدادات USB القابلة للتغيير. يمكن نشر إعداد USB المحدد لدينا بهذه الطريقة، باستخدام واجهة سطر الأوامر:``` root@kali:~# P4wnP1_cli usb set \
--sn 123456789
--product "Auto Writer"
--manufacturer "The Creator"
--pid "0x9876"
--vid "0x1d6b"
--hid-keyboard
--hid-mouse Successfully deployed USB gadget settings Enabled: true Product: Auto Writer Manufacturer: The Creator Serialnumber: 123456789 PID: 0x9876 VID: 0x1d6b
Functions: RNDIS: false CDC ECM: false Serial: false HID Mouse: true HID Keyboard: true HID Generic: false Mass Storage: false
إخراج الأمر (الطويل) يعرض إعدادات USB الناتجة. دعنا نتحقق من علامة التبويب "إعدادات USB" في عميل الويب للتأكد من تطبيقها. يجب أن تنعكس جميع التغييرات، إذا لم يحدث خطأ ما.
على الرغم من أنه من الممكن تمامًا نشر إعداد USB باستخدام CLI، إلا أن هناك عدة فوائد لاستخدام عميل الويب بدلاً من CLI. في هذه الحالة:
- تغيير الإعدادات من عميل الويب أسهل وأكثر ملاءمة
- يحتفظ عميل الويب بحالة إعدادات داخلية، وهذا يسمح بتعريف إعدادات USB دون نشرها فعليًا (بينما يمكن لـ CLI، من ناحية أخرى، التعامل مع الإعدادات فقط عن طريق نشرها. وهذا، بدوره، يعيد تعيين رصة USB الكاملة لـ P4wnP1 وجميع الوظائف التابعة. على سبيل المثال، سيتم مقاطعة HIDScript الجاري تشغيله بالفعل، أو سيتم إعادة نشر واجهات شبكة USB)
- يمكن حفظ الإعدادات الحالية لعميل الويب في قالب دائم، دون نشرها مسبقًا
- عميل CLI، (حاليًا) غير قادر على تخزين إعدادات USB
في حالتنا الحالية، من الواضح أنه من الأفضل استخدام عميل الويب لإجراء التغييرات المطلوبة على إعدادات USB. الشيء الجيد في نهج CLI (الذي استخدمناه هنا): بما أن CLI أجبرنا على نشر إعدادات USB، فقد تمكنا من تأكيد أنها تعمل، قبل تخزينها في قالب دائم.
لننتقل إلى تخزين إعدادات USB:
مرة أخرى نضغط على زر "تخزين"، هذه المرة في علامة التبويب "إعدادات USB". مرة أخرى نسمي القالب `tutorial1` (لا يوجد تعارض مع قالب TriggerAction المخزن تحت نفس الاسم، لأن مساحة اسم مختلفة تُستخدم لإعدادات USB).
لدينا الآن قالبان جديدان ومخزنان بشكل دائم::
1) قالب لمجموعة TriggerAction، اسمه `tutorial1`
2) قالب لإعدادات USB، اسمه أيضًا `tutorial1`
بافتراض أن الحالة (لإعدادات USB الحالية، أو TriggerActions، أو كليهما) تغيرت بطريقة ما، يمكننا إعادة تحميل كلا الإعدادين المخزنين مرة واحدة، عن طريق إصدار أمر CLI التالي:```
P4wnP1_cli template deploy --usb tutorial1 --trigger-actions tutorial1
الأمر P4wnP1 template deploy يمكنه تحميل قالب لكل نظام فرعي من أنظمة P4wnP1 A.L.O.A. في تشغيل واحد (بالنسبة للنظام الفرعي للشبكة، يمكن تحميل قوالب متعددة، واحد لكل محول). يعتبر نشر القوالب للأنظمة الفرعية المختلفة مهمة شائعة أثناء العمل مع P4wnP1 A.L.O.A.، لأنه في معظم الحالات يجب إعادة تكوين عدة أنظمة فرعية لتحقيق هدف واحد. لمراعاة ذلك، تم تقديم ما يسمى القوالب الرئيسية (Master Templates).
يمكن أن يتكون القالب الرئيسي من:
يمكن تعريف قالب رئيسي أو تخزينه أو تحميله باستخدام "محرر القوالب الرئيسية (Master Template Editor)" من علامة التبويب "الإعدادات العامة (Generic Settings)" في واجهة الويب. استخدام واجهة الويب هو وسيلة مريحة لتعريف القوالب الرئيسية، حيث أنها تدعمك من خلال السماح فقط باختيار القوالب التي تم تخزينها بالفعل للأنظمة الفرعية المعنية (وحاليًا واجهة الويب هي الطريقة الوحيدة لتعريف القوالب الرئيسية).
لذا دعنا نحدد قالبًا رئيسيًا لمهمتنا الحالية:
tutorial1 وقم بالتأكيد باستخدام زر "موافق (OK)"tutorial1 (وهو قالب مختلف للنظام الفرعي لـ USB، على الرغم من أنه يشارك الاسم مع قالب إجراءات الزناد)tutorial1لتأكيد تخزين القالب، يمكنك استخدام زر "تحميل المخزّن (Load Stored)" - يجب إدراج القالب في الاختيار. قم بإلغاء حوار "تحميل المخزّن" مرة أخرى.
الآن اضغط على زر "نشر المخزّن (Deploy Stored)"، واختر القالب المسمى startup وقم بالتأكيد باستخدام "موافق".
على عكس وظيفة "تحميل المخزّن" التي تقوم بتحميل قالب مخزّن إلى محرر القوالب الرئيسية، فإن وظيفة "نشر المخزّن" تقوم بتطبيق جميع إعدادات القالب الرئيسي على الأنظمة الفرعية المقابلة لـ P4wnP1 فورًا (دون حتى تحميلها إلى محرر القوالب الرئيسية).
نظرًا لأن القالب الرئيسي startup يستبدل إعدادات WiFi الحالية، فقد يحدث أن تفقد الاتصال بواجهة الويب وتحتاج إلى إعادة الاتصال بشبكة P4wnP1 WiFi.
بمجرد إعادة الاتصال بنجاح وفحص إعدادات USB الحالية وإجراءات الزناد الحالية، ستلاحظ أن الإعدادات التي قمنا بتخزينها سابقًا قد تم استبدالها بالإعدادات الفرعية للقالب الرئيسي startup.
هناك طريقتان لنشر القالب الرئيسي tutorial1 مرة أخرى:
startup منذ دقيقة)P4wnP1_cli template deploy --full tutorial1 (العلم --full هو اسم مستعار للقالب الرئيسي)بقدرتنا على نشر القالب الرئيسي tutorial1، حققنا بالفعل أحد أهدافنا الجديدة:
من المؤكد أن تكوين USB يحتوي على وظيفة لوحة المفاتيح مفعلة عند تحميل إعدادات حقن ضغطات المفاتيح الخاصة بنا.
ملخص سريع لكيفية عمل ذلك:
tutorial1 يقوم بتحميل إعدادات USB، المسماة tutorial1 والتي تحتوي على
tutorial1 يقوم بتحميل مجموعة إجراءات زناد تحتوي على إجراء زناد واحد
tutorial1.js في كل مرة يتم فيها توصيل P4wnP1 بجهاز مضيف USB
waitLED (جاهزية برنامج تشغيل لوحة المفاتيح) وينتهي بعد تغيير LED متتاليالهدف المتبقي الوحيد هو التالي: يجب تطبيق الإعداد الذي تم إنشاؤه عند تشغيل P4wnP1 A.L.O.A.، دون الحاجة إلى تحميل مجموعة إجراءات الزناد يدويًا. يجب أن يظل الإعداد ساريًا بعد إعادة تشغيل P4wnP1.
يمكن تحقيق هذا الهدف بسهولة الآن. تعرض علامة التبويب "الإعدادات العامة" في واجهة الويب بطاقة تسمى القالب الرئيسي للتشغيل (Startup Master Template). تغيير القالب الرئيسي للتشغيل إلى tutorial1 في هذه المرحلة سيكون له تأثير فوري ومن المحتمل أن يدمر تكوين التشغيل الحالي لـ P4wnP1 A.L.O.A..
هام: إذا ترك القالب الرئيسي قوالب فرعية فارغة (على سبيل المثال، إذا لم يتم تحديد قالب Bluetooth)، فلن يتم إعادة تكوين النظام الفرعي المعني عند تحميل القالب الرئيسي. بينما يكون هذا مفيدًا في إعادة التكوين أثناء التشغيل دون إعادة تعيين الأنظمة الفرعية العاملة مثل مكدس USB أو مكدس WiFi إذا لم تكن هناك حاجة، فإن القوالب الرئيسية المستخدمة كقالب رئيسي للتشغيل تترك الأنظمة الفرعية بدون قوالب محددة في حالة غير محددة (UNDEFINED STATE). إذا، على سبيل المثال، لم يتم توفير قالب WiFi صالح، فمن غير المحتمل أن يكون P4wnP1 A.L.O.A. قابلاً للوصول عبر WiFi بعد إعادة التشغيل
لذا قبل نشر القالب الرئيسي الجديد tutorial1 كقالب رئيسي للتشغيل، نتأكد من تحميل الإعدادات المناسبة للنظام الفرعي الآخر. نقوم بذلك على النحو التالي:
tutorial1 إلى المحرر.tutorial1 مضبوطًا لـ "قالب إجراءات الزناد" و"قالب USB"startupstartupbteth_startupusbeth_startupwlan0_startup_dhcp_servertutorial1 بالإعدادات الجديدة (اضغط على "تخزين"، أدخل tutorial1 ثم قم بالتأكيد باستخدام "موافق")tutorial1. يجب أن تبدو جميع الأقسام الفرعية للقالب الرئيسي المحمول كما هو موصوف هنا.الآن نحن جاهزون لنشر قالبنا الرئيسي الجديد كقالب رئيسي للتشغيل. بعد القيام بذلك، نضغط على زر "إعادة التشغيل (reboot)".
بمجرد إعادة التشغيل، يجب أن يقوم P4wnP1 A.L.O.A. بتشغيل سكريبت HID تلقائيًا (ويجب أن يظل قابلاً للوصول عبر WiFi، للسماح بإعادة التكوين).
تهانينا، تم تحقيق جميع الأهداف
لقد تعلمت عن مفاهيم سير العمل الأساسية جدًا لـ P4wnP1 A.L.O.A.
ليس من الممكن حاليًا تقديم وثائق كاملة. لذا إليك بعض التعليقات حول مواضيع لم يتم التطرق إليها بعد، ولكنها تستحق الاستكشاف.
يسمح P4wnP1 بتشغيل سكريبتات Bash من إجراءات الزناد. السكريبتات القابلة للاستخدام من إجراءات الزناد موجودة في /usr/local/P4wnP1/scripts. إذا تم استدعاء سكريبت من إجراء زناد، يتم تمرير عدة وسائط (مثل المشغل الفعلي) عبر متغيرات bash. يوفر الملف /usr/local/P4wnP1/scripts/trigger-aware.sh مثالاً جيدًا على سكريبت bash يتصرف بشكل مختلف اعتمادًا على مشغل الاستدعاء. يجدر النظر إلى هذا السكريبت، حيث يستخدم جميع "متغيرات إجراء الزناد" المتاحة حاليًا.
مجتمع الإصدار القديم من P4wnP1 كان يطرح أحيانًا تعديلات أجهزة أو إضافات لـ Raspberry PI والسؤال عن كيفية دمجها. ليس من الممكن بالنسبة لي تقديم حل عام لهذه المشكلة. كما أنه ليست فكرة جيدة تقديم دعم لإضافة أجهزة محددة جدًا، يستخدمها فقط عدد قليل من الأشخاص. مع إدخال إجراءات الزناد، جاءت فكرة دعم GPIO كمشغلات عبر إدخال GPIO وإجراءات تصدر مخرجات GPIO. على الرغم من عدم التخطيط لهذا الإصدار الأول، إلا أن هذه الميزة تم تنفيذها بالفعل. ما زلت لم أجد الوقت لتوثيقها وقد يحدث بسهولة أن تتغير بعض الأمور. تستخدم الوظيفة مكتبة "periph.io" مع بعض الإضافات البسيطة (كشف الحواف المخصص مع إزالة التردد المخصص لـ GPIO، بفضل @marcaruel للتبادل حول هذا الموضوع)
تم تعديل برنامج WiFi الثابت المضمن مع P4wnP1 A.L.O.A. (باستخدام إطار عمل nexmon) لدعم KARMA. لم يتم تضمين هذه الميزة في النواة حتى الآن (تحتاج إلى بعض إعادة العمل من جانب البرنامج الثابت) وبالتالي فهي غير متاحة من واجهة الويب أو CLI. إذا كنت ترغب في التجربة مع ميزات karma، فهناك CLI بايثون قديم يسمح بتعيين خيارات KARMA أثناء التشغيل. يمكن العثور على سكريبت بايثون هنا:
/usr/local/P4wnP1/legacy/karmatool.py
نصيحة: للحصول على أقصى استفادة من وظيفة KARMA، يجب عليك إعداد P4wnP1 A.L.O.A. لتوفير نقطة وصول WiFi بدون مصادقة، وإلا فلن يكون ذلك منطقيًا. بالنسبة لإغراق الإشارات (beacon flooding) الضعيف، هذا غير مطلوب، ولكن أسماء SSID المخصصة (الثابتة) للإشارات محدودة في عددها (لتوفير الموارد على شريحة WiFi)
RePo: https://github.com/mame82/P4wnP1_nexmon_additions Creds to: seemoo-lab for "NEXMON" project
A hostapd based Access Point should be up and running, when using this tool (see the README for details).
Usage: python karmatool.py [Arguments]
Arguments: -h Print this help screen -i Interactive mode -d Load default configuration (KARMA on, KARMA beaconing off, beaconing for 13 common SSIDs on, custom SSIDs never expire) -c Print current KARMA firmware configuration -p 0/1 Disable/Enable KARMA probe responses -a 0/1 Disable/Enable KARMA association responses -k 0/1 Disable/Enable KARMA association responses and probe responses (overrides -p and -a) -b 0/1 Disable/Enable KARMA beaconing (broadcasts up to 20 SSIDs spotted in probe requests as beacon) -s 0/1 Disable/Enable custom SSID beaconing (broadcasts up to 20 SSIDs which have been added by the user with '--addssid=' when enabled) --addssid="test" Add SSID "test" to custom SSID list (max 20 SSIDs) --remssid="test" Remove SSID "test" from custom SSID list --clearssids Clear list of custom SSIDs --clearkarma Clear list of karma SSIDs (only influences beaconing, not probes) --autoremkarma=600 Auto remove KARMA SSIDs from beaconing list after sending 600 beacons without receiving an association (about 60 seconds, 0 = beacon forever) --autoremcustom=3000 Auto remove custom SSIDs from beaconing list after sending 3000 beacons without receiving an association (about 5 minutes, 0 = beacon forever)
Example: python karmatool.py -k 1 -b 0 Enables KARMA (probe and association responses) But sends no beacons for SSIDs from received probes python karmatool.py -k 1 -b 0 Enables KARMA (probe and association responses) and sends beacons for SSIDs from received probes (max 20 SSIDs, if autoremove isn't enabled)
python karmatool.py --addssid="test 1" --addssid="test 2" -s 1 Add SSID "test 1" and "test 2" and enable beaconing for custom SSIDs
### قناة الواي فاي الخفية
لم يتم نقل قناة الواي فاي الخفية إلى لغة Go، وهي ليست جزءًا من نواة P4wnP1. على أي حال، يتم توفير الوظائف القديمة.
لتشغيل القناة الخفية، يجب استيفاء عدة شروط:
- يجب تطبيق حقن ضغطات المفاتيح على العميل الهدف لحقن المرحلة الأولى (stage1)
- تقوم المرحلة الأولى بتحميل المرحلة الثانية (stage2) عبر نسخة مبسطة من القناة الخفية HID، لذا يجب توفير جهاز USB HID خاص
ويجب تشغيل خادم قناة HID خفية خاص على P4wnP1، لتوفير المرحلة الثانية
- يجب تشغيل خادم ثاني والتفاعل مع برامج الواي فاي المعدلة، لإدارة اتصال العميل
عبر قناة الواي فاي الخفية وتوفير وصول شل تفاعلي لهؤلاء العملاء (الخادم هو تطبيق وحدة تحكم
مصمم للتشغيل في مُضاعِف طرفية، مثل `screen`)
يمكن تحقيق جميع الشروط المذكورة أعلاه باستخدام مجموعة ميزات P4wnP1 A.L.O.A.، إذا تم توفير المكونات اللازمة
(مُجَهِّز HID، خادم قناة الواي فاي الخفية، وكيل العميل المُوَصَّل).
يعد تنفيذ مثل هذه المهمة باستخدام P4wnP1 A.L.O.A. مثالاً رائعًا على قدراتها. بالإضافة إلى ذلك، يساعد في
التمييز بين ما يُقصد به P4wnP1 A.L.O.A. وما لا يُقصد به.
P4wnP1 A.L.O.A. ليس مخصصًا لـ:
- أن يكون أداة "مسلحة"
- توفير حمولات RTR، يمكن لأي شخص تنفيذها دون فهم ما يحدث أو المخاطر
التي تنطوي عليها
P4wnP1 A.L.O.A. مخصص لـ:
- أن يكون منصة مرنة ومنخفضة التكلفة بحجم الجيب
- العمل كمُمَكِّن لمهام مثل تلك الموصوفة هنا
- دعم النمذجة الأولية والاختبار وتنفيذ جميع أنواع المهام المتعلقة بـ USB، المستخدمة بشكل شائع أثناء اختبار الاختراق أو
مهام الفرق الحمراء، دون تقديم حل ثابت نهائي
بمعنى ما، يحتوي مجلد `/usr/local/P4wnP1/legacy` على الأدوات الخارجية اللازمة لتشغيل قناة الواي فاي الخفية
(أي خادم الواي فاي، وخادم مجهز القناة الخفية HID، ووكيل عميل قناة الواي فاي الخفية). يمكن اعتبار هذه
المكونات كأجزاء خارجية (لا تنتمي إلى نواة P4wnP1 A.L.O.A.).
بالإضافة إلى ذلك، يوفر P4wnP1 A.L.O.A. تكوينًا يستخدم المكونات المعطاة للقيام بما يلي:
- هجوم الدخول السريع ضد مضيفات Windows لتوصيل كود العميل في الذاكرة لتنزيل المرحلة الثانية عبر القناة الخفية HID،
بناءً على حقن ضغطات المفاتيح (HIDScript)
- بدء حقن ضغطات المفاتيح بمجرد اتصال P4wnP1 بمضيف USB (TriggerAction يُصدر HIDScript)
- تشغيل المُجَهِّز الذي يُوصِّل وكيل عميل قناة الواي فاي الخفية عبر القناة الخفية HID، بمجرد
بدء حقن ضغطات المفاتيح (TriggerAction يُشغِّل سكربت باش، والذي بدوره يُشغِّل الخادم الخارجي)
- تشغيل خادم قناة الواي فاي الخفية عند الحاجة (نفس TriggerAction و BashScript)
- نشر إعداد USB يوفر لوحة مفاتيح USB (للسماح بحقن ضغطات المفاتيح) وجهاز HID خام إضافي
(يعمل كقناة خفية لتوصيل المرحلة الثانية) - يتم تخزين إعدادات USB في قالب إعدادات
- نشر إعداد واي فاي يسمح بالوصول عن بُعد إلى P4wnP1، للسماح بالتفاعل مع واجهة سطر الأوامر الأمامية لـ
خادم قناة الواي فاي الخفية - يتم تخزين إعدادات الواي فاي في قالب إعدادات
- توفير نقطة دخول واحدة لنشر جميع التكوينات اللازمة مرة واحدة (يتم ذلك بواسطة قالب رئيسي، يتكون
من إعدادات واي فاي مناسبة، وإعدادات USB مناسبة، و TriggerActions اللازمة لبدء HIDScript)
يسمى القالب الرئيسي "قناة الواي فاي الخفية". من خلال نشره من علامة تبويب "الإعدادات العامة" لعميل الويب
("نشر المخزن" من محرر القالب الرئيسي) يتم تكوين P4wnP1 A.L.O.A. لتنفيذ جميع الخطوات الموضحة.
بمجرد إعادة توصيله بمضيف USB، يجب أن يبدأ في كتابة المرحلة الأولى ويتم تشغيل الخوادم المقابلة داخليًا.
من جلسة SSH (على سبيل المثال عبر الواي فاي) يمكن الوصول إلى خادم قناة الواي فاي الخفية باستخدام `screen -d -r wifi_c2`
للتفاعل مع العملاء الذين اتصلوا مرة أخرى عبر قناة الواي فاي الخفية.
نظرًا لأن حقن ضغطات المفاتيح يعتمد على تخطيط لغة المضيف USB، فإن HIDScript المقابل المسمى
`wifi_covert_channel.js` له متغير `language` يمكن استخدامه لضبط تخطيط لوحة المفاتيد المستخدم.
بالإضافة إلى ذلك، يوجد متغير يسمى `hide` (خطأ افتراضيًا). إذا تم تعيين `hide` على true، فسيتم إخفاء نافذة وحدة التحكم على
العميل أثناء كتابة المرحلة الأولى. وهذا مرة أخرى يوضح كيف يمكن اختزال المهام المعقدة إلى متغير منطقي بسيط،
بفضل HIDScript ومحرك JavaScript الداعم.
يمكن استخدام العرض التوضيحي "قناة الواي فاي الخفية" المقدم مع القوالب الرئيسية لـ P4wnP1 كقالب رئيسي للبدء، أيضًا، نظرًا لأن
الوصول إلى الواي فاي لا يزال ممكنًا وبالتالي يمكن تغيير الإعداد مرة أخرى عن بُعد في أي وقت.
يعتبر BashScript المعني، الذي يتم استدعاؤه من TriggerAction، مثالًا جيدًا على مدى مرونة عميل سطر الأوامر.
نظرًا لأن مُجَهِّز HID يحتاج إلى معرفة ملف الجهاز الذي يجب الاستماع إليه (الذي يمثل جهاز HID العام)، ولكن
هذه المعلومات متاحة فقط في وقت التشغيل (تعتمد على وظائف USB المُفعَّلة)، فإن السكربت يطلب من سطر الأوامر
الإبلاغ عن جهاز HID الصحيح عن طريق تشغيل `hidraw=$(P4wnP1_cli usb get device raw)`.
يتم استضافة BashScript الكامل في المجلد `/usr/local/P4wnP1/scripts`، مثل جميع سكربتات bash التي يجب أن تكون قابلة للوصول
من TriggerActions.
### Bluetooth NAP
يوفر P4wnP1 وظائف شبكة قائمة على البلوتوث عبر بروتوكول تغليف شبكة البلوتوث (BNEP).
الميزة الأكثر إثارة للاهتمام حاليًا هي نقطة الوصول إلى شبكة البلوتوث (NAP)، والتي تسمح بالوصول عن بُعد عبر IP عبر البلوتوث
إلى P4wnP1، على سبيل المثال من الأجهزة المحمولة.
لاستخدام هذه الميزة، يجب معرفة بعض الأمور:
- يمكن تكوين واجهة شبكة البلوتوث، المسماة `bteth` وتصميمها كقالب مثل واجهات الشبكة الأخرى
(عميل الويب أو سطر الأوامر)
- للسماح بالوصول عبر NAP من جهاز Android محمول (iPhone لم يتم اختباره)، لا يحتاج الجهاز المحمول إلى الاتصال فحسب، بل
بالإضافة إلى ذلك، يجب على P4wnP1 توزيع IP مناسب للبوابة الافتراضية على واجهة `bteth` عبر DHCP. وذلك
لأن الجهاز المحمول يريد استخدام NAP كبوابة إلى الإنترنت (وهو الاستخدام المقصود). إذا لم يوفر NAP نفسه
بوابة، فإن جهاز Android المحمول لن يقوم بأي طلبات أخرى بعد DHCP D.O.R.A. أسهل طريقة
لتجاوز ذلك هي توجيه خادم DHCP لتوفير IP لواجهة `bteth` نفسها كبوابة افتراضية
(خيار DHCP رقم 3). حتى في حالة عدم وجود اتصال صاعد حقيقي، نجح هذا أثناء اختباراتي - حيث يجب على الجهاز المحمول الوصول
إلى البوابة من خلال اتصال الطبقة الثالثة من أجل "الاتصال بالمنزل". حتى إذا فشلت اختبارات الاتصال المتتالية، فإن اتصال
الطبقة الثالثة العامل يستمر. وهذا يسمح، على سبيل المثال، بالوصول عبر SSH عبر البلوتوث. مع تمكين "السرعة العالية"، فإن
عميل الويب يعمل بشكل جيد أيضًا.
- للسماح بالاقتران القائم على رقم التعريف الشخصي (PIN)، يجب تعطيل الاقتران البسيط الآمن (SSP). إذا تم تمكين SSP، فإن
وكيل الاقتران الجاري يؤكد كل رمز مرور (مما يعني أمانًا أقل من الاقتران القديم برقم التعريف الشخصي، حيث يمكن لأي جهاز
الاتصال). ربما سيتم تنفيذ مربع حوار تأكيد للاقتران القائم على رمز مرور SSP لسطر الأوامر/عميل الويب
في المستقبل، ولكن حاليًا هذا خارج النطاق. أقترح بشدة تعطيل "قابل للاكتشاف" و"قابل للاقتران" إذا كان SSP قيد
الاستخدام، بمجرد أن يقترن الجهاز المقصود.
- عيب آخر لتعطيل SSP هو أن "السرعة العالية" لن تكون قابلة للاستخدام لاتصالات البلوتوث (أو
لتمكين السرعة العالية، يجب أن يتم الاقتران باستخدام SSP). بدون تمكين "السرعة العالية" (يستخدم إطارات 802.11 للاتصال)
سيستغرق طلب عميل الويب حوالي 10 دقائق، بينما مع تمكين السرعة العالية يستغرق بضع ثوانٍ.
ومع ذلك، يجب أن يكون استخدام SSH وعميل سطر الأوامر عبر NAP بدون "السرعة العالية" جيدًا.
- يجب أن تسمح إعدادات واجهة شبكة البلوتوث الافتراضية (`bteth_startup`) وإعدادات البلوتوث الافتراضية (`startup`)
بالوصول "منخفض السرعة" عبر SSH مع الاقتران القديم برقم التعريف الشخصي. رقم التعريف الشخصي هو `1337` ويمكن تغييره من
عميل الويب.
### مجموعات TriggerAction
تأتي TriggerActions مع قدرة توجيه لطيفة تسمى "المجموعات". لم أتمكن من ابتكار عرض توضيحي للميزة
في الوقت المناسب، لكنني أخطط لتضمين مثال لعداد ثنائي 4 بت قائم على LED (باستخدام GPIOs ومفتاح تبديل
و 4 LEDs).
فكرة المجموعات هي التالية:
ضع في اعتبارك أنك تريد أن يكون لديك 4 TriggerActions (TAs) تعمل على نفس المشغل بالضبط (على سبيل المثال "عند التوصيل بمضيف USB").
يمكنك تحقيق ذلك عن طريق إنشاء 4 TAs، كل منها بمشغل "عند التوصيل بمضيف USB".
بدلاً من ذلك، يمكنك إنشاء TriggerAction ترسل القيمة `1` إلى مجموعة باسم `"connected"` عندما يحدث
مشغل "عند التوصيل بمضيف USB". الآن تقوم بتعريف TriggerActions الأربعة الأخرى لتشتعل عندما يتم استلام القيمة `1` على
مجموعة باسم `"connected"`. ستكون النتيجة هي نفسها ولا معنى لها كثيرًا في الوقت الحالي (في الواقع تحتاج إلى
TriggerAction إضافية واحدة). التأثير الإيجابي الوحيد، في الوقت الحالي، هو أن TriggerActions تصبح أكثر قابلية للقراءة قليلاً، بفضل
اسم المجموعة، الذي يمكن اختياره بحرية.
الآن أول شيء متقدم يمكنك القيام به هو تشغيل أمر سطر الأوامر التالي:```
P4wnP1_cli trigger send --group-name=connected --group-value=1
هذا الأمر سيكون له نفس التأثير تمامًا مثل TriggerAction "عند الاتصال بجهاز USB مضيف" وكل 4 TriggerActions أخرى كانت تنتظر وصول القيمة 1 إلى المجموعة connected وسيتم تشغيلها. كما قد تتذكر، يمكن تشغيل عميل CLI عن بُعد (من منصات مختلفة)، لذا يمكن استخدامه لتشغيل الأوامر عن بُعد.
الـ Trigger الذي يتفاعل مع "قنوات المجموعة" يُسمى "قيمة على قناة مجموعة". الـ Trigger الأكثر إثارة للاهتمام يُسمى "قيم متعددة على قناة مجموعة". يسمح هذا الـ Trigger "القيم المتعددة" بالاستماع إلى تسلسلات مرتبة من القيم، أو قيمة واحدة من عدة قيم، أو كل القيم في تسلسل غير مرتب، قبل أن يتم تشغيله.
لنفترض أنك تريد تشغيل BashScript عند تحقق هذه الشروط:
يمكنك إنشاء TriggerActions لكلا الحدثين كما يلي:
الآن يمكنك نشر TriggerAction ثالثة كما يلي:
في هذا التكوين، لن يتم تشغيل script bash إلا إذا تم تشغيل كل من Trigger "الشرط".
إذا تم استخدام "تسلسل مرتب دقيق" بدلاً من "الكل (AND منطقي)" كنوع، فسيتم تشغيل script bash فقط إذا تم تشغيل WiFi AP قبل Trigger الاتصال USB (وليس العكس). بالاقتران مع مشغلات GPIO، يمكن استخدام هذا مثلاً لتشغيل إجراءات بناءً على إدخال من لوحة أرقام بسيطة.
أنا متأكد من أن لديك بعض الأفكار الجميلة لاستخدام قنوات "المجموعة".
يجدر بالذكر:
عميل CLI قادر على القيام بانتظار مانع (blocking wait) حتى وصول قيمة مخصصة على "قناة مجموعة"، باستخدام أمر مثل هذا:``` P4wnP1_cli trigger wait --group-name=waitgroup --group-value=1
يمكن استخدام هذا لتشغيل السكربتات من TriggerActions عبر CLI (باستخدام كامل إمكانياتها مثل GPIO).
قيد التطوير، أقسام مفقودة:
- HIDScript Trigger variables (المتغيرات المسلمة إلى HIDScripts التي يتم تشغيلها من TriggerActions)
- HIDScript helpers (دوال PowerShell)
- HIDScript demo snake (ماوس)
- USB Mass storage (أداة genimg المساعدة)
## 4. الإنقاذ: مساعدة، لا أستطيع الوصول إلى P4wnP1 A.L.O.A. لأنني أفسدت التكوين
لا يحميك P4wnP1 A.L.O.A. من سوء التكوين، مما يجعله غير قابل للاستخدام (كما أن وحدة التحكم الجذر لن تحميك من تشغيل `rm -rf /`).
في حال أفسدت كل شيء، إليك بعض الأفكار حول كيفية الإصلاح:
### النسخ الاحتياطي لقاعدة البيانات
قبل أن تقوم بتغييرات جوهرية على تكوين P4wnP1 الذي لا يزال يعمل، قم بإنشاء نسخة احتياطية لقاعدة البيانات. يمكن القيام بذلك إما من علامة التبويب "Generic Settings" في عميل الويب أو من CLI باستخدام الأمر `P4wnP1_cli db backup`.
سيتم تخزين النسخة الاحتياطية في المجلد `/usr/local/P4wnP1/db` تحت الاسم المختار.
يمكن استخدام وظيفة "restore" أو الأمر `P4wnP1_cli db restore` لاستعادة نسخة احتياطية معينة.
تحتوي النسخة الاحتياطية على جميع القوالب المخزنة (USB, WiFi, Network, Bluetooth, TriggerActions, MasterTemplates) وقالب بدء التشغيل المحدد. لا تتضمن النسخة الاحتياطية HIDScripts أو BashScripts، حيث يتم تخزين كلاهما كملفات لتسهيل التحرير.
### ليس لدي نسخة احتياطية وقد أفسدت كل شيء
عند بدء تشغيل P4wnP1 A.L.O.A.، يتحقق مما إذا كانت قاعدة البيانات موجودة. إذا لم تكن قاعدة البيانات موجودة، فإنه يملأ قاعدة بيانات جديدة بناءً على نسخة احتياطية أولية تأتي مع P4wnP1 A.L.O.A.
النسخة الاحتياطية الأولية مخزنة في `/usr/local/P4wnP1/db/init.db` **ويجب ألا يتم حذفها أو استبدالها أبدًا**.
لإجبار P4wnP1 على إعادة إنشاء قاعدة البيانات الفعلية، يجب حذفها. يمكن تحقيق ذلك عن طريق تركيب بطاقة SD الخاصة بـ P4wnP1 A.L.O.A. على نظام قادر على كتابة أقسام EXT.
بمجرد القيام بذلك، احذف المجلد `/usr/local/P4wnP1/store` من القسم الجذر لبطاقة SD. سيؤدي هذا إلى حذف قاعدة البيانات وبالتالي إجبار إعادة الإنشاء عند تشغيل P4wnP1 مرة أخرى.
### لدي نسخة احتياطية، لكن لا يمكنني الوصول إلى P4wnP1 لاستعادتها
إذا لم تتمكن من استعادة قاعدة بيانات موجودة بسبب عدم وجود وصول، فلا يزال بإمكانك اتباع الخطوات من "ليس لدي نسخة احتياطية وقد أفسدت كل شيء". بالإضافة إلى حذف `/usr/local/P4wnP1/store`، استبدل ملف `/usr/local/P4wnP1/db/init.db` بالملف من نسختك الاحتياطية (تأكد من وجود نسخة احتياطية من init.db).
يجب أن يؤدي هذا إلى إعادة إنشاء قاعدة البيانات المخصصة الخاصة بك بمجرد إعادة تشغيل P4wnP1.
### لقد أفسدت قالب بدء التشغيل الرئيسي لنسختي الاحتياطية
إذا كان لديك نسخة احتياطية لا يعمل فيها قالب بدء التشغيل الرئيسي، فيجب عليك القيام ببعض الخطوات الإضافية، حيث أنه من غير الممكن تغيير قالب بدء التشغيل مباشرة في نسخة احتياطية.
أولاً، اتبع الخطوات من "ليس لدي نسخة احتياطية وقد أفسدت كل شيء" التي تعيد إنشاء قاعدة بيانات P4wnP1 الأولية.
بعد إعادة تشغيل P4wnP1، يجب أن تكون قادرًا على الوصول عن بُعد إلى عميل الويب الخاص بـ P4wnP1 مرة أخرى.
انتقل إلى "Generic Settings" واستعد نسختك الاحتياطية الخاصة (تلك التي تحتوي على قالب بدء التشغيل الرئيسي الخاطئ).
يجب أن يظهر "Startup Master Template" القالب الرئيسي "المعطوب" الخاص بك كمحدد. إذا لم يكن الأمر كذلك، أعد تحميل علامة تبويب المتصفح التي تستضيف تطبيق عميل الويب.
مرة أخرى، انتقل إلى علامة التبويب "Generic Settings" وحدد قالب بدء تشغيل رئيسي معروف بأنه يعمل.
في هذه المرحلة، يجب أن تكون جاهزًا لإعادة التشغيل.
### لم يساعد أي مما سبق
عذرًا، يبدو أنه يجب عليك إعادة إنشاء بطاقة SD الخاصة بـ P4wnP1 A.L.O.A. من صورة نظيفة.
## 5. الإسناد
قيد الإنشاء، ترتيب عشوائي
- @JohanBrandhorst (تبادل وثيق حول gRPC-web عبر gopherjs، تنفيذ سريع بشكل مثير للسخرية لـ "websocket for server streaming"، طلب ميزة)
- @steevdave, @_binkybear (نصوص بناء كالي، نقاش مستمر)
- @Re4sonKernel (دعم في نقل تغييرات نواة P4wnP1 إلى مستودع مُصان جيدًا وشائع، تعاون في إصلاحات Bluez)
- @SymbianSyMoh (إلهام لإعادة تشغيل هجوم HID دون إعادة تشغيل)
- @quasarframework (يمكن إدراجه تحت مكتبات الطرف الثالث، لكن العمل المنجز هنا جنوني؛ الشكل والمظهر لعميل ويب P4wnP1 يعتمد إلى حد كبير على المكونات الافتراضية لهذه المكتبة الجميلة)
- @CyberArms (أحد أوائل الداعمين لـ P4wnP1، كاتب أفضل برنامج تعليمي وحتى كتب حول مواضيع كهذه)
- @LucaBongiorni (ليس فقط أحد أوائل الداعمين، بل يفعل في الأجهزة ما يمكنني فعله فقط في البرامج؛ يقدم محاضرات حول موضوع USB ويكرم حلول المصادر المفتوحة، بشكل عام شخص رائع ومصدر إلهام)
- @evilsocket (دفعني بلوكه نحو Go، مطور OSS عظيم، اقرأ شفرته وستعرف ما أعنيه)
- @RoganDawes و @Singe من @SensePost (أشخاص ملهمون)
- @Swiftb0y (داعم مبكر، منشئ "القديم" P4wnP1 WiKi، مختبر مبكر لأفكار على P4wnP1 A.L.O.A.)
- @marcaruel (نقاش حول اكتشاف حافة GPIO باستخدام periph.io)
## 6. المهام والدعم
هذه ليست قائمة مهام كاملة، لكن بعض المعالم لا تزال متبقية وسأكون سعيدًا بتلقي بعض الدعم المجتمعي بشأنها
- نقل وظيفة قناة HID الخفية بالكامل إلى نواة Go (أنا وحدي في هذا)
- **إضافة أمر تكوين Bluetooth لـ CLI**
- إنشاء تخطيطات لوحة مفاتيح إضافية (حاليًا يتم دعم br، de، es، fr، gb، it، ru و us)
- توسيع وظيفة Bluetooth للسماح بالاتصال بأجهزة أخرى قابلة للاكتشاف (المصادقة والثقة)
- نقل وظيفة WiFi KARMA من أداة Python مخصصة إلى نواة P4wnP1 (مع دعم عميل الويب)
- إنشاء وثائق كاملة لـ HIDScript (أساسًا جزء الماوس فقط مفقود)
- إنشاء وثائق كاملة لـ P4wnP1 (على أمل المجتمع)
- التخلص من اعتماد متبقي على netlink الخاص بـ docker (انظر README في مجلد `netlink`)
ملاحظة حول Bluetooth:
يعمل P4wnP1 مع روابط مخصصة لواجهة Bluez API. على الرغم من أن Bluez API يدعم الطاقة المنخفضة (GATT، محاكاة الأجهزة الطرفية إلخ.)، إلا أنه ليس من المخطط دمج هذه الوظيفة في P4wnP1 A.L.O.A.
ملاحظة حول Nexmon:
يستخدم P4wnP1 nexmon. يعرف معظم الناس nexmon كتعديل للبرامج الثابتة يسمح بتمكين وضع المراقبة وحقن الحزم لشرائح WiFi من Broadcom (بما في ذلك BCM43430a1، المستخدمة في Raspberry Pi Zero W). لكن nexmon هو أكثر من ذلك، فهو إطار يسمح بتعديل كتل البرامج الثابتة ARM (بعد القليل من الهندسة العكسية)، مع تصحيحات مكتوبة بلغة C عالية المستوى. يستخدم P4wnP1 هذا الإطار لتطبيق تصحيحات مخصصة على البرامج الثابتة WiFi، مما يتيح دعم KARMA القائم على الأجهزة بالإضافة إلى دعم البرامج الثابتة (وكذلك برنامج التشغيل) للقناة الخفية WiFi. ليس الغرض من هذه التعديلات توفير وضع مراقبة مناسب أو دعم حقن لواجهة WiFi المدمجة. على الرغم من أن وظيفة وضع المراقبة القديمة لـ nexmon مضمنة في البرامج الثابتة WiFi الحالية، إلا أنها تعتبر "خاطئة"، حيث أنها تتعارض مع وظائف WiFi القياسية المستخدمة بواسطة P4wnP1 (تتعطل إذا تم استخدام الواجهة في وضع المحطة إلخ.).
## 7. حقوق النشر
P4wnP1 A.L.O.A.
Copyright (C) 2018 Marcus Mengs
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.