كتابة برنامج كمبيوتر محمول للمتعة والربح ، أو كيفية الالتزام بالنواة حتى لو لم تكن ذكيًا

حيث بدأ كل شيء


لنبدأ ببيان مشكلتنا. لدينا 1 (واحد) كمبيوتر محمول. كمبيوتر محمول جديد للألعاب. مع بعض RGB- الخلفية على لوحة المفاتيح. يبدو مثل هذا:

صورة
الصورة مأخوذة من lenovo.com

هناك أيضًا برنامج مثبت على هذا الكمبيوتر المحمول. هذا هو الشيء الذي يتحكم في الإضاءة الخلفية لدينا.

مشكلة واحدة - يعمل البرنامج تحت نظام Windows ، ونريد أن يعمل كل شيء على نظام Linux المفضل لدينا. تريد وميض المصابيح وتلك الألوان الجميلة وميض وخارجها. يطرح سؤال طبيعي ، هل يمكننا أن نفعل كل ذلك دون الهندسة العكسية وكتابة برامج التشغيل الخاصة بنا؟

الجواب الطبيعي ينشأ ، لا. لنفتح المؤسسة الدولية للتنمية ونحصل على تصدع.



الخطوة 1 - حفر في الرمز


هناك ثلاثة مشغلات تجعل توهج الإضاءة الخلفية. من أجل تصاعد الصعوبة:

1. برنامج ألعاب برتقالي كبير يسمى Lenovo Nerve Center ، والذي يحتوي على قائمة إعداد برتقالي كبيرة لهذه الإضاءة الخلفية فقط.

2. مجموعة Hotkey Fn + Space - ربما تتم إدارتها بواسطة البرنامج المذكور أيضًا.

3. BIOS. أثناء تحميل الكمبيوتر المحمول ، تومض الإضاءة الخلفية باللون الأحمر للحظة وجيزة. ربما يمكننا استخدام ذلك؟

اضطررت لتجربة الكل 3. ولكن كان هناك بعض النجاح فقط على طول أول واحد ، لذلك دعونا نتحدث عن أول واحد هنا.

نفتح المجلد مع برنامجنا:

ملف

لاحظ هنا! هناك DLL مع اسم مثير للاهتمام للغاية - LedSettingsPlugin.dll. هل يمكن أن يكون ...؟ دعنا نفتحها في IDA Pro ونرى لأنفسنا.

اليمين نصف

انظر إلى النصف الأيمن من الشاشة هنا - لذا ، هناك الكثير من معلومات تصحيح الأخطاء! لنستخدمها تبدو بعض السلاسل مثل أسماء الوظائف هنا. انا اتساءل لماذا ...

اسم من بين وظائفها

أوه ، هذه هي أسماء الوظائف. ! مريحة دعونا ندعو بعض الأشياء بأسمائها الخاصة ثم نلقي نظرة على قائمة الوظائف مرة أخرى. لتسمية الأشياء في IDA ، يمكنك استخدام مفتاح الاختصار N ، أو انقر بزر الماوس الأيمن على الشيء الذي تريد تسميته.

setledstatusex

بالنظر إلى الوظائف ، نرى شيئًا يسمى Y720LedSetHelper :: SetLEDStatusEx. يشبه ما نحتاجه! إنها تشكل نوعًا من السلسلة ، ثم تعطيها إلى شيء يسمى CHidDevHelper :: HidRequestsByPath. الجزء المثير للاهتمام الذي يجب أن ننظر إليه هو var_38 ، أبرزته المؤسسة الدولية للتنمية بمودة.

Var_34 مثير للاهتمام أيضًا. يذهب مباشرة بعد var_38 - في تقاليد المجمّع ، يتم تخزين المتغيرات بترتيب عكسي تحت RSP. Var_34 في المؤسسة الدولية للتنمية هو مجرد اسم الثابت - -34 ساعة.

بدءًا من var_38 ، يضع برنامجنا صفرًا ثم نمطًا ولونًا والرقم الثالث والكتلة - جزءًا من لوحة المفاتيح التي ستكتسب هذا اللون. (في وقت لاحق ، ستظهر التجارب أن الرقم ثلاثة هو في الواقع السطوع. وإضافة عنصر تحكم في هذا الأمر سيجعل سائقنا أفضل من السائق الرسمي!)

الآن ، دعونا نلقي نظرة عميقة على HidRequestsByPath ونحاول معرفة ما نحتاج إلى إرساله وأين.

devhelper

انظر ، وظيفتين. HidD_GetFeature و HidD_SetFeature.

