• 8633
  • 0
  • 1
Нравится блог?
Подписывайтесь!

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

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

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

Таблица:
Поле/ФС                     FAT   FAT32   NTFS
Метка тома             0×2B   0×47    ?
Файловая система    0×36   0×52   0×3
Серийный номер       0×27   0×43    0×48

В приведенной таблице показаны основные файловые системы и соответствующие для них смещения. Оперируя этой информацией мы и будем реализовывать нашу программу. На необходимо реализовать следующие функции:
• DiskOpen - открыть диск
• DiskClose - закрыть диск
• ReadSector - прочитать сектор
• WriteSector - записать сектор
Реализовывать нашу программу мы будем С++ под семейство Windows NT. В частности, в среде разработки С++ Builder 6. Нам понадобиться глобальная переменная, в которой будем хранить указатель на используемый диск:

HANDLE hD;


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

bool DiskOpen(char *vol)
{
char szDrive[10];
sprintf(szDrive, ".%c:", vol[0]);
hD = CreateFile(
szDrive,
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ | FILE_SHARE_WRITE,
NULL,
OPEN_EXISTING,
0,
NULL);
return hD != INVALID_HANDLE_VALUE;
}


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

void DiskClose()
{
if (hD != INVALID_HANDLE_VALUE)
CloseHandle(hD);
}


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

bool ReadSector (DWORD sector, char *Buffer, int sectorSize)
{
DWORD read = 0;

if (SetFilePointer(hD, sector, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
return false;

if (!ReadFile(hD, Buffer, sectorSize, &read, NULL))
return false;
return true;
}


Эта функция уже посложней. Исользует 3 параметра:
• первый - указатель на диск.
• второй - буфер, куда будут записаны данные, считанные из загрузочной области.
• третий - размер загрузочной области, а следовательно и буфера.
Функция переводит указатель смещения в файле на нужную позицию с помощью API-функции SetFilePointer(), а потом с помощью ReadFile() считывает в буфер данные из загрузочной области (подробней о ReadFile() можно прочитать в статье “WinAPI: Работа с файлами (основные функции)“). В случае успеха возвращает “истину”, иначе - “ложь”.
И последняя функция WriteSector():

bool WriteSector(DWORD sector, char *Buffer, int sectorSize)
{
DWORD wrote = 0;

if (SetFilePointer(hD, sector, NULL, FILE_BEGIN) == INVALID_SET_FILE_POINTER)
return false;

if (!WriteFile(hD, Buffer, sectorSize, &wrote, NULL))
return false;

return true;
}


Эта функция аналогична предыдущей. Только вместо API-функции ReadFile() используется WriteFile() (подробней о WriteFile() можно прочитать в статье “WinAPI: Работа с файлами (основные функции)“). В случае успеха возвращает “истину”, иначе - “ложь”.
Ну что, базовые функции мы реализовали, пора приступить и к завершающей стадии. Скинем на форму 1 кнопку, 1 поле ввода (сюда будем вводить новый серийный номер), и 1 ComboBox (определим выбор основных букв дисков). И для кнопки опишем следующий код:

void __fastcall TForm1::Button1Click(TObject *Sender)
{
//проверяем не пусты ли необходимые поля
if ((ComboBox1->Text !="") && (Edit1->Text !=""))
{
DWORD newSerial = StrToInt(Edit1->Text);
const max_pbsi = 3;
//определяем структуру для сигнатуры загрузочной области
struct partial_boot_sector_info
{
LPSTR Fs; // название файловой системы
DWORD FsOffs; // смещение системного имени в загрузочной области
DWORD SerialOffs; // смещение серийного номера в загрузочной области
};
//описываем часто используемые сигнатуры
partial_boot_sector_info pbsi[max_pbsi] =
{
{"FAT32", 0x52, 0x43},
{"FAT", 0x36, 0x27},
{"NTFS", 0x03, 0x48}
};
//инициализируем необходимые переменные
TCHAR Drive[12]={0};
char Sector[512];
DWORD i;
sprintf(Drive, "%s:", ComboBox1->Text);
//открываем диск
if (!DiskOpen(Drive))
{//если ошибка оповещаем пользователя и выходим из процелуры
Application->MessageBoxA("Невозможно открыть диск!","Ошибка");
return;
}

// читаем загрузочную область
if (!ReadSector(0, Sector,512))
{
Application->MessageBoxA("Невозможно считать данные","Ошибка");
return;
}

// посик сигнатуры загрузочной области
for (i=0;i= max_pbsi)
{
Application->MessageBoxA("Невозможно сменить номер для этой файловой системы!","Ошибка");
return;
}

// меняем номер
*(PDWORD)(Sector+pbsi[i].SerialOffs) = newSerial;

// записываем в загрузочную область
if (!WriteSector(0, Sector,512))
{
Application->MessageBoxA("Невозможно записать на диск!","Ошибка");
return;
}
DiskClose();
Application->MessageBoxA("Серийный номер успешно изменен! Необходимо перезагрзить компьютер.","Внимание");
}else
Application->MessageBoxA("Не указан диск или серийный номер!","Внимание");
}


Если Вы меняете серийный номер тома флешки, то компьютер перезагружать не обязательно, достаточно отключить и заново подключить флешку. В других случаях результат буде виден только после перезагрузки. На этом всё, замечания и вопросы можете высказать на форуме. Спасибо за внимание! ;)
Рабочий пример скачать (http://depositfiles.com/files/3vg3psz21).
Рекомендуемые статьи для прочтения:
WinAPI: Работа с файлами (основные функции).
WinAPI: Определение типа носителя и его серийного номера.

Обучение взлому и программированию

huzrus
3 февраля 2013, 21:33
591

Загрузка...
Loading...

Комментарии

Оставьте свой комментарий

Спасибо за открытие блога в Yvision.kz! Чтобы убедиться в отсутствии спама, все комментарии новых пользователей проходят премодерацию. Соблюдение правил нашей блог-платформы ускорит ваш переход в категорию надежных пользователей, не нуждающихся в премодерации. Обязательно прочтите наши правила по указанной ссылке: Правила

Также можно нажать Ctrl+Enter

Популярные посты

До каких пор чиновники будут игнорировать защиту детей?

До каких пор чиновники будут игнорировать защиту детей?

До каких пор Уполномоченный по правам ребенка, как институт во всем мире стоящий на страже жизни и прав детей, в нашей стране будет выполнять представительские функции?
AliyaSadyrbaeva
25 июля 2017 / 18:27
  • 10539
  • 6
Зачем эмигрировать в Россию? Лично я никогда не понимал этой странной мечты

Зачем эмигрировать в Россию? Лично я никогда не понимал этой странной мечты

Некоторые мои знакомые, мечтают уехать в Россию и побыстрее получить гражданство. Кому мы там сдались? Есть замечательная поговорка: "Где родился - там и пригодился".
Washington
25 июля 2017 / 12:15
Что происходит в казахстанской правоохранительной системе под видом борьбы с коррупцией

Что происходит в казахстанской правоохранительной системе под видом борьбы с коррупцией

За день до своей гибели прямо около памятника жертвам политических репрессий 1937-го Жампозов сказал жене, что он – жертва точно таких же репрессий.
openqazaqstan
24 июля 2017 / 10:18
  • 3398
  • 12
Если вам отвечают на казахском языке – ситуация с точки зрения законодательства

Если вам отвечают на казахском языке – ситуация с точки зрения законодательства

Я своим постом не собираюсь критиковать кого-либо, что люди знают или не знают казахский или русский язык. Я выражаю своё мнение с точки зрения законодательства о языках.
Advokot
25 июля 2017 / 13:50
  • 3132
  • 31
Мужчины Люксембурга и Казахстана: «У нас они уже в 35 добиваются статуса»

Мужчины Люксембурга и Казахстана: «У нас они уже в 35 добиваются статуса»

Что касается парней, так это вообще отдельная тема. Они для меня загадка. Уже год пытаюсь понять ход их мыслей. Для нас, казахов, немного сложно понять, почему человек в 35-36 лет, до сих пор не нашел смысла жизни.
AASh
24 июля 2017 / 15:19
  • 2326
  • 23
Легендарный вокалист «Linkin Park» унёс за собой молодость десятков тысяч людей

Легендарный вокалист «Linkin Park» унёс за собой молодость десятков тысяч людей

Самое грустное, что, как и всегда в таких случаях, скоро на Честера начнут изливаться потоки грязи - что он был наркоманом, или что-то подобное (как в случае со многими знаменитостями).
demonica
21 июля 2017 / 15:13
  • 2025
  • 51
Алматы глазами астанчанки: «У вас жара за 30! Вы не то, что южные – вы Африка!»

Алматы глазами астанчанки: «У вас жара за 30! Вы не то, что южные – вы Африка!»

Все дороги ведут в Алматы. Хотелось бы поспорить, учитывая, как я насмешливо провожала друзей или коллег, которые покидали родную Астанушечку и переезжали «на юг».
SogdiK
21 июля 2017 / 18:25
  • 1887
  • 34
Лечиться нельзя умереть. Страшно, когда запятая поставлена якобы «законом бога»

Лечиться нельзя умереть. Страшно, когда запятая поставлена якобы «законом бога»

Стало известно о смерти четырехлетней Виктории Сусаевой. Отец девочки намерен подать на бывшую супругу в суд, так как уверен, что в смерти дочери виноваты ее религиозные воззрения.
lyalusha
21 июля 2017 / 14:35
  • 1558
  • 16
Королева пепла. Рекап 2 серии 7 сезона сериала «Игра престолов»

Королева пепла. Рекап 2 серии 7 сезона сериала «Игра престолов»

Всем привет! Продолжаем традиционную серию рекапов, посвящённых, пожалуй, главному сериалу современности - "Игре престолов". Спойлеры обязательны, иначе и быть не может!
Seattle
25 июля 2017 / 16:15
  • 1451
  • 21