مرة أخرى حول تجريدات holey (أو عن بيئة غير متوقعة)

لذلك ، جزء بسيط إلى حد ما من برنامج ويندوز. هناك ملف يحتوي على عدة إدخالات. وهم بحاجة إلى التصفية بطريقة معينة.

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

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

نبدأ الحفر. تم العثور على الدليل الأول: أثناء عملية الحفر ، تم تنبيه هذا الاقتباس من وثائق Microsoft:
الدالة DeleteFile علامات ملف للحذف على مقربة. لذلك ، لا يتم حذف الملف حتى يتم إغلاق المؤشر الأخير للملف. فشل المكالمات اللاحقة إلى CreateFile لفتح الملف مع ERROR_ACCESS_DENIED.
فيما يتعلق بالأعراض ، فهي متشابهة إلى حد كبير ، لكن من أين يأتي هؤلاء "المناصرون الآخرون" ، إذا كان أحدنا ، بصرف النظر عنا ، لا يفعل ولا يجب أن يفعل أي شيء بهذا الملف؟ وليس لدينا أي مؤشرات ترابط أخرى مع مؤشرات ترابط من شأنها أن تفعل شيئا مع هذا الملف؟

تم العثور على الجاني بفضل SysInternals و ProcessMonitor الخاصة بهم. نطلقه ونثبت المرشح على ملفنا الذي طالت معاناته ونحاول إعادة إنتاجه لفترة طويلة ومستمرة. نحن تتكاثر. نحن ننظر. وماذا نرى هناك؟
01.2: 30: 28.3162097 PM our_prog.exe 1288 CreateFile our.file SUCCESS الوصول المرغوب: القراءة / الكتابة العامة
02.2: 25: 28.3164513 PM our_prog.exe 1288 WriteFile our.file SUCCESS إزاحة: 0 ، الطول: 898 ، الأولوية: عادي
...
34.2: 25: 28.3173405 PM our_prog.exe 1288 WriteFile our.file SUCCESS الإزاحة: 35،290 ، الطول: 1،113
35.2: 25: 28.3173493 PM our_prog.exe 1288 WriteFile our.file SUCCESS إزاحة: 36،403 ، الطول: 1،128
36.2: 25: 28.3173736 PM our_prog.exe 1288 FlushBuffersFile our.file SUCCESS
37.2: 25: 28.3174212 PM our_prog.exe 1288 WriteFile our.file SUCCESS الإزاحة: 0 ، الطول: 40،960 ،
38.2: 25: 28.3175927 PM Explorer.EXE 1884 QueryBasicInformationFile our.file SUCCESS
39.2: 25: 28.3176144 PM Explorer.EXE 1884 CloseFile our.file SUCCESS
40.2: 25: 28.3263642 م Explorer.EXE 1884 CreateFile our.file النجاح المطلوب الوصول: قراءة السمات ،
41.2: 25: 28.3294990 PM our_prog.exe 1288 CloseFile our.file SUCCESS
42.2: 25: 28.3351356 PM our_prog.exe 1288 CreateFile our.file SUCCESS الوصول المطلوب: قراءة السمات ، حذف ،
43.2: 25: 28.3351856 PM our_prog.exe 1288 QueryAttributeTagFile our.file SUCCESS السمات: A ، ReparseTag: 0x0
44.2: 25: 28.3352020 PM our_prog.exe 1288 SetDispositionInformationFile our.file SUCCESS حذف: True
45.2: 25: 28.3352218 PM our_prog.exe 1288 CloseFile our.file SUCCESS
46.2: 25: 28.3358275 PM our_prog.exe 1288 CreateFile our.file DELETE PENDING الوصول المطلوب: قراءة / كتابة عامة ،
47.2: 25: 28.3362207 PM our_prog.exe 1288 CreateFile our.file DELETE PENDING الوصول المطلوب: عام القراءة / الكتابة ،
48.2: 25: 28.3367696 PM Explorer.EXE 1884 QueryBasicInformationFile our.file SUCCESS
49.2: 25: 28.4279152 م Explorer.EXE 1884 CloseFile our.file النجاح
50.2: 25: 28.4282859 PM Explorer.EXE 1884 CreateFile our.file NAME NOT FOUND الوصول المطلوب: قراءة السمات ،
...
83.2: 25: 29.3497760 PM our_prog.exe 1288 CreateFile our.file SUCCESS الوصول المطلوب: قراءة / كتابة عامة ،
ونحن نرى ما يلي هناك (تم حذف بيانات إضافية حتى لا تشوش). الأسطر من 1 إلى 36 - نقوم بإنشاء ملف ، والكتابة إليه ، وإحداث تدفق. الأكثر إثارة للاهتمام يبدأ في السطور 38-40. يظهر Explorer.exe من أي مكان ويبدأ في قراءة ملفنا.

في السطر 41 ، نغلق ملفنا. في السطر 42 - حذف. وبما أن explorer.exe لا يزال يقرأها ، لا يتم حذف الملف. ما يمكننا رؤيته في السطور 46 و 47 عندما نحاول إعادة تسمية ملفنا المؤقت إلى الملف الرئيسي (DELETE PENDING status بدلاً من النجاح).

ينتهي Explorer.exe من القراءة فقط على السطر 49. فقط في تلك اللحظة ، يتم حذف الملف فعليًا (حيث يخبرنا السطر 50 بشكل غير مباشر ، حيث يحاول المستكشف المستمر لدينا مرة أخرى فتح الملف للقراءة ، لكنه فشل لأن الملف لم يعد).

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

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

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


All Articles