لا يتم تعقبها في الملف ... لكن يتم تتبعها بشكل جيد للغاية في وثائق Microsoft الرسمية - هنا وهنا .

حسنًا ، يمكننا أن نحارب أنفسنا الآن. هذا هو الحضيض ، لا يوجد مكان للحفر أعمق. يحتوي Linux على هاتين الوظيفتين - نعود فقط ، وندعوهم بنفس الحجج. صحيح؟

الخطوة 2 - إطلاق النموذج الأولي ...؟



ليس بالضبط دعنا نعود إلى Linux ونفتح lsusb. سنجد لوحة المفاتيح الخاصة بنا هناك ، وسنرسل إليها شيئًا ما.

lsusb

Integrated Technology Express، Inc. هو الأكثر إثارة للاهتمام هنا. لنستخدم الأداة / dev / hidraw الشائعة. يمكننا العثور على الشخص المناسب فقط من خلال النظر إلى المقابلة / sys / class / hidraw / hidraw * / device / uevent.

hidraw

هذا واحد. جميع الأرقام مطابقة - وهذا يعني / ديف / hidraw0 هو الجهاز لدينا. ولكن دعونا نحاول إرسال شيء ... ولا يحدث شيء! لماذا. في هذه المرحلة ، بدأ الإرهاق. ربما ليس فقط للبشر ، هذا الشيء الهندسة العكسية؟

ولكن دعونا نستمر في المحاولة. لو كان المؤلف أفضل في هذا ، لكان قد عكس Nerve Center أكثر من ذلك ويأتي بحل هكتار ... لكن ليس لدينا دماغ. دعنا نعيد تشغيل Windows ، هناك فكرة.

يوجد هذا الشيء في Windows - إدارة الأجهزة ، يطلقون عليه. لديه الكثير من الوظائف - لكننا مهتمون بواحدة. انها تسمح لك لتعطيل الأجهزة. بسيطة وموثوقة.

لذلك دعونا فقط تعطيل جميع الأجهزة حتى توقف الصمام لدينا يومض!

تعطيل الجهاز

هذا فعلها. إذا ألقينا نظرة خاطفة على معرف الجهاز الخاص به - فسنرى ما هو عليه ، جهاز LED الغامض.

لدينا جهاز

انظر - إنه هو.

dmesg

الجهاز الذي كان يزعج dmesg بلدي لعدة سنوات.

[لماذا لم تظهر في lsusb؟ انها ليست USB على الإطلاق ، بالطبع! تستخدم الإضاءة الخلفية بروتوكولًا يسمى I2C HID - يسمح للشركة المصنعة بإخفاء الجهاز عن أيدي الأشخاص الشريرين الذين يقومون بتثبيت أدوات HID على ناقل نظام الكمبيوتر نفسه.]

Sidestep 2.5 - دعنا نلتزم


هذا البحث عن الجهاز الصحيح قد اختصر بشدة. في الحكاية الأصلية ، اضطررت إلى فتح الإعداد الخاص بي تقريبًا وصولاً إلى النواة قبل أن أدرك لماذا لم ينجح شيء. أيضًا ، لم أستمتع بسجل dmesg الذي يظهر لي في كل مرة أقوم فيها بفتح جهاز الكمبيوتر الخاص بي. بما أننا هنا - لماذا لا نذهب ونكتب التزامًا قصيرًا؟

نحتاج إلى العثور على شيئين - المكان الذي يتم فيه التعامل مع أجهزة I2C HID ، والمكان الذي يتم تخزين المراوغات فيه. هنا. دعونا لا نفكر بشدة وننظر إلى الخطأ: تقرير غير مكتمل. لنجعلها كاملة.

سوء المدخلات وحجم

أضف طلبًا جديدًا ، دعنا نسميه I2C_HID_QUIRK_BAD_INPUT_SIZE أو شيء من هذا القبيل. للحفاظ على theming.

هوس

دعونا أيضًا نضيف جهازنا إلى قائمة المراوغات. ما قمنا به حتى الآن:

1. بحث عن "i2c hid linux kernel" في محرك البحث. تم النقر على النتيجة الرابعة في DuckDuckGo.

2. كتب ثلاث كلمات (!) باللغة الإنجليزية - BAD_INPUT_SIZE

3. أضيف واحد إلى BIT (4). النتيجة - BIT (5).

4. أضف رقمًا إلى hid-ids.h - معرف جهازنا (غير موضح ، لكنه مشابه في الصعوبة)

نحن المبرمجين ، لنقم ببعض البرمجة الآن.

