ثلاث قصص تسجيل ويندوز قصيرة

مساء الخير أيها القراء الأعزاء.

يعد التسجيل أحد أنظمة Windows الأكثر وضوحًا وأهمية. بالكاد يوجد شخص لم يسمع به. بعد أن كنت أبرمج تحت Windows لمدة 20 عامًا ، اعتقدت أنني أعرف كل شيء عنه. ولكن من وقت لآخر ، يظهر شيء جديد يوضح لي مدى خطئي. لذلك ، أود اليوم أن أخبرك عن الطرق غير المعتادة للعمل مع التسجيل التي التقيت بها أثناء البحث عن الجذور الخفية والتي فاجأتني.


القصة الأولى. أسماء قيم ومفاتيح التسجيل


نعلم جميعًا أنه توجد في Windows بعض القواعد لتسمية الكائنات ، سواء كانت ملفات أو أدلة أو مفاتيح تسجيل. لا يمكن أن تحتوي أسماء الملفات على الحرف "\". لا يمكن أن تكون الأسماء فارغة. تحتوي الأسماء على بعض القيود على الطول ، إلخ.

بشكل غير طوعي ، نوسع هذه القيود لجميع أنظمة Windows ونلاحظها عند العمل مع التسجيل. وهنا يكمن خطأنا. هناك قيود قليلة بشكل مدهش على التسجيل عند إنشاء الأسماء. على سبيل المثال ، باسم القيم ، يمكنك استخدام الحرف "\"


فوجئت؟ لا؟ ثم ماذا ستقول إذا أظهر لك أنه يمكن استخدام الرمز "\ 0" باسم قيمة؟ نعم ، نعم ، حرف فارغ تمامًا. الذي يستخدم تقليديا للإشارة إلى نهاية السطر.

لهذا ، نحن بحاجة إلى وظيفة NtSetValueKey المصدرة من ntdll.dll

HKEY hKey = 0; RegOpenKeyA( HKEY_LOCAL_MACHINE, "Software\\Microsoft\\Windows\\CurrentVersion\\Run", &hKey); UNICODE_STRING uName; uName.Buffer = L"Test\0Zero"; uName.MaxLen = uName.Length = 9 * sizeof(wchar_t); NTSTATUS status = 0; status = NtSetValueKey( hKey, &uName, 0, REG_SZ, (void*)lpData, DataSize); RegCloseKey(hKey); 

لتنفيذ وظيفة NtSetValueKey ، تحتاج إلى حقوق المسؤول. نتيجة لذلك ، ستظهر قيمة باسم Test \ 0Zero في التسجيل الخاص بك.

سوف يفاجأ بعض مطوري Microsoft أيضًا ، لأن محرر التسجيل القياسي لا يمكنه عرض قيمة التسجيل غير العادية.


القصة الثانية


القصة الثانية التي سأخبرك بها اليوم حدثت عام 2013.

في البداية انحراف صغير. في Kaspersky Lab ، أنا عضو في الفريق الذي ينشئ Kaspersky Rescue Disk من بين أشياء أخرى. لعلاج Windows من نظام التشغيل Linux ، نحتاج إلى تحليل ملفات التسجيل بأنفسنا. وللتحقق من التشغيل الصحيح لهذه الآلية ، نستخدم العديد من الاختبارات. من بينها ، هناك واحد بسيط إلى حد ما:

  • تحت Windows ، نكتب قيم الاختبار في التسجيل.
  • انسخ ملف خلية التسجيل إلى دليل الاختبار.
  • نبدأ البرنامج الذي يقوم بإزالة قيم الاختبار.
  • نقوم بتحميل الأدغال المعدلة في التسجيل للتحقق من الإزالة.

وفي أحد الأيام الجميلة ، قمنا بالتحديث على منضدة اختبار Windows إلى الإصدار 8.1 ، وتوقف الاختبار عن حذف قيم الاختبار. كيف فوجئت. قمت بنسخ الملف مع خلية التسجيل إلى جهاز الكمبيوتر الخاص بي - لا توجد قيم! فكرتي الأولى: أحتاج إلى إضافة مفاتيح متغيرة لاختبار Flush. تمت إضافة مكالمة إلى RegFlushKey ، وأعدت الاختبار - بدون قيم!

اعتقدت أن RegFlushKey لا يعمل. ولكن ، كما اتضح ، كنت على حق جزئي فقط.

كانت الحيلة هي أنه في Windows 8.1 ، قامت Microsoft بتغيير آلية حفظ التغييرات على التسجيل. في السابق ، كانت جميع تغييرات التسجيل متراكمة في الذاكرة ، وبعد ذلك ، عندما تم إغلاق المفتاح ، عند تنفيذ RegFlushKey أو بعد مرور بعض الوقت ، قام النظام بحفظ التغييرات في ملف خلية التسجيل. في Windows 8.1 ، يتم حفظ التغييرات بدلاً من ملف شجيرة التسجيل في ملفات تحمل نفس الاسم مع الملحقات .LOG و .LOG1 و .LOG2 ، وتجاهل رمزي هذه الملفات في تلك الأيام.

في هذه الملفات ، تتراكم التغييرات لمدة ساعة تقريبًا. وبعد ذلك فقط ، يبدأ Windows مهمة دمج التغييرات في الملف الرئيسي. تسمى هذه المهمة المصالحة ، وتبدأ إما كل 40 دقيقة ، أو عند إيقاف تشغيل Windows. لا يؤدي استدعاء دالة RegFlushKey إلى تشغيل مهمة التسوية. لفرض بدء مهمة دمج التغيير ، تحتاج إلى استدعاء ZwSetSystemInformation مع الوسيطة غير الموثقة SystemRegistryReconcilInformation.

 ZwSetSystemInformation( 0x9b, //SystemRegistryReconciliationInformation NULL, 0); 

لتنفيذ وظيفة ZwSetSystemInformation ، تحتاج إلى حقوق المسؤول. ويجب أن تتطابق بنية الملف القابل للتنفيذ مع بنية النظام. سيفشل استدعاء هذه الوظيفة من برنامج 32 بت على Windows 64 بت.

القصة الثالثة


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

قام برنامج تشغيل rootkit ، عند بدء التشغيل ، بإعادة تسمية ملف خلية تسجيل النظام إلى HARDWARE. لقد أنشأت ملف SYSTEM الخاص بي وقمت بحفظ فرع HKLM / System بشكل دوري إليه باستخدام وظيفة RegSaveKey. عند الحفظ ، أعاد مفاتيحه. عند إعادة تشغيل Windows ، قام النظام بتحميل ملف النظام وتشغيل برنامج تشغيل rootkit. هل هي جميلة؟ جميل

مطلوب


ملاحظة: نحن نبحث عن مطور باحث في فريق يشهد محركًا لمكافحة البريد العشوائي ، ونحتاج أيضًا إلى مهندس اختبار .

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


All Articles