WinAPI: Смена серийного номера тома

В статье «WinAPI: Определение типа носителя и его серийного номера» я показывал простой пример как реализовать защиту программ путем привязки к железу. Но все бы хорошо, да только бывают моменты когда просто необходимо «отвязаться» от железки. С такой проблемой столкнулся sansan (участник форума, который сейчас недоступен). Собственно, благодаря ему и была написана эта статья.

Ну а теперь от слов к делу. Вся информация для корректной работы накопителя хранится в его загрузочной области. Нас будет интересовать используемая файловая система, от которой зависит расположения нужных байт относительно начала загрузочной области. Поэтому основная наша задача это определить тип файловой системы, и сместившись на нужный адрес переписать значение серийного номера. Всё просто. Изучим таблицу.
Таблица:

Поле/ФС FAT FAT32 NTFS
Метка тома 0x2B 0x47 ?
Файловая система 0x36 0x52 0x3
Серийный номер 0x27 0x43 0x48

В приведенной таблице показаны основные файловые системы и соответствующие для них смещения. Оперируя этой информацией мы и будем реализовывать нашу программу. На необходимо реализовать следующие функции:

  • DiskOpen — открыть диск
  • DiskClose — закрыть диск
  • ReadSector — прочитать сектор
  • WriteSector — записать сектор

Реализовывать нашу программу мы будем С++ под семейство Windows NT. В частности, в среде разработки С++ Builder 6. Нам понадобиться глобальная переменная, в которой будем хранить указатель на используемый диск:

Начнем с описания функции DiskOpen():

Данной функции в качестве параметра передаётся буква диска, которому нужно сменить серийный номер. С помощью API-функции CreateFile(), мы получаем указатель на диск (подробней о CreateFile можно прочитать в статье «WinAPI: Работа с файлами (основные функции)»). В случае успеха возвращает «истину», иначе — «ложь».

Далее опишем функцию DiskClose():

Эта функция достаточно простая, она освобождает используемый указатель на диск.

Следующая функция ReadSector():

Эта функция уже посложней. Использует 3 параметра:

  • первый — указатель на диск;
  • второй — буфер, куда будут записаны данные, считанные из загрузочной области;
  • третий — размер загрузочной области, а следовательно и буфера.

Функция переводит указатель смещения в файле на нужную позицию с помощью API-функции SetFilePointer(), а потом с помощью ReadFile() считывает в буфер данные из загрузочной области. В случае успеха возвращает «истину», иначе — «ложь».

И последняя функция WriteSector():

Эта функция аналогична предыдущей. Только вместо API-функции ReadFile() используется WriteFile(). В случае успеха возвращает «истину», иначе — «ложь».

Ну что, базовые функции мы реализовали, пора приступить и к завершающей стадии. Скинем на форму 1 кнопку, 1 поле ввода (сюда будем вводить новый серийный номер), и 1 ComboBox (определим выбор основных букв дисков). И для кнопки опишем следующий код:

Если Вы меняете серийный номер тома флешки, то компьютер перезагружать не обязательно, достаточно отключить и заново подключить флешку. В других случаях результат буде виден только после перезагрузки. На этом всё, спасибо за внимание!

Понравилась статья? Поделиться с друзьями:
Комментариев: 4
  1. Влад

    Как с Вами связаться?

    1. lizz

      В каких целях интересуетесь? :)

      Пишите в комментарии, если что-то дельное — я постараюсь передать автору статьи.

      1. Ruslan

        А можно пример этого кода на делфи (паскаль)

        1. lizz

          Увы, но нет.

Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: