Немного теории:
Часто хочется оградить свою программу от несанкционированного использования. Для этого есть множество способов но все они естественно имеют не самую простую реализацию. Сегодня я расскажу как оградить вашу программу от использования на другом компьютере. Мы сделаем приложение которое будет привязываться к серийному номеру HDD. В первой части мы напишем программу которая будет показывать серийный номер HDD - его можно будет использовать во второй(защищаемой) программе.
Итак приступим. Самый простой способ получить серийный номер винчестера это функция GetVolumeInfromation:
Как видно из предварительного кода, все выходные параметры, опциональны. (об это свидетельствует пометка __out_opt).
Пройдемся по параметрам:
1. Путь к сканируемому диску.
2. Буфер в который будет возвращено имя диска.
3. Максимальный размер этого буфера.
4. Вот это то что нам надо - серийный номер HDD.
5. Максимальная длина имени файла для данной файловой системы.
6. Это двойное слово на само деле что то вроде флагового регистра, каждый бит в нем что то означает.
7. Буфер для имени файловой системы.
8. Длина этого буфера.
Теперь осталось только приступить к написанию программы.
Поскольку уроки по написанию оконных программ под Win32 уже есть, тут я не буду детализировать объяснения, только добавлю свои примечания.
Опять же ничего примечательного, только добавлена проверка на создание окна. Если hMain равно 0 - приложение завершится. Маловероятно что такое может произойти но все же, такие конструкции что то вроде этикета для кода.
Функция обработки сообщений mainProc:
Код:
LRESULT WINAPI mainProc(HWND hWnd,UINT message,WPARAM wp,LPARAM lp)
{
switch(message)
{
case WM_COMMAND:
{
switch(wp)
{
case bGetSN:
{
char szBuff[260];
sprintf(szBuff,"HDDSN: %u",GetHDDSerial());
SetWindowText(hESN,szBuff);
}break;
}
}break;
case WM_CREATE:
{
InitializeControls(hWnd);
}break;
case WM_CLOSE:
{
PostQuitMessage(0);
}break;
}
return 0;
}
Как видно из кода, при срабатывания события нажатия на нашу кнопку, вызывается функция получения серийного номера HDD, номер записывается в строку и текст в нашем текстовом поле заменяется на тот что находится в szBuff.
При сообщение WM_CREATE срабатывает функция создания контролов. В остальном все обыденно.
Константа %SystemDrive% это такая общая для всей системы ссылка на диск на котором установлена ОС. Допустим установлен у вас Windows на диске С:\ оно и подставит вместо нее путь C:\.
Скомпилируйте и узнайте серийный номер своего HDD - он вам понадобится для следующей части.
Защищенная программа:
Ну а теперь напишем и защищенную программу. Функция WinMain идентична использованной нами в предыдущей программе. Та же участь постигла и функцию GetHDDSerial. Приведу только код функции обработки сообщений.
Как видно из кода, при инициализации формы(тоесть при сообщение WM_CREATE происходит проверка серийного номера винчастера, если проверка неудачна то приложение просто закрывается. При успешной проверке на форме создается надпись.
Вот собственно и все. В заключение приведу исходники обоих программ.
Стоит отметить, что этот способ бесполезен чуть менее, чем полностью, ибо даже новичку не составит труда после часа чтений мануалов найти правильный HardwareID. И (ИМХО) не стоило засорять код длиииинными вызовами апи для создания форм и тп. - проще было бы с использованием всех плюшек вижуал студио сделать для примера - было бы строк 10 кода
Что касается способо то конечно обойти легко, и я тут на форуме об этом писал. А что касается вин апи, не заметил как раздел называется?
________________ Продаю приват читы для AION Absolute, desteny 3.5, Legend, Cataclysm, Ru, EU, NA Продаю многооконку на R2 Пишу читы на заказ под любые игры. Предложения в ЛС. Все мои читы/программы/статьи тут:http://zhyk.ru/forum/showpost.php?p=38501&postcount=21
Ну не весь же код на ВинАпи я когда начинал кодить, с ума сходил, всматриваясь на большооооой такой код других людей (где, в принципе, для сабжа статьи требовалось не более 30 строк). Ну не знаю короче - просто свое сраное мнение высказал =)
Russian_Zarj, хэндлы окон (hWnd). Там нечего рассказывать, в принципе, - это просто идентификаторы окон. Ну, чтоб система могла с ними нормально общаться. Вот. Гугл же.
это заблуждение.
GetVolumeInformation возвращает серийный номер тома.
Который легко меняется на любой тк не привязан к железу (записан в первых секторах).
И может сменится после форматирования
Вот вам первоисточник
[Ссылки могут видеть только зарегистрированные пользователи. ]