انظر الخط:
ret_size = ihid->inbuf[0] | ihid->inbuf[1] << 8;

ثم تشتكي من أن إعادة الحجم ليس هو ما.

عندما يكون نشاطنا غريبًا ، فلنفعل ذلك ولكن إلى الوراء.

إذا شرط

إرسال التصحيح إلى القائمة البريدية ... (اختباره مسبقا!). أن نكون صادقين ، كان الدخول في تلك القائمة البريدية أصعب من التصحيح الفعلي. انها ليست بسيطة بأي وسيلة.

مستعمل

هذا كل شيء!

الخطوة 3 - سائق!


في هذه المرحلة تذكرت - كنت أحاول كتابة سائق. قررت أنني لن ألتزم بذلك حتى الآن - بدأت الأسئلة في الظهور ، في هذه المرحلة ، عليك حقًا أن تفكر في البعض. إذا كان أي شخص يقرأ هذا جيدًا في kernel ويستشيرني ، سأكون سعيدًا بالتحدث.

دعنا نفتح الثعبان. (اعتادت أن تكون باش ، لكنك غيرت رأيك بسرعة كبيرة مع هذا النوع من اللغة). لنستخدم الأداة / dev / hidraw الشائعة.

/ dev / hidraw0 ، / dev / hidraw1 - كيف تعمل هذه الملفات ، على أي حال؟ بالنسبة للإدخال / الإخراج البسيط ، يمكنك استخدامها مثل أي شيء آخر ، ويبدو أن هذا سيعمل فقط. و GetFeature و SetFeature - حسنًا ، هذه قصة مختلفة تمامًا.

أخبرني StackOverflow (أو أي شخص آخر ، لا يمكنني تذكره) أنه سيتعين عليّ النظر في شيء يسمى ioctl. إنها طريقة خاصة للعمل مع ملفات غير شائعة مثل أجهزة HID ، وأجهزة طرفية وأشياء مثيرة للاشمئزاز مماثلة.

يبدو الأمر بسيطًا على السطح - فأنت تعطيه مؤشرًا مفتوحًا للملفات (وليس على مستوى Python أو مستوى نظام التشغيل! اقرأ المزيد عن مقابض نظام التشغيل هنا إذا كنت تريد أن تعرف.) ، وبعض الأرقام ومخزن مؤقت - ثم يفعل ذلك شيء مع هذا العازلة ويعيدها لك. أنا لا أحاول أن أكون بارعًا هنا ، إنه يعتمد على التطبيق بالكامل تقريبًا. إليك مثال: 0xC0114806. ما هذا؟ هذا هو SetFeature. هذا ايضا

(6 << 29) | (ord('H') << 8) | (0x06 << 0) | (0x11 << 16).

أول 6 يعني أن الملف سيكون مفتوحًا للقراءة والكتابة. نكتب فقط ، لكن المستندات قالت 6 وهذا يعني أننا نضع 6. Ord ('H') تعني HID. في بعض الأحيان ، تعني هذه الأشياء أشياء أخرى ، اعتمادًا على الملف. ولكن الآن اختفت.

0x06 هو الأمر نفسه. الأمر السادس من HID هو SetFeature ، الذي نحتاجه. والجزء الأخير؟ حجم المخزن المؤقت.

كل ما تبقى هو تجميعها معًا في مكالمة ioctl ، وستحصل على سائق. إنه يعمل. .

الكلمة الأخيرة من المؤلف


آمل أن يكون المقال بمثابة قراءة ممتعة. حتى قراءة مفيدة ، ربما. تم حذف بعض الأجزاء أو اختصارها للإيجاز - قد يلاحظ قارئ أكثر ملاحظة أن برنامج التشغيل يمكنه قراءة الحالة الحالية للوحة المفاتيح وأن وظيفة set_status لها استدعاء ioctl ثانٍ لم يتم ذكره حتى في النص. يعد تطوير الأجهزة و Linux kernel من الأشياء الكبيرة ، ولن تغطي حكاية واحدة كل شيء. وفي نهاية المطاف ، ربما لا يكون المقال حول هذا الموضوع. ربما يتعلق الأمر بكيفية القيام بشيء صغير وجيد ، من أجل المصدر المفتوح أو لنفسك ، ليس بالأمر الصعب على الإطلاق. تحتاج فقط إلى العثور على أمسيات مجانية لمدة أسبوع ، وبعض الشاي ورغبة في التنقيب في الشفرة.

Source: https://habr.com/ru/post/ar484752/


All Articles