Прямий доступ до диска для запису в windows 7

Проект фактично являє собою онлайн сховище вільно поширюваного програмного коду. Свої розробки тут можуть розміщувати всі охочі, а доступ до проектів можна отримати всім користувачам з будь-якої точки світу.







Прямий доступ до диска для запису в Windows 7


Прямий доступ до диска для запису в Windows 7

При розробці програми для захисту флешок від вірусів виникла необхідність запису секторів безпосередньо на диск. Прямий доступ до диска здійснювався через функцію CreateFile. Під Windows XP все працювало нормально, а під Windows 7 при спробі запису сектора поверталася помилка Access Denied, при тому, що при відкритті диска на запис ніяких помилок не виникало. Після тривалих пошуків причини було з'ясовано наступне: ще на самому початку розробки в Windows 7 була виявлена ​​критична уразливість. Якщо не вдаватися в нудні технічні подробиці, то сенс її полягав в тому, що зловмисник міг відкрити системний диск безпосередньо для запису і помістити будь-який зі шкідливим кодом в файл підкачки. У Microsoft вирішили проблему з притаманною їм дубової прямолінійністю - просто взяли і заборонили пряму запис на диски. Але оскільки не можна, але було дуже потрібно, то спосіб обходу захисту знайшовся дуже швидко. Виявляється, що запис на диски заборонена в повному обсязі, система дозволяє записувати дані в нульову доріжку диска і в нерозмічену області. Така поведінка цілком зрозуміло: треба ж якось форматувати диски штатними засобами без додаткових танців з бубнами. Значить для того, щоб система дозволила запис в довільне місце диска, вона спершу повинна визначити його як немарковані. А це досягається знищенням нульового сектора диска перед записом. Природно, що перед знищенням треба зберегти всі дані з нульового сектора в сухому прохолодному місці, а потім повернути їх назад.







Порядок дій наступний: відкрити диск для читання-запису, спробувати записати потрібний сектор. Якщо сталася помилка Access Denied, то треба прочитати нульовий сектор, записати замість нього нулі, після цього обов'язково закрити диск. Це потрібно, щоб система при повторному зверненні порахувала диску залишився і дозволила запис в будь-який сектор. Потім знову відкриваємо диск для читання-запису. Після запису потрібних даних відновлюємо нульовий сектор і закриваємо диск. Все, наша задача виконана, дані записані, система спокійна. У цього способу є і мінуси. Так, якщо робота вашої програми з якоїсь причини завершилася аварійно до моменту, коли вона відновила нульову доріжку, то дані на диску можуть стати недоступними або взагалі загубитися. Спосіб перевірений і добре працює на знімних дисках з файловою системою FAT / FAT32, на стаціонарних жорстких дисках та інших файлових системах я його не перевіряв.

Ось фрагмент коду на Асемблері, взятий з робочого проекту. При необхідності його можна легко перенести на інші мови програмування.

Не дарма кажуть: "Що б російська не робив - все одно виходить автомат Калашникова". Хотів як краще, а в результаті знайшов спосіб як зайвий раз нахилити захист системи :)







Схожі